wanshenmean
5 天以前 b0327633d7d0c19693a4e577d1e17b3b22e8274e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using WIDESEA_Common.StockEnum;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_IRecordService;
using WIDESEA_Model.Models;
 
namespace WIDESEA_RecordService
{
    /// <summary>
    /// 库存数量变更记录服务实现类
    /// </summary>
    public partial class StockQuantityChangeRecordService : ServiceBase<Dt_StockQuantityChangeRecord, IRepository<Dt_StockQuantityChangeRecord>>, IStockQuantityChangeRecordService
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        public StockQuantityChangeRecordService(IRepository<Dt_StockQuantityChangeRecord> baseDal) : base(baseDal)
        {
        }
 
        /// <summary>
        /// 获取库存数量变更记录仓储接口
        /// </summary>
        public IRepository<Dt_StockQuantityChangeRecord> Repository => BaseDal;
 
        /// <summary>
        /// 记录库存变更。
        /// </summary>
        public async Task<bool> AddChangeRecordAsync(
            Dt_StockInfo? beforeStock,
            Dt_StockInfo? afterStock,
            StockChangeTypeEnum changeType,
            int? taskNum = null,
            string? orderNo = null,
            string? remark = null)
        {
            if (beforeStock == null && afterStock == null)
                return false;
 
            var beforeQuantity = GetStockQuantity(beforeStock);
            var afterQuantity = GetStockQuantity(afterStock);
            var beforeStatus = beforeStock?.StockStatus ?? 0;
            var afterStatus = afterStock?.StockStatus ?? 0;
            int? beforeLocationId = beforeStock?.LocationId > 0 ? beforeStock.LocationId : (int?)null;
            int? afterLocationId = afterStock?.LocationId > 0 ? afterStock.LocationId : (int?)null;
            var beforeLocationCode = beforeStock?.LocationCode;
            var afterLocationCode = afterStock?.LocationCode;
 
            if (beforeQuantity == afterQuantity &&
                beforeStatus == afterStatus &&
                beforeLocationId == afterLocationId &&
                beforeLocationCode == afterLocationCode)
            {
                return true;
            }
 
            var currentStock = afterStock ?? beforeStock!;
            Dt_StockQuantityChangeRecord record = new Dt_StockQuantityChangeRecord
            {
                StockDetailId = currentStock.Id,
                PalleCode = currentStock.PalletCode,
                MaterielCode = GetFirstValue(currentStock.Details?.Select(x => x.MaterielCode)),
                MaterielName = GetFirstValue(currentStock.Details?.Select(x => x.MaterielName)),
                BatchNo = GetFirstValue(currentStock.Details?.Select(x => x.BatchNo)),
                SerilNumber = GetFirstValue(currentStock.Details?.Select(x => x.SerialNumber)),
                OrderNo = orderNo,
                TaskNum = taskNum,
                ChangeType = (int)changeType,
                ChangeQuantity = afterQuantity - beforeQuantity,
                BeforeQuantity = beforeQuantity,
                AfterQuantity = afterQuantity,
                BeforeStatus = beforeStatus,
                AfterStatus = afterStatus,
                BeforeLocationId = beforeLocationId,
                AfterLocationId = afterLocationId,
                BeforeLocationCode = beforeLocationCode,
                AfterLocationCode = afterLocationCode,
                Remark = remark
            };
 
            return await BaseDal.AddDataAsync(record) > 0;
        }
 
        private static float GetStockQuantity(Dt_StockInfo? stockInfo)
        {
            if (stockInfo?.Details == null || !stockInfo.Details.Any())
                return 0;
 
            return stockInfo.Details.Sum(x => x.StockQuantity);
        }
 
        private static string GetFirstValue(IEnumerable<string>? values)
        {
            return values?.FirstOrDefault() ?? string.Empty;
        }
    }
}