保存发票时报表与数据库仅显示Product ID无商品名称 接口问题排查
问题原因
- 直接原因是你提供的
SaveClientOrder接口保存逻辑中,仅对SalesDetail对象的ProductId、UnitPrice、Quantity、LineTotal四个字段赋值,没有处理商品名称对应的字段,持久化到数据库时自然不会存储商品名称,导致后续报表和数据库查询都只能拿到Product ID。 - 如果你的设计是通过
ProductId关联商品表查询名称,还可以额外排查两个点:一是报表查询逻辑是否没有做SalesDetail和商品表的关联;二是外键关联是否失效,导致无法匹配到商品名称。从你描述数据库中也未展示商品名称来看,基本可以确定是保存阶段未写入该字段导致的问题。
解决方案
根据你的业务设计可以选择两种方案:
方案1:销售明细表冗余存储商品名称(推荐)
发票属于历史财务凭证,冗余存储商品名称可以避免后续商品库中商品名称修改后,历史发票信息同步变更的问题,符合凭证不可篡改的要求,修改方式如下:
- 先确认前端调用接口时传入的
salesDetails列表已经携带商品名称字段(比如属性名为ProductName),如果没有需要先调整前端传参逻辑。 - 修改接口中
SalesDetail对象的赋值逻辑,新增商品名称字段赋值,修改后代码示例:
public JsonResult SaveClientOrder(Sale sale, List<SalesDetail> salesDetails) { NeamahBranch.Helper.AppHelper.ReturnMessage retMessage = new AppHelper.ReturnMessage(); InvoiceBranchs_DBEntities db = new InvoiceBranchs_DBEntities(); retMessage.IsSuccess = true; foreach (var item in salesDetails) { sale.SalesDetails.Add(new SalesDetail { ProductId = item.ProductId, ProductName = item.ProductName, // 新增商品名称赋值 UnitPrice = item.UnitPrice, Quantity = item.Quantity, LineTotal = item.LineTotal }); } db.Sales.Add(sale); retMessage.Messagae = "Save Success!"; try { db.SaveChanges(); } catch (Exception) { retMessage.IsSuccess = false; } return Json(retMessage, JsonRequestBehavior.AllowGet); }
方案2:通过关联商品表查询获取名称
如果你的设计规范不允许冗余存储,不需要修改保存逻辑,调整查询逻辑即可:
- 调整报表的查询SQL/EF逻辑,新增
SalesDetail表和商品表的关联,通过ProductId关联查询得到商品名称后返回。 - 如果需要数据库里也能直接查看带商品名称的销售明细,可以新增关联两张表的数据库视图,直接查询视图即可拿到商品名称。
注意:如果选择方案2,一定要做好商品数据的归档保留,避免商品删除后历史销售明细无法匹配到对应名称的问题。
内容的提问来源于stack exchange,提问作者Mostafa Sayd
相关产品推荐
相关产品推荐

