schangxiang@126.com
2025-09-17 ff43ddf18764629ff875478e4e47a7281cbd230a
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
98
99
using iWareCommon.Utils;
using iWareSql.MyDbContext;
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace Admin.NET.Application
{
    /// <summary>
    /// 库存帮助类
    /// </summary>
    public class InventoryHelper
    {
        /// <summary>
        /// 清理库存
        /// </summary>
        /// <param name="updateDbIds">要更新的数据库库存ID集合</param>
        /// <param name="containerVsMaterialList"></param>
        /// <param name="quantity"></param>
        /// <param name="materialCode">要处理的物料编号</param>
        /// <returns></returns>
        public static (List<ware_container_vs_material> deleteware_container_vs_materialList, List<ware_container_vs_material> updateware_container_vs_materialList, List<ware_container_vs_material> records)
            RemoveInventory(ref List<long> updateDbIds, ref List<ware_container_vs_material> containerVsMaterialList, decimal quantity, string materialCode, string sapLocation)
        {
            List<ware_container_vs_material> deleteware_container_vs_materialList = new List<ware_container_vs_material>();
            List<ware_container_vs_material> updateware_container_vs_materialList = new List<ware_container_vs_material>();
            List<ware_container_vs_material> records = new List<ware_container_vs_material>();
 
            //这里不需要重新赋值!!!! 【Editby shaocx,2023-05-18】
            //按照批次号挨个扣减
            //containerVsMaterialList = containerVsMaterialList.Where(x=>x.WareMaterialCode== wareMaterialCode).OrderBy(x => x.BarNo).ToList();//按照批次号升序排列
            var new_containerVsMaterialList = containerVsMaterialList.Where(x => x.WareMaterialCode == materialCode && x.Sap_Location == sapLocation).OrderBy(x => x.BarNo).ToList();//按照批次号升序排列
            decimal num = quantity;
            foreach (var item in new_containerVsMaterialList)
            {
                if (item.Quantity == item.OCCQuantity)
                {
                    item.IsDeleted = true;//删除库存 ! 【Editby shaocx,2023-05-18】
                    updateDbIds.Add(item.Id);
                    continue;
                }
                if (item.WareMaterialCode != materialCode || item.IsDeleted == true)
                {
                    continue;
                }
                if (num == 0)
                    break;
 
                if (num >= (item.Quantity - item.OCCQuantity))
                {
                    //需要移除该物料数据
                    deleteware_container_vs_materialList.Add(item);
                    item.IsDeleted = true;//删除库存 ! 【Editby shaocx,2023-05-18】
                    num = num - Convert.ToDecimal((item.Quantity - item.OCCQuantity));
 
                    records.Add(new ware_container_vs_material()//这是参数,不是表数据
                    {
                        WareContainerCode = item.WareContainerCode,
                        WareMaterialCode = item.WareMaterialCode,
                        BarNo = item.BarNo,
                        Sap_Location = item.Sap_Location,
                        Quantity = Convert.ToDecimal((item.Quantity - item.OCCQuantity)),
                        RecordInsertTime = item.RecordInsertTime
                    });
                    updateDbIds.Add(item.Id);
                }
                else
                {
                    item.OCCQuantity += num;//更新库存 ! 【Editby shaocx,2023-05-18】
 
                    updateware_container_vs_materialList.Add(item);
                    records.Add(new ware_container_vs_material()//这是参数,不是表数据
                    {
                        WareContainerCode = item.WareContainerCode,
                        WareMaterialCode = item.WareMaterialCode,
                        BarNo = item.BarNo,
                        Sap_Location = item.Sap_Location,
                        Quantity = num,
                        RecordInsertTime = item.RecordInsertTime
                    });
                    updateDbIds.Add(item.Id);
 
                    num = 0;//赋值为0一定要放到最后面!
                    break;
                }
            }
 
            //增加验证 【Editby shaocx,2023-05-18】
            if (num > 0)
            {
                //throw new System.Exception($"扣减库存,物料{materialCode}没有被扣减完全!");
                //记录日志
                Log4NetHelper.WriteErrorLog(LogType.RgvThreadService, $"扣减库存,物料{materialCode}没有被扣减完全!");
            }
 
            return (deleteware_container_vs_materialList: deleteware_container_vs_materialList, updateware_container_vs_materialList: updateware_container_vs_materialList, records: records);
        }
    }
}