You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:22:35