333
schangxiang@126.com
2025-09-19 18966e02fb573c7e2bb0c6426ed792b38b910940
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
  string result = "";
            string saleNum = "";//销售单号
            #region 数据有效性验证
            if (stockQuantity.Count == 0)
            {
                result = "数据为空";
                logtxt.txtWrite("类名:sapWcf,函数名: takeStock:盘点库存SAP传过来的数据为空", 0);
 
                return result;
            }
            if (stockQuantity[0].SaleCode == null)
            {
                logtxt.txtWrite("类名:sapWcf,函数名: takeStock:盘点库存SAP传过来的采购单号为空", 0);
 
                result = "采购单号不能为空";
                return result;
            }
            logtxt.txtWrite("类名:sapWcf,函数名: takeStock:收到盘点库存数据"+stockQuantity.Count+"条数据", 0);
            saleNum = stockQuantity[0].SaleCode;//销售单号
            #endregion
            try
            {
                using (dbModel mod = new dbModel())//productCode
                {
                    DateTime todayTime = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd"));//今天凌晨时间
 
                    //写入前先清空数据,因为之前的盘点数据已没有意义
                    List<TakeStock> isHaveOld = mod.TakeStock.Where(x => x.CreateDate < todayTime).ToList();
                    if (isHaveOld.Count>0)
                    {
                        string sql = "truncate table TakeStock ";
                        mod.Database.ExecuteSqlCommand(sql);
                    }
                    //此采购单的库存数据
                    List<vvBase_ProductPosition> stockInfo = mod.vvBase_ProductPosition.ToList();
                    //SAP传过来的 销售单下数据
                    List<ProductStock> sapInfo = stockQuantity;
                    //和SAP物料相同的 物料索引号集合 记录后 在源数据里删除后记录到盘点表里,--库存里有的sap里没有的
                    List<int> stockQty = new List<int>();
                    //和库存里物料相同的 物料索引号集合 记录后 在源数据里删除后记录到盘点表里,--sap里有的库存里没有的
                    List<int> sapQty = new List<int>();
 
                    #region 写入匹配到的物料
                    for (int i = 0; i < stockInfo.Count; i++)
                    {
 
                        for (int j = 0; j < sapInfo.Count; j++)
                        {
                            //当库存里和sap里的同一采购单下物料一样时,记录到盘点表里, 展示库存数量 和sap数量 PositionType
                            //tracking = trackingFrom.ToString().Split('/')[0];
                            //tracking = tracking.Remove(0, 1);
                            string sapTrankingNumber = stockInfo[i].ExtendField04;
                            if (stockInfo[i].SaleCode == sapInfo[j].SaleCode && stockInfo[i].ExtendField08 == sapInfo[j].SaleItem && stockInfo[i].ProductCode == sapInfo[j].materialCode)
                            {
                                stockQty.Add(i);
                                sapQty.Add(j);
                                TakeStock check = new TakeStock();
                                check.ProcureCode = sapInfo[j].SaleCode;//采购单号
                                check.ProcureItem = sapInfo[j].SaleItem;//采购项号
                                check.MateralCode = sapInfo[j].materialCode;//物料编号
                                check.MateralName = sapInfo[j].materialName;//物料名称
                                check.Unit = sapInfo[j].stockUnit;//SAP单位
                                check.SapQuantity = sapInfo[j].stockQuantity;//SAP数量
                                check.Ex1 = stockInfo[i].SmallUnit;//库存单位
                                check.StockQuantity = stockInfo[i].ProductStorage;//库存数量
                                check.Ex2 = sapInfo[j].isStock == 1 ? "常规货位" : "暂存区";//库存单位
                                check.CreateDate = DateTime.Now;//创建时间
                                mod.TakeStock.Add(check);
                            }
 
                        }
                    }
                    #endregion
 
                    #region 先移除库存里和sap里匹配到已写入的数据
                    if (stockQty.Count > 0)
                    {
                        for (int k = 0; k < stockQty.Count; k++)
                        {
                            stockInfo.Remove(stockInfo[stockQty[k]]);
                        }
                    }
 
                    #endregion
 
                    #region 判断库存里有的,sap里没有的物料,如果有就写入到盘点表里
                    //
                    if (stockInfo.Count > 0)
                    {
                        foreach (var stock in stockInfo)
                        {
                            TakeStock check = new TakeStock();
                            check.ProcureCode = stock.PoCode;//采购单号
                            check.ProcureItem = stock.ExtendField09;//采购项号
                            check.MateralCode = stock.ProductCode;//物料编号
                            check.MateralName = stock.ProductName;//物料名称
                            check.Unit = "";//SAP单位
                            check.SapQuantity = 0;//SAP数量
                            check.Ex1 = stock.ExtendField05;//库存单位
                            check.StockQuantity = stock.ProductStorage;//库存数量
                            check.CreateDate = DateTime.Now;//创建时间
                            mod.TakeStock.Add(check);
                        }
                    }
 
 
                    #endregion
 
                    #region 写入SAP有的库存没有的数据总和
                    //先移除库存里和sap里匹配到已写入的数据
                    if (sapQty.Count > 0)
                    {
                        for (int m = 0; m < sapQty.Count; m++)
                        {
                            sapInfo.Remove(sapInfo[sapQty[m]]);
                        }
                    }
                    //判断有没有库存里有的,sap里没有的物料,如果有就写入到盘点表里
                    if (sapInfo.Count > 0)
                    {
                        foreach (var sapStock in sapInfo)
                        {
                            TakeStock check = new TakeStock();
                            check.ProcureCode = sapStock.SaleCode;//销售单号
                            check.ProcureItem = sapStock.SaleItem;//销售项
                            check.MateralCode = sapStock.materialCode;//物料编号
                            check.MateralName = sapStock.materialName;//物料名称
                            check.Unit = sapStock.stockUnit;//SAP单位
                            check.SapQuantity = sapStock.stockQuantity;//SAP数量
                            check.Ex1 = "";//库存单位
                            check.StockQuantity = 0;//库存数量
                            check.CreateDate = DateTime.Now;//创建时间
                            mod.TakeStock.Add(check);
                        }
                    }
                    #endregion
                    int resultNum = mod.SaveChanges();
                    if (resultNum < 1)
                    {
                        result = "保存失败";
                    }
                }
            }
            catch (Exception ex)
            {
                result += "\r\n" + ex.Message;
            }
 
            return result;