schangxiang@126.com
2025-09-09 3d8966ba2c81e7e0365c8b123e861d18ee4f94f5
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using siemensSapService.orm;
using siemensSapService.aspEntity;
 
using logtxtWrite;
using Newtonsoft.Json;
using System.Diagnostics;
using System.IO;
 
namespace siemensSapService.wcf
{
    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“sapWcf”。
    public class sapWcf : IsapWcf
    {
        /// <summary>
        /// 添加出库单,被 张展的iWareSAP服务调用
        /// </summary>
        /// <param name="sale">要添加的plckList</param>
        /// <returns></returns>
        public string pickList(SaleOrder sale)
        {
            string result = "";
            #region 验证传入参数/合并相同物料
            if (sale.saleChild.Count == 0)
            {
                result = "出库明细数量为0!";
                logtxt.txtWrite("类名:sapWcf,函数名: pickList:收到数量是0", 2);
                return result;
            }
            #region 合并相同物料编号的数据
            //PICKlist child临时变量
            List<SaleOrderList> convertPickLIST = new List<SaleOrderList>();
            //按物料编号分组
            var PickList = sale.saleChild.GroupBy(x => x.materialCode);
            foreach (var convertItem in PickList)
            {
                for (int i = 1; i < convertItem.ToList().Count; i++)
                {
                    //数量合并到第一个
                    convertItem.ToList()[0].exitQty += convertItem.ToList()[i].exitQty;
                }
                convertPickLIST.Add(convertItem.ToList()[0]);
            }
            sale.saleChild = convertPickLIST;
            #endregion
 
            #endregion
            logtxt.txtWrite("类名:sapWcf,函数名: pickList:收到" + sale.saleChild.Count + "条数据", 0);
            try
            {
 
                using (dbModel mod = new dbModel())
                {
                    //出库单号/生成订单号
                    string orderCode = sale.orderNumber;
                    Sale_Order checkList = mod.Sale_Order.FirstOrDefault(x => x.OrderCode == orderCode);
                    List<string> rstPo = sale.saleChild.Select(x => x.materialCode).ToList();
                    //查找物料基础数据  找到po明细物料编号在数据库里有的集合
                    var checkMateria1s = (from p in mod.Base_ProductInfo
                                          where
                                              (from f in rstPo select f).Contains(p.ProductCode)
                                          select p).ToList();
                    //有就修改没有就新建
                    string trackingNum = "";
                    if (checkList != null)
                    {
                        //检查明细有就修改没有就新建
                        List<Sale_OrderList> checkLists = mod.Sale_OrderList.Where(x => x.Order_Id == checkList.Order_Id).ToList();
                        //if (checkLists.Count < 1)
                        //{
                        //    logtxt.txtWrite("类名:sapWcf,函数名: pickList:更新出库单明细为" + sale.saleChild.Count + "条数据", 2);
                        //}
 
                        checkList.MaterialCount = sale.orderQuantity;//出库套数
                        //int unb = 0;//计数
                        foreach (var item in sale.saleChild)
                        {
                            string materialCode = item.materialCode;
                            //unb++;
                            Sale_OrderList isHave = checkLists.FirstOrDefault(x => x.ProductCode == item.materialCode);
 
                            if (isHave != null)
                            {
                                //if (item.materialCode=="A7EQD-5170027509")
                                //{
                                //    decimal aa=item.exitQty;
                                //}
                                #region 修改出库单数据
                                //  isHave.ExtendField06 = item.saleItem;//销售项号
                                isHave.ProductCode = materialCode;//物料编号
                                isHave.SmallUnit = item.stockUnit;//库存单位
                                isHave.ValidQuantity = item.exitQty - isHave.QuantityShipped + isHave.ValidQuantity;//未出库数量 extendField03
                                isHave.QuantityShipped = item.exitQty;//预出库数量 extendField03
                                isHave.ModifyDate = DateTime.Now;
                                isHave.ExtendField09 = item.storageLocation;//G028 库区
                                continue;
                                #endregion
                            }
                            else
                            {
                                #region 新增出库单
                                string materialName = "sapPickList物料";
 
                                long productId = 0;
                                //查询物料找物料ID 没有就新建一个物料
                                Base_ProductInfo checkMateria = checkMateria1s.FirstOrDefault(x => x.ProductCode == materialCode);
                                if (checkMateria != null)
                                {
                                    productId = checkMateria.Product_Id;
                                    materialName = checkMateria.ProductName;
                                }
                                else
                                {
                                    #region 检查物料基础信息里是否有这个物料没有就新建
                                    Base_ProductInfo newMateria = new Base_ProductInfo();
                                    newMateria.ProductCode = materialCode;//物料编号
                                    newMateria.ProductName = materialName;//物料名称
                                    newMateria.SmallUnit = item.stockUnit;//库存单位
                                    newMateria.UnitConvert = 1M;
                                    newMateria.BigUnit = item.stockUnit;//采购单位
                                    newMateria.Enable = 1;//设置为可用
                                    ///////////////
                                    newMateria.Brand_Id = 0;//库存预警量
                                    newMateria.ProductModel = materialCode;
                                    newMateria.Provider_Id = 926;
                                    newMateria.ProviderCode = "PV201940371";
                                    newMateria.ProviderShortName = "默认供应商";
                                    newMateria.Consignor_Id = 30;
                                    newMateria.ConsignorCode = "GX30";
                                    newMateria.ConsignorName = "广州西门子";
                                    newMateria.UserProduct_Id = 1007;
                                    newMateria.UserProductCode = "100000001";
                                    mod.Base_ProductInfo.Add(newMateria);
                                    mod.SaveChanges();
                                    //通过新建获取产品ID
                                    productId = newMateria.Product_Id;
                                    #endregion
                                }
                                if (productId == 0)
                                {
                                    continue;//没这个物料到循环尾
                                }
                                if (trackingNum == "")//一个出库单只有一个跟踪号,只需要匹配一次 
                                {
                                    Purchase_OrderList saleList = mod.Purchase_OrderList.FirstOrDefault(x => x.ExtendField07 == sale.saleCode && x.SpecAlias == item.saleItem);
                                    trackingNum = saleList == null ? "" : saleList.ExtendField04;
                                }
                                int saleItem = 0;
                                bool saleitemis0 = Int32.TryParse(item.saleItem, out saleItem);
                                Sale_OrderList orderList = new Sale_OrderList();
                                orderList.Order_Id = checkList.Order_Id;
                                orderList.ExtendField06 = item.saleItem;//销售项号
                                orderList.ProductCode = materialCode;//物料编号
                                orderList.ProductName = materialName;//物料名称
                                orderList.SmallUnit = item.stockUnit;//库存单位
                                orderList.QuantityShipped = item.exitQty;//预出库数量 extendField03
                                orderList.ValidQuantity = item.exitQty;//未出库数量 extendField03
                                orderList.ExtendField03 = "新建";
                                orderList.ExtendField01 = "261";//移动类型
                                orderList.ExtendField09 = item.storageLocation;//G028 库区
                                orderList.CreateDate = DateTime.Now;
                                orderList.TrackingNumber = saleItem > 0 ? trackingNum : "";//跟踪号
                                orderList.SaleCode = sale.saleCode;//销售单
                                orderList.ExtendField10 = item.batch;//保留项号
                                //不为空的垃圾字段
                                orderList.Product_Id = productId;
                                orderList.ProductModel = materialCode;
                                mod.Sale_OrderList.Add(orderList);
                                #endregion
                            }
                        }
                        int numList = mod.SaveChanges();
                    }
                    else
                    {
                        string productCode = sale.productNumber;
                        Base_ProductInfo findProduct = mod.Base_ProductInfo.FirstOrDefault(x => x.ProductCode == productCode);
                        string productName = "未找到产品名称";
                        if (findProduct != null)
                        {
                            productName = findProduct.ProductName;
                        }
                        Sale_Order saleOrder = new Sale_Order();
                        #region pickList主表
                        saleOrder.OrderCode = orderCode;//出库单号 =生产订单号=提料单号 800开头的号
                        saleOrder.MaterialCount = sale.orderQuantity;//订单出库套数
                        saleOrder.SaleCode = sale.saleCode;//销售单号
                        saleOrder.StoreName = sale.ReservationNumber;//保留号
                        saleOrder.DeptName = productName;//(产品名称)物料描述
                        saleOrder.PriorityNo = 0;//优先级
                        saleOrder.OrderType = "SAP生产订单";//单据类型
                        saleOrder.StorageName = "立体库";
                        saleOrder.StatusID = 1;//状态ID
                        saleOrder.StatusText = "新建";
                        saleOrder.Client_Id = 0;//已出库套数
                        //不可为空垃圾字段
                        saleOrder.Storage_Id = 87;
                        saleOrder.Consignor_Id = 30;
                        saleOrder.ConsignorCode = "HZ20180002";
                        saleOrder.ConsignorName = "默认货主";
                        saleOrder.UserProduct_Id = 1007;
                        saleOrder.CreateID = 1;
                        saleOrder.Creator = "超级管理员";
                        saleOrder.CreateDate = DateTime.Now;
                        #endregion
                        #region 添加明细
 
                        foreach (var item in sale.saleChild)
                        {
                            #region 检查物料基础信息里是否有这个物料没有就新建
                            long productId = 0;
                            string materialCode = item.materialCode;
                            string materialName = "sapPickList物料";
                            //查询物料找物料ID 没有就新建一个物料
                            Base_ProductInfo checkMateria = checkMateria1s.FirstOrDefault(x => x.ProductCode == materialCode);
                            if (checkMateria != null)
                            {
                                productId = checkMateria.Product_Id;
                                materialName = checkMateria.ProductName;
                            }
                            else
                            {
                                #region 新建
                                Base_ProductInfo newMateria = new Base_ProductInfo();
                                newMateria.ProductCode = materialCode;//物料编号
                                newMateria.ProductName = materialName;//物料名称
                                newMateria.SmallUnit = item.stockUnit;//库存单位
                                newMateria.UnitConvert = 1M;
                                newMateria.BigUnit = item.stockUnit;//采购单位
                                newMateria.Enable = 1;//设置为可用
                                ///////////////
                                newMateria.Brand_Id = 0;//库存预警量
                                newMateria.ProductModel = materialCode;
                                newMateria.Provider_Id = 926;
                                newMateria.ProviderCode = "PV201940371";
                                newMateria.ProviderShortName = "默认供应商";
                                newMateria.Consignor_Id = 30;
                                newMateria.ConsignorCode = "GX30";
                                newMateria.ConsignorName = "广州西门子";
                                newMateria.UserProduct_Id = 1007;
                                newMateria.UserProductCode = "100000001";
                                mod.Base_ProductInfo.Add(newMateria);
                                mod.SaveChanges();
                                //通过新建获取产品ID
                                productId = newMateria.Product_Id;
                                #endregion
                            }
                            if (productId == 0)
                            {
                                continue;//没这个物料到循环尾
                            }
                            //查找跟踪号 
                            if (trackingNum == "")//一个出库单只有一个跟踪号只需要匹配一次
                            {
                                Purchase_OrderList saleList = mod.Purchase_OrderList.FirstOrDefault(x => x.ExtendField07 == sale.saleCode && x.SpecAlias == item.saleItem);
                                trackingNum = saleList == null ? "" : saleList.ExtendField04;
                            }
 
                            if (trackingNum != "")
                            {
                                saleOrder.TrackingNumber = trackingNum;
                            }
                            #endregion
                            int saleItem = 0;
                            bool saleitemis0 = Int32.TryParse(item.saleItem, out saleItem);
                            Sale_OrderList orderList = new Sale_OrderList();
                            orderList.ExtendField06 = item.saleItem;//销售项号
                            orderList.ProductCode = materialCode;//物料编号
                            orderList.ProductName = materialName;//物料名称
                            orderList.SmallUnit = item.stockUnit;//库存单位
                            orderList.QuantityShipped = item.exitQty;//预出库数量 extendField03
                            orderList.ValidQuantity = item.exitQty;//未出库数量 extendField03
                            orderList.ExtendField03 = "新建";
                            orderList.ExtendField01 = "261";//移动类型
                            orderList.ExtendField09 = item.storageLocation;//G028 库区
                            orderList.TrackingNumber = saleItem > 0 ? trackingNum : "";//跟踪号 
 
                            orderList.SaleCode = sale.saleCode;//销售单
                            orderList.ExtendField10 = item.batch;//保留项号
                            orderList.CreateDate = DateTime.Now;
                            //不为空的垃圾字段
                            orderList.Product_Id = productId;
                            orderList.ProductModel = materialCode;
                            saleOrder.Sale_OrderList.Add(orderList);
                        }
                        #endregion
                        mod.Sale_Order.Add(saleOrder);
                        int numList = mod.SaveChanges();
                    }
 
 
                }
            }
            catch (Exception ex)
            {
                //logtxt.txtWrite("类名:sapWcf,函数名: pickList:发生异常" + JsonConvert.SerializeObject(sale) + ex.ToString(), 2);
                //logtxt.txtWrite("类名:sapWcf,函数名: pickList:发生异常" + JsonConvert.SerializeObject(sale) + ex.ToString(), 2);
                //logtxt.txtWrite("类名:sapWcf,函数名: pickList:收到" + sale.saleChild.Count + "条数据,出现异常:" + ex.Message + ",堆栈:" + ex.StackTrace, 0);
                logtxt.txtWrite("类名:sapWcf,函数名: pickList:收到" + sale.saleChild.Count + "条数据,出现异常:" + ex.Message, 0);
                result = DateTime.Now.ToString() + "导入出库单异常" + ex.Message;
            }
            logtxt.txtWrite("类名:sapWcf,函数名: pickList:收到" + sale.saleChild.Count + "条数据,执行完毕:" + result, 0);
            return result;
        }
        /// <summary>
        /// 添加物料
        /// </summary>
        /// <param name="material">要添加的物料集合</param>
        /// <returns></returns>
        public string addMaterial(List<Material> materials)
        {
            string result = "";
            try
            {
                if (materials.Count == 0)
                {
                    //return result = "没有传入数据";
                    return result = "";//返回成功 【EditBy shaocx,2022-06-17】
                }
                //记录次数
                using (dbModel mod = new dbModel())
                {
                    int num = 0;
                    foreach (var item in materials)
                    {
                        num++;
                        if (item.materialCode == null)
                        {
                            result += "第" + num + "条数据:物料编号为空\r\n";
                            continue;
                        }
                        string materialCode = item.materialCode;
 
                        Base_ProductInfo checkMateria = mod.Base_ProductInfo.Where(x => x.ProductCode == materialCode).FirstOrDefault();
                        //已存在物料就修改 ,没有就新建
                        if (checkMateria != null)
                        {
                            checkMateria.ProductName = item.materialName;//物料名称
                            checkMateria.Weight = item.weight;//重量
                            checkMateria.BigUnit = item.purchaseUnit;//采购单位
                            checkMateria.SmallUnit = item.stockUnit;//库存单位
                            checkMateria.TypeName = item.Category;//物料类别;
                            checkMateria.Creator = item.creator;//创建人
                            continue;
                        }
                        Base_ProductInfo material = new Base_ProductInfo();
                        material.ProductCode = item.materialCode;//物料编号
                        material.ProductName = item.materialName;//物料名称
                        material.Weight = item.weight;//重量
                        material.TypeName = item.Category;//物料类别;
                        material.Brand_Id = 0;//库存预警量
                        material.BigUnit = item.purchaseUnit;//采购单位
                        material.SmallUnit = item.stockUnit;//库存单位
                        material.Creator = item.creator;//创建人
                        material.CreateDate = DateTime.Now;
                        material.Enable = 1;//启用
                        material.UnitConvert = 1;//单位转换
                        //不为空的垃圾字段
                        material.Provider_Id = 926;
                        material.ProviderCode = "PV201940371";
                        material.ProviderShortName = "默认供应商";
                        material.UserProduct_Id = 1007;
                        material.ProductModel = item.materialCode;
                        material.Consignor_Id = 30;
                        material.ConsignorCode = "GX30";
                        material.ConsignorName = "广州西门子";
                        mod.Base_ProductInfo.Add(material);
                    }
                    mod.SaveChanges();
                }
 
                //writeTxt.writeInfo("addMaterial", INFO);
            }
            catch (Exception ex)
            {
                result += "\r\n" + ex.Message;
            }
            return result;
        }
        /// <summary>
        /// 库存盘点,此接口被张展的iWareSAP所调用
        /// </summary>
        /// <param name="stockQuantity">要核对的数据</param>
        /// <returns>成功返回"",否则返回错误信息</returns>
        public string takeStock(List<ProductStock> stockQuantity)
        {
            //logtxt.txtWrite("类名:sapWcf,函数名: takeStock:收到盘点数据", 0);
            Log4NetHelper.WriteInfoLog(LogType.TakeStock, "收到盘点数据:" + JsonConvert.SerializeObject(stockQuantity));
 
            Stopwatch deviceSw = new Stopwatch();
            deviceSw.Start();//运行计算器开始记时
            List<ProductStock> sapInfo = new List<ProductStock>();
            #region 读取本地SA[库存盘点txt
            //var files = Directory.GetFiles("D:\\log_ShuYing");
            //注意:是按照创建时间降序排列
            var files = Directory.GetFiles("D:\\log_takeStock").OrderByDescending(x => new FileInfo(x).CreationTime).ToList();//盘点存放文件改为 log_takeStock 【EditBy shaocx,2022-10-12】
            if (files.Count < 1)
            {
                //logtxt.txtWrite("类名:sapWcf,函数名: takeStock:收到数据为空 条", 2);
                Log4NetHelper.WriteInfoLog(LogType.TakeStock, "收到数据为空");
                return "";
            }
 
            var filePath = files[0];
            var fileName = Path.GetFileName(filePath);
            using (var reader = new StreamReader(filePath))
            {
                var line = reader.ReadLine();
                if (line.StartsWith("MATNR"))
                {
                    while (!string.IsNullOrEmpty(line))
                    {
                        if (!line.StartsWith("MATNR"))
                        {
                            var spliterChar = Encoding.UTF8.GetString(new byte[] { 9 });
                            var args = line.Split(spliterChar.ToCharArray());
                            if (args[7] == "3TG1" && args[8] == "G021")
                            {
                                try
                                {
                                    ProductStock stock = new ProductStock();
                                    stock.SaleCode = args[11];
                                    if (args[12] == "")
                                    {
                                        stock.SaleItem = args[12];
                                    }
                                    else
                                    {
                                        stock.SaleItem = Convert.ToInt32(args[12]) < 1 ? "" : args[12];
                                    }
                                    stock.materialCode = args[0];
                                    stock.materialName = args[1];
                                    stock.stockUnit = args[6];
                                    stock.stockQuantity = decimal.Parse(args[19]);
                                    sapInfo.Add(stock);
                                }
                                catch (Exception)
                                {
 
                                }
 
                            }
                        }
                        line = reader.ReadLine();
                    }
                }
                else
                {
                    return "";
                }
            }
            #endregion
 
            if (sapInfo.Count < 1)
            {
                //logtxt.txtWrite("类名:sapWcf,函数名: sapInfo:转换数据为空 条", 2);
                Log4NetHelper.WriteInfoLog(LogType.TakeStock, "sapInfo:转换数据为空");
                return "";
            }
            string result = "";
            try
            {
                using (dbModel mod = new dbModel())//productCode
                {
 
                    // DateTime todayTime = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd"));//今天凌晨时间
                    //删除之前的 盘点数据
                    string sql = "truncate table TakeStock ";
                    mod.Database.ExecuteSqlCommand(sql);
 
                    //立库库存数据
                    List<vvBase_ProductPosition> stockInfo = mod.vvBase_ProductPosition.Where(x => x.PositionType == 1 && x.ProductStorage > 0).ToList();
                    #region 合并相同项
                    List<vvBase_ProductPosition> stockInfoMerge = new List<vvBase_ProductPosition>();
                    var merge = stockInfo.GroupBy(x => new { x.SaleCode, x.ExtendField08, x.ProductCode });
                    foreach (var item in merge)
                    {
                        vvBase_ProductPosition temporaryStock = new vvBase_ProductPosition();
                        if (item.ToList().Count > 1)
                        {
 
                            for (int k = 1; k < item.ToList().Count; k++)
                            {
                                temporaryStock.ProductStorage = item.ToList()[0].ProductStorage + item.ToList()[k].ProductStorage;
                            }
                        }
                        else
                        {
                            temporaryStock.ProductStorage = item.ToList()[0].ProductStorage;
                        }
                        temporaryStock.SmallUnit = item.ToList()[0].SmallUnit;
                        temporaryStock.ProductCode = item.ToList()[0].ProductCode;
                        temporaryStock.ProductName = item.ToList()[0].ProductName;
                        temporaryStock.SaleCode = item.ToList()[0].SaleCode;
                        temporaryStock.ExtendField08 = item.ToList()[0].ExtendField08;
                        stockInfoMerge.Add(temporaryStock);
                    }
                    int aa = mod.SaveChanges();
                    #endregion
 
                    //SAP传过来的 销售单下数据
 
                    //立库库存里和sap数据对应的项
                    List<vvBase_ProductPosition> stockInfoIdentical = stockInfoMerge.Where(p => sapInfo.Any(x => x.SaleCode == p.SaleCode &&
                        x.SaleItem == p.ExtendField08 && x.stockQuantity == p.ProductStorage && x.materialCode == p.ProductCode)).ToList();
                    //SAP库存和立库库存里数据对应的项
                    List<ProductStock> sapInfoIdentical = sapInfo.Where(p => stockInfoMerge.Any(x => x.SaleCode == p.SaleCode && x.ExtendField08 == p.SaleItem &&
                        x.ProductStorage == p.stockQuantity && x.ProductCode == p.materialCode)).ToList();
 
                    #region 移除相同项
                    if (stockInfoIdentical.Count > 0)//移除立库库存相同项
                    {
                        logtxt.txtWrite("类名:sapWcf,函数名: takeStock:盘点库存都相同的数据有:" + stockInfoIdentical.Count + "条", 0);
                        foreach (var itemRE in stockInfoIdentical)
                        {
                            stockInfoMerge.Remove(itemRE);
                        }
                    }
                    if (sapInfoIdentical.Count > 0)//移除SAP库存相同项
                    {
                        foreach (var itemRE in sapInfoIdentical)
                        {
                            sapInfo.Remove(itemRE);
                        }
 
                    }
                    #endregion
                    //----------------------------------------------------------------------------------------------------------  
                    //立库库存里和sap跟踪号和物料号对应且数量不对应的项
                    List<vvBase_ProductPosition> stockInfoIdentical2 = stockInfoMerge.Where(p => sapInfo.Any(x => x.SaleCode == p.SaleCode &&
                     x.SaleItem == p.ExtendField08 && x.materialCode == p.ProductCode)).ToList();
                    //SAP库存和立库库存里跟踪号和物料号对应且数量不对应的项
                    List<ProductStock> sapInfoIdentical2 = sapInfo.Where(p => stockInfoMerge.Any(x => x.SaleCode == p.SaleCode &&
                        x.ExtendField08 == p.SaleItem && x.ProductCode == p.materialCode)).ToList();
                    int matching = 0;//记录匹配失败的数量
                    aa = mod.SaveChanges();
                    TakeStock checkStatistics = new TakeStock();
                    checkStatistics.MateralName = "排除相同数据:" + stockInfoIdentical.Count + "条,数量差异数据:" + stockInfoIdentical2.Count + "条, " + "仅立库数据:" + stockInfoMerge.Count +
                        "条, " + "仅SAP数据:" + sapInfo.Count + "条。";
                    checkStatistics.CreateDate = DateTime.Now;//创建时间
                    mod.TakeStock.Add(checkStatistics);
                    int a = mod.SaveChanges();
                    if (sapInfoIdentical2.Count > 0)
                    {
                        #region 移除跟踪号和物料号对应且数量不对应的项
                        if (stockInfoIdentical2.Count > 0)//移除立库库存里和sap跟踪号和物料号对应且数量不对应的项
                        {
                            logtxt.txtWrite("类名:sapWcf,函数名: takeStock:盘点库存都相同的数据有:" + stockInfoIdentical2.Count + "条", 0);
                            foreach (var itemRE in stockInfoIdentical2)
                            {
                                stockInfoMerge.Remove(itemRE);
                            }
                        }
                        if (sapInfoIdentical2.Count > 0)//移除SAP库存和立库库存里跟踪号和物料号对应且数量不对应的项
                        {
                            foreach (var itemRE in sapInfoIdentical2)
                            {
                                sapInfo.Remove(itemRE);
                            }
 
                        }
                        #endregion
                        #region 写入匹配到的物料
 
 
                        for (int j = 0; j < sapInfoIdentical2.Count; j++)
                        {
                            //找出对应的立库库存数量
                            vvBase_ProductPosition stockInfoIdentical22 = stockInfoIdentical2.FirstOrDefault(x => x.ProductCode == sapInfoIdentical2[j].materialCode &&
                                x.SaleCode == sapInfoIdentical2[j].SaleCode && x.ExtendField08 == sapInfoIdentical2[j].SaleItem);
                            if (sapInfoIdentical2 != null)
                            {
                                TakeStock check = new TakeStock();
                                check.ProcureCode = sapInfoIdentical2[j].SaleCode;//采购单号
                                check.ProcureItem = sapInfoIdentical2[j].SaleItem;//采购项号
                                check.MateralCode = sapInfoIdentical2[j].materialCode;//物料编号
                                check.MateralName = sapInfoIdentical2[j].materialName;//物料名称
                                check.Unit = stockInfoIdentical22.SmallUnit;//库存单位
                                check.SapQuantity = sapInfoIdentical2[j].stockQuantity;//SAP数量
                                check.Ex1 = stockInfoIdentical22.SmallUnit;//SAP单位
                                check.StockQuantity = stockInfoIdentical22.ProductStorage;//库存数量
                                // check.Ex2 = sapInfo[j].isStock == 1 ? "常规货位" : "暂存区";//库存单位
                                check.CreateDate = DateTime.Now;//创建时间
                                mod.TakeStock.Add(check);
                            }
                            else
                            {
                                matching++;
                            }
 
                        }
                        if (matching > 0)
                        {
                            logtxt.txtWrite("类名:sapWcf,函数名: takeStock:相同项数量不同写入库存 匹配失败数量:" + matching + "条", 2);
                        }
                        #endregion
                    }
                    mod.SaveChanges();
                    #region 判断库存里有的,sap里没有的物料,如果有就写入到盘点表里
                    //
                    if (stockInfoMerge.Count > 0)
                    {
                        foreach (var stock in stockInfoMerge)
                        {
                            TakeStock check = new TakeStock();
                            check.ProcureCode = stock.SaleCode;//销售单号
                            check.ProcureItem = stock.ExtendField08;//销售项号
                            check.MateralCode = stock.ProductCode;//物料编号
                            check.MateralName = stock.ProductName;//物料名称
                            check.Unit = "";//SAP单位
                            check.SapQuantity = 0;//SAP数量
                            check.Ex1 = stock.SmallUnit;//库存单位
                            check.StockQuantity = stock.ProductStorage;//库存数量
                            check.CreateDate = DateTime.Now;//创建时间
                            mod.TakeStock.Add(check);
                        }
                    }
 
                    mod.SaveChanges();
                    #endregion
 
                    #region 写入SAP有的库存没有的数据总和
 
                    //判断有没有库存里有的,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 = "保存失败";
                    }
                    //logtxt.txtWrite("类名:sapWcf,函数名: takeStock:盘点库存计算时间:" + deviceSw.Elapsed.ToString(), 0);
                    Log4NetHelper.WriteInfoLog(LogType.TakeStock, "类名:sapWcf,函数名: takeStock:盘点库存计算时间:" + deviceSw.Elapsed.ToString());
                    deviceSw.Stop();
 
 
                    //处理成功后,将所有文件删除
                    var remove_files = Directory.GetFiles("D:\\log_takeStock");
                    foreach (var item in remove_files)
                    {
                        File.Delete(item);//文件删除
                    }
                }
            }
            catch (Exception ex)
            {
                //logtxt.txtWrite("类名:sapWcf,函数名: takeStock:异常" + ex.ToString() + ex.StackTrace.ToString(), 2);
                Log4NetHelper.WriteErrorLog(LogType.TakeStock, "类名:sapWcf,函数名: takeStock:异常:" + ex.Message, ex);
                result += "\r\n" + ex.Message;
            }
 
            return result;
 
        }
    }
}