POS项目:通过Enum将MaterialInward数据同步至StockDetails的实现问询
POS项目StockDetails报表同步方案示例
核心逻辑梳理
新增入库数据时,将MaterialInwardHeader的MaterialInwardHeaderId作为StockDetails的RefId,从MaterialInwardDetails取ProductId和Quantity,并通过指定枚举(Purchase=1,Return=2,Sale=3)标记交易类型,同步到StockDetails表。
方案1:应用层代码同步(以C# + EF Core为例)
1. 定义交易类型枚举
public enum StockTransactionType { Purchase = 1, Return = 2, Sale = 3 }
2. 同步逻辑实现
假设你已有MaterialInwardHeader、MaterialInwardDetails、StockDetails的EF实体,编写入库并同步的方法:
public async Task ProcessInwardAndSyncStock(MaterialInwardHeader inwardHeader, List<MaterialInwardDetails> inwardDetails, StockTransactionType transType) { using var transaction = await _dbContext.Database.BeginTransactionAsync(); try { // 1. 保存入库头 _dbContext.MaterialInwardHeaders.Add(inwardHeader); await _dbContext.SaveChangesAsync(); // 2. 转换为StockDetails数据 var stockRecords = inwardDetails.Select(detail => new StockDetails { RefId = inwardHeader.MaterialInwardHeaderId, ProductId = detail.ProductId, Quantity = detail.Quantity, TransactionType = (int)transType, TransactionDate = inwardHeader.InwardDate // 用入库头的日期,而非当前时间 // 补充StockDetails其他必填字段 }).ToList(); // 3. 批量插入StockDetails _dbContext.StockDetails.AddRange(stockRecords); await _dbContext.SaveChangesAsync(); await transaction.CommitAsync(); } catch (Exception ex) { await transaction.RollbackAsync(); // 这里添加日志记录或错误抛出逻辑 throw new Exception("入库同步失败", ex); } }
方案2:数据库触发器同步(以SQL Server为例)
如果希望在数据库层面自动同步,可创建触发器:
1. 确保枚举值一致
在数据库中确保MaterialInwardHeader表有TransactionType字段(存储枚举对应的int值),或者在触发器中指定固定类型(比如入库默认是Purchase)。
2. 创建同步触发器
CREATE TRIGGER trg_SyncInwardToStockDetails ON MaterialInwardDetails AFTER INSERT AS BEGIN SET NOCOUNT ON; INSERT INTO StockDetails (RefId, ProductId, Quantity, TransactionType, TransactionDate) SELECT i.MaterialInwardHeaderId, i.ProductId, i.Quantity, h.TransactionType, -- 从入库头取交易类型 h.InwardDate FROM inserted i INNER JOIN MaterialInwardHeader h ON i.MaterialInwardHeaderId = h.MaterialInwardHeaderId; END;
关键注意事项
- 事务一致性:应用层必须用事务包裹所有操作,避免部分数据写入失败导致不一致。
- 枚举匹配:应用层枚举的数值必须和数据库中存储的
TransactionType值严格一致,否则会导致交易类型错误。 - 出库场景处理:如果是Sale类型(出库),需根据业务需求将
Quantity设为负数,便于库存计算。 - 错误日志:无论是应用层还是触发器,都要添加错误日志,方便排查同步失败问题。
内容的提问来源于stack exchange,提问作者user21822616
相关产品推荐
相关产品推荐

