using Newtonsoft.Json.Linq; using Newtonsoft.Json; using Rhea.Common; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Tiger.IBusiness; using Tiger.Model; using Tiger.Model.Minsun; using System.Diagnostics; using SqlSugar; using Org.BouncyCastle.Ocsp; namespace Tiger.Business.WMS { public class SrmToWms : ISrmToWms { public static object SrmLock { get; } = new object(); /// /// SRM推送到WMS /// /// /// public ApiAction SrmDlvys(List dlvys) { var action = new ApiAction(); DbClient db = Biz.Db; DateTime runStart = DateTime.Now; var companyId = ""; try { if (dlvys != null && dlvys.Count > 0) { var dlvyList = new List(); var asnList = new List(); var dlvyDtlList = new List(); var dlvySnList = new List(); var deliveryNoList = new List(); var snDic = new Dictionary>(); List srmDlvys = new List(); //Work.DoAsync(() => //{ action = SaveSrmDlvyData(dlvys.Clone()); //异步推到新数据库 //}); return action; foreach (var group in dlvys.Select(q => q.company).Distinct()) { switch (group) { case "XCSJ": db = Biz.DataSource["Main"].Client; break; case "DGXC": db = Biz.DataSource["DGXC"].Client; break; case "AHXC": db = Biz.DataSource["AHXC"].Client; break; } companyId = group; srmDlvys = dlvys.Where(x => x.company == group).ToList(); foreach (var dlvy in srmDlvys) { if (dlvy.documentStatus != "0") { Logger.Scheduler.Info($"QqtSRM({dlvy.company})开始推送到WMS..."); var DeliveryNo = dlvy.documnetNumber; //送货单加入列表供保存时用 deliveryNoList.Add(DeliveryNo); var snList = db.Queryable().Where(q => q.DeliveryNo == DeliveryNo).ToList(); WMS_SRMRcece srmRcece = db.Queryable().Where(q => q.DeliveryNo == DeliveryNo).Single() ?? new(); srmRcece.DeliveryNo = DeliveryNo; srmRcece.Status = dlvy.documentStatus; srmRcece.InnerVendorCode = dlvy.supplierCode; //srmRcece.DeliveryType = dlvy["deliveryType"]?.ToInt32() ?? 0; //srmRcece.LogisticsStatus = dlvy["logisticsStatus"]?.ToString(); //srmRcece.PurchaseType = dlvy["purchaseType"]?.ToInt32() ?? 0; //srmRcece.LastOperateTime = dlvy["lastOperateTime"]?.ToString(); srmRcece.CreationTime = DateTime.Now; srmRcece.LastModificationTime = DateTime.Now; srmRcece.FLAW = "Y"; srmRcece.FLAT = "N"; srmRcece.FLAN = "N"; dlvyList.Add(srmRcece); WMS_SRM_ASN asn = db.Queryable().Where(q => q.DeliveryNo == DeliveryNo).Single() ?? new(); asn.DeliveryNo = DeliveryNo; asn.status = (Convert.ToInt32(dlvy.documentStatus)); asn.innerVendorCode = dlvy.supplierCode; asn.innerVendorName = dlvy.supplierName; //asn.deliveryType = dlvy["deliveryType"]?.ToInt32() ?? 0; //asn.logisticsStatus = dlvy["logisticsStatus"]?.ToInt32() ?? 0; asn.deliveryDate = iSRM.FromUnixTime(Convert.ToInt64(dlvy.deliveryDate)); asn.planArrivedDate = iSRM.FromUnixTime(Convert.ToInt64(dlvy.bookDeliveryDate)); asn.CreationTime = DateTime.Now; asn.LastModificationTime = DateTime.Now; //asn.updateTime = FromUnixTime(dlvy["updateTime"]?.ToInt64()); //asn.grossWeight = dlvy["grossWeight"]?.ToDecimal() ?? 0; //asn.netWeight = dlvy["netWeight"]?.ToDecimal() ?? 0; //asn.totalPackingQty = dlvy["totalPackingQty"]?.ToDecimal() ?? 0; //asn.cargoDeliveryTime = FromUnixTime(dlvy["cargoDeliveryTime"]?.ToInt64()); asn.CreationTime = DateTime.Now; asnList.Add(asn); //循环单身列表 foreach (var item in dlvy.bookDeliveryItems) { WMS_SRM_ASN_LINES dtl = new() { DeliveryNo = DeliveryNo, lineNo = Convert.ToInt32(item.orderItemNumber), //pmdt002 项次 poErpNo = item.orderNumber, poLineNo = item.lotNum, //分批序 pmdt004 purchaseType = Convert.ToInt32(item.purchaseType), productCode = item.materialNumber, //productName = item.productName, //productScale = item.productScale, deliveryQty = Convert.ToDecimal(item.deliveryQuantity), //deliveryUnitCode = item.deliveryUnitCode, deliveryUnitName = item.purchaseUnit, //deliveryValuationQty = Convert.ToInt32(item.deliveryValuationQty), //price = item.price"]?.ToDouble() ?? double.MinValue, //taxPrice = item.taxPrice"]?.ToDouble() ?? double.MinValue, status = Convert.ToInt32(item.itemStatus), extendN01 = item.itemNumber, //pmdtseq //receiveStatus = Convert.ToInt32(item.receiveStatus), //buyerName = item.buyerName, //expectedDate = FromUnixTime(Convert.ToInt64(item.expectedDate)), //answerDate = FromUnixTime(Convert.ToInt64(item.answerDate)), //currencyCode = item.currencyCode, //currencyName = item.currencyName, //sendVerifyStatus = Convert.ToInt32(item.sendVerifyStatus), //resultFlag = item.resultFlag, //remark = item.remark, //brandName = item.brandName, }; dlvyDtlList.Add(dtl); } //循环条码列表 foreach (var item in dlvy.barcodeDetailDatas) { var sn = item.packetBarcodeNumber; WMS_SRMSNList dlvySn = snList.Where(q => q.SmallBarcode == sn).SingleOrDefault() ?? new(); dlvySn.DeliveryNo = DeliveryNo; //dlvySn.BILLCODE = item.poErpNo; //dlvySn.BILLLINE = item.poLineNo; dlvySn.MATERIALCODE = item.materialNumber; dlvySn.SOURCETYPE = "SRM"; //dlvySn.ITEM_NAME = item.productName; //dlvySn.SPECIFICATION = item.productScale; dlvySn.IncludeQty = Convert.ToDecimal(item.materialQuantity); dlvySn.SmallBarcode = item.packetBarcodeNumber; dlvySn.BigBarcode = item.mediumBarcodeNumber; dlvySn.OuterBarcode = item.cartonBarcodeNumber; dlvySn.CreationTime = DateTime.Now; dlvySn.production_date = DateTime.Now; dlvySn.LastModificationTime = DateTime.Now; snList.RemoveAll(q => q.SmallBarcode == sn); dlvySnList.Add(dlvySn); } //将sn列表加入字典 if (!snDic.ContainsKey(DeliveryNo)) { snDic.Add(DeliveryNo, snList); } Logger.Scheduler.Info($"QqtSRM({dlvy.company}) Get Delivery[{DeliveryNo}] Details[{dlvyDtlList.Count}] SN[{dlvySnList.Count}] successful"); } else { action.IsSuccessed = false; action.Message = $"SRM推送送货单状态[{dlvy.documentStatus}]不对"; return action; } } //保存到数据库 var dbTran = db.UseTran(() => { db.Storageable(dlvyList, "system").ExecuteCommand(); db.Storageable(asnList, "system").ExecuteCommand(); if (dlvyDtlList.Any()) { foreach (var d in deliveryNoList) { db.Deleteable().Where(q => q.DeliveryNo == d).ExecuteCommand(); } db.Storageable(dlvyDtlList, "system").ExecuteCommand(); } if (dlvySnList.Any()) { var i = 0; while (dlvySnList.Count > i) { var temp = dlvySnList.Skip(i).Take(500).ToList(); db.Storageable(temp, "system").ExecuteCommand(); i += temp.Count; } } //循环字典内的sn列表有存在的删除 if (snDic.Any()) { foreach (var item in snDic.Keys) { if (snDic[item].Any()) { var i = 0; while (snDic[item].Count > i) { var temp = snDic[item].Skip(i).Take(500).ToList(); db.Deleteable(temp).ExecuteCommand(); i += temp.Count; } } } } }); if (!dbTran.IsSuccess) { throw dbTran.ErrorException; } } } DateTime endTime = DateTime.Now; Logger.Scheduler.Info($"QqtSRM({companyId}) 推送送货单完成,耗时:[{(endTime - runStart).TotalMilliseconds}]"); action.Message = $"SRM推送送货单到WMS成功"; } catch (Exception ex) { Logger.Scheduler.Info($"QqtSRM({companyId}) 推送送货单异常,耗时:[{(DateTime.Now - runStart).TotalMilliseconds}]"); return action.GetResponse().CatchExceptionWithLog(ex, $"SRM To WMS 推送异常"); } return action; } /// /// QqtSRM数据推送到WMS /// /// /// public ApiAction SrmDlvysToWms(List dlvys) { var action = new ApiAction(); DbClient db = Biz.Db; DateTime runStart = DateTime.Now; try { Logger.Scheduler.Info($"QqtSRM开始推送送货单[{string.Join(",", dlvys.Select(x => x.documnetNumber))}]到新WMS..."); var dlvyList = new List(); var dlvyDtlList = new List(); var dlvySnList = new List(); var deliveryNoList = new List(); var snDic = new Dictionary>(); //var pkgs = new List(); //var items = new List(); //var hiss = new List(); foreach (var dlvy in dlvys) { if (dlvy.documentStatus != "0") { //Debug.WriteLine($"Begin1:{DateTime.Now}"); Logger.Scheduler.Info($"New QqtSRM({dlvy.company})开始推送数据..."); var DeliveryNo = dlvy.documnetNumber; //送货单加入列表供保存时用 deliveryNoList.Add(DeliveryNo); var snList = db.Queryable().Where(q => q.DELIVERY_NO == DeliveryNo).ToList(); BIZ_SRM_DLVY _dlvy = db.Queryable().Where(q => q.DELIVERY_NO == DeliveryNo).Single() ?? new() { DELIVERY_NO = DeliveryNo, STATUS = Convert.ToInt32(dlvy.documentStatus), SUPP_CODE = dlvy.supplierCode, HANDLED = 0, SUPP_NAME = dlvy.supplierName, DELIVERY_DATE = iSRM.FromUnixTime(Convert.ToInt64(dlvy.deliveryDate)), PLANARRIVED_DATE = iSRM.FromUnixTime(Convert.ToInt64(dlvy.bookDeliveryDate)), AUTH_ORG = dlvy.company, }; dlvyList.Add(_dlvy); //循环单身列表 var PoNo = dlvy.bookDeliveryItems[0].orderNumber; var dtls = db.Queryable().Where(q => q.DELIVERY_NO == DeliveryNo).ToList(); foreach (var item in dlvy.bookDeliveryItems) { BIZ_SRM_DLVY_DTL dtl = dtls.Where(x => x.ITEM_CODE == item.materialNumber && x.PO_LINE_NO == Convert.ToInt32(item.itemNumber)).FirstOrDefault() ?? new(); dtl.DELIVERY_NO = DeliveryNo; dtl.LINE_NO = Convert.ToInt32(item.orderItemNumber); //pmdt002 项次 dtl.ERP_PO_NO = item.orderNumber; dtl.BATCH_NUMBER = item.lotNum; //分批序 pmdt004 dtl.PO_TYPE = Convert.ToInt32(item.purchaseType); dtl.ITEM_CODE = item.materialNumber; //productName = item.productName, //productScale = item.productScale, dtl.QTY = Convert.ToDecimal(item.deliveryQuantity); dtl.UNIT = item.purchaseUnit; dtl.PRICE = Convert.ToDouble(item.price); dtl.TAX_PRICE = Convert.ToDouble(item.taxPrice); dtl.STATUS = Convert.ToInt32(item.itemStatus); dtl.PO_LINE_NO = Convert.ToInt32(item.itemNumber); //pmdtseq dtl.BUYER = item.buyerName; //receiveStatus = Convert.ToInt32(item.receiveStatus), //expectedDate = FromUnixTime(Convert.ToInt64(item.expectedDate)), //answerDate = FromUnixTime(Convert.ToInt64(item.answerDate)), //currencyCode = item.currencyCode, //currencyName = item.currencyName, //sendVerifyStatus = Convert.ToInt32(item.sendVerifyStatus), //resultFlag = item.resultFlag, //remark = item.remark, //brandName = item.brandName, dtl.AUTH_ORG = dlvy.company; dlvyDtlList.Add(dtl); Logger.Scheduler.Info($"新SRM单身:[{DeliveryNo} - {item.materialNumber}]"); } //循环条码列表 foreach (var item in dlvy.barcodeDetailDatas.OrderBy(x => x.materialNumber)) { var sn = item.packetBarcodeNumber; BIZ_SRM_DLVY_SN dlvySn = snList.Where(q => q.SMALL_BARCODE == sn).SingleOrDefault() ?? new(); dlvySn.DELIVERY_NO = DeliveryNo; //dlvySn.PO_LINE_NO = lineno; dlvySn.ITEM_CODE = item.materialNumber; dlvySn.QTY = Convert.ToDecimal(item.materialQuantity); dlvySn.SMALL_BARCODE = sn; dlvySn.SMALL_SN = sn; dlvySn.BIG_BARCODE = item.mediumBarcodeNumber; dlvySn.BIG_SN = item.mediumBarcodeNumber; dlvySn.OUTER_BARCODE = item.cartonBarcodeNumber; dlvySn.OUTER_SN = item.cartonBarcodeNumber; dlvySn.AUTH_ORG = dlvy.company; dlvySn.PO_ERP_NO = PoNo; dlvySn.IMPORTED = 1; dlvySn.IMPORTED_DATE = DateTime.Now; //dlvySn.PROD_DATE = DateTime.Now; snList.RemoveAll(q => q.SMALL_BARCODE == sn); dlvySnList.Add(dlvySn); Debug.WriteLine(dlvySnList.Count); ////OUTER_SN //if (!dlvySn.OUTER_SN.IsNullOrEmpty() && !pkgs.Any(q => q.SN == dlvySn.OUTER_SN)) //{ // //var pkg = db.Queryable().Where(x => x.SN == dlvySn.OUTER_SN).First() ?? new() { // //}; // pkgs.Add(new WMS_ITEM_PKG() // { // AUTH_ORG = dlvy.company, // SN = dlvySn.OUTER_SN, // PKG_TYPE = dlvySn.OUTER_SN.StartsWith("P") ? WMS_ITEM_PKG.PKG_TYPEs.Pallet.GetValue() : (dlvySn.OUTER_SN.StartsWith("C") ? WMS_ITEM_PKG.PKG_TYPEs.Carton.GetValue() : WMS_ITEM_PKG.PKG_TYPEs.OnePiece.GetValue()), // ITEM_CODE = dlvySn.ITEM_CODE, // QTY = dlvy.barcodeDetailDatas.Where(q => q.cartonBarcodeNumber == dlvySn.OUTER_SN).Sum(q => Convert.ToDecimal(q.materialQuantity)), // TRANS_CODE = nameof(BIZ_SRM_DLVY), // TRANS_NO = dlvySn.DELIVERY_NO, // SUPP_CODE = dlvySn.SUPP_CODE, // }); //} ////BIG_SN //if (!dlvySn.BIG_SN.IsNullOrEmpty() && !pkgs.Any(q => q.SN == dlvySn.BIG_SN)) //{ // pkgs.Add(new WMS_ITEM_PKG() // { // AUTH_ORG = dlvy.company, // SN = dlvySn.BIG_SN, // PARENT_SN = dlvySn.OUTER_SN, // PKG_TYPE = dlvySn.BIG_SN.StartsWith("P") ? WMS_ITEM_PKG.PKG_TYPEs.Pallet.GetValue() : (dlvySn.BIG_SN.StartsWith("C") ? WMS_ITEM_PKG.PKG_TYPEs.Carton.GetValue() : WMS_ITEM_PKG.PKG_TYPEs.OnePiece.GetValue()), // ITEM_CODE = dlvySn.ITEM_CODE, // QTY = dlvy.barcodeDetailDatas.Where(q => q.mediumBarcodeNumber == dlvySn.BIG_SN).Sum(q => Convert.ToDecimal(q.materialQuantity)), // TRANS_CODE = nameof(BIZ_SRM_DLVY), // TRANS_NO = dlvySn.DELIVERY_NO, // SUPP_CODE = dlvySn.SUPP_CODE, // }); //} ////SMALL_SN //if (!dlvySn.SMALL_SN.IsNullOrEmpty() && !pkgs.Any(q => q.SN == dlvySn.SMALL_SN)) //{ // pkgs.Add(new WMS_ITEM_PKG() // { // AUTH_ORG = dlvy.company, // SN = dlvySn.SMALL_SN, // PARENT_SN = dlvySn.BIG_SN, // PKG_TYPE = dlvySn.SMALL_SN.StartsWith("P") ? WMS_ITEM_PKG.PKG_TYPEs.Pallet.GetValue() : (dlvySn.SMALL_SN.StartsWith("C") ? WMS_ITEM_PKG.PKG_TYPEs.Carton.GetValue() : WMS_ITEM_PKG.PKG_TYPEs.OnePiece.GetValue()), // ITEM_CODE = dlvySn.ITEM_CODE, // QTY = dlvySn.QTY, // TRANS_CODE = nameof(BIZ_SRM_DLVY), // TRANS_NO = dlvySn.DELIVERY_NO, // SUPP_CODE = dlvySn.SUPP_CODE, // }); // var newItem = new WMS_ITEM() // { // AUTH_ORG = dlvy.company, // SN = dlvySn.SMALL_SN, // ITEM_CODE = dlvySn.ITEM_CODE, // STATUS = WMS_ITEM.STATUSs.Incoming.GetValue(), // QTY = dlvySn.QTY, // PROD_DATE = dlvySn.PROD_DATE, // TRANS_CODE = nameof(BIZ_SRM_DLVY), // TRANS_LINE = dlvySn.PO_LINE_NO.ToString(), // TRANS_NO = dlvySn.DELIVERY_NO, // SUPP_CODE = dlvy.supplierCode, // CARTON_NO = dlvySn.BIG_SN.StartsWith("C") ? dlvySn.BIG_SN : null, // PALLET_NO = dlvySn.OUTER_SN.StartsWith("P") ? dlvySn.OUTER_SN : null, // IS_LOCKED = "N", // SOURCE_CODE = nameof(BIZ_ERP_PO), // SOURCE_LINE = dlvySn.PO_LINE_NO.ToString(), // SOURCE_ORDER = PoNo, // CREATE_USER = "SRM", // UPDATE_USER = "SRM", // }; // items.Add(newItem); // hiss.Add(new WMS_ITEM_HIS(newItem, $"从供应商送货单获取条码[{dlvySn.SMALL_SN}]数据")); //} } //将sn列表加入字典 if (!snDic.ContainsKey(DeliveryNo)) { snDic.Add(DeliveryNo, snList); } Logger.Scheduler.Info($"New QqtSRM({dlvy.company}) Get Delivery[{DeliveryNo}] Details[{dlvyDtlList.Count}] SN[{dlvySnList.Count}] successful"); //Debug.WriteLine($"End1:{DateTime.Now}"); } else { Logger.Scheduler.Error($"SRM推送送货单状态[{dlvy.documentStatus}]不对"); //action.IsSuccessed = false; //action.Message = $"SRM推送送货单状态[{dlvy.documentStatus}]不对"; //return action; } } DbClient _db = Biz.DataSource["WMS57"].Client; //保存到数据库 var dbTran = _db.UseTran(() => { //DateTime startTime = DateTime.Now; //Debug.WriteLine($"Begin:{startTime}"); _db.Utilities.PageEach(dlvyList, 1000, pageList => { var y = _db.Storageable(pageList, "SRM") .WhereColumns(t => new { t.DELIVERY_NO, t.GHOST_ROW }) .ToStorage(); y.BulkCopy(); y.BulkUpdate(); }); if (dlvyDtlList.Any()) { //foreach (var d in deliveryNoList) { // _db.Deleteable().Where(q => deliveryNoList.Contains(q.DELIVERY_NO)).ExecuteCommand(); } _db.Utilities.PageEach(dlvyDtlList, 1000, pageList => { var y = _db.Storageable(pageList, "SRM") .WhereColumns(t => new { t.DELIVERY_NO, t.ITEM_CODE, t.LINE_NO, t.GHOST_ROW }) .ToStorage(); y.BulkCopy(); y.BulkUpdate(); }); } if (dlvySnList.Any()) { _db.Utilities.PageEach(dlvySnList, 1000, pageList => { var y = _db.Storageable(pageList, "SRM") .WhereColumns(t => new { t.SMALL_SN, t.GHOST_ROW }) .ToStorage(); y.BulkCopy(); y.BulkUpdate(); }); //var i = 0; //while (dlvySnList.Count > i) //{ // var temp = dlvySnList.Skip(i).Take(500).ToList(); // _db.Storageable(temp, "SRM").ExecuteCommand(); // i += temp.Count; // Debug.WriteLine(i); //} } //循环字典内的sn列表有存在的删除 if (snDic.Any()) { foreach (var item in snDic.Keys) { if (snDic[item].Any()) { var i = 0; while (snDic[item].Count > i) { var temp = snDic[item].Skip(i).Take(500).ToList(); _db.Deleteable(temp).ExecuteCommand(); i += temp.Count; } } } } //_db.Utilities.PageEach(pkgs, 1000, pageList => //{ // var x = _db.Storageable(pageList, "SRM") // .WhereColumns(t => new { t.SN, t.GHOST_ROW }) // .ToStorage(); // x.BulkCopy(); // x.BulkUpdate(); //.IgnoreColumns(x => x.ID); //}); //_db.Utilities.PageEach(items, 1000, pageList => //{ // var y = _db.Storageable(pageList, "SRM") // .WhereColumns(t => new { t.SN, t.GHOST_ROW }) // .ToStorage(); // y.BulkCopy(); // y.BulkUpdate(); //}); //_db.Fastest().BulkCopy(hiss);//插入 ////_db.Insertable(hiss, "SRM").ExecuteCommand(); //Debug.WriteLine($"End:{DateTime.Now},耗时:[{(DateTime.Now - startTime).TotalSeconds}]"); }); if (!dbTran.IsSuccess) { //throw dbTran.ErrorException; Logger.Scheduler.Error($"QqtSRM推送新送货单异常,错误:[{dbTran.ErrorException.Message}]"); } foreach (var dlvy in dlvys) { if (dlvy.documentStatus != "0") { try { var bTime = DateTime.Now; Biz.Db.Ado.UseStoredProcedure().ExecuteCommand("pkg_ImportItemFromSRM", new SugarParameter("dlvyNo", dlvy.documnetNumber)); Logger.Scheduler.Info($"New QqtSRM 保存送货单[{dlvy.documnetNumber}]条码导入WMS_ITEM完成,耗时:[{(DateTime.Now - bTime).TotalMilliseconds}]毫秒"); } catch (System.Exception ex) { Logger.Scheduler.Error($"New QqtSRM 保存送货单[{dlvy.documnetNumber}]条码导入WMS_ITEM异常:[{ex.Message}]"); } } } DateTime endTime = DateTime.Now; Logger.Scheduler.Info($"New QqtSRM 推送送货单[{string.Join(",", dlvys.Select(x => x.documnetNumber))}]完成,耗时:[{(endTime - runStart).TotalMilliseconds}]"); } catch (Exception ex) { Logger.Scheduler.Error($"QqtSRM推送新送货单异常,错误:[{ex.Message}]"); } return action; } /// /// 异步推送到新数据库 /// /// private ApiAction SaveSrmDlvyData(List dlvys) { lock (SrmLock) { var action = new ApiAction(); DbClient db = Biz.DataSource["WMS57"].Client; DateTime runStart = DateTime.Now; try { Logger.Scheduler.Info($"QqtSRM开始推送送货单[{string.Join(",", dlvys.Select(x => x.documnetNumber))}]到新WMS..."); var dlvyList = new List(); var dlvyDtlList = new List(); var dlvySnList = new List(); var deliveryNoList = new List(); var snDic = new Dictionary>(); //var pkgs = new List(); //var items = new List(); //var hiss = new List(); foreach (var dlvy in dlvys) { if (dlvy.documentStatus != "0") { //Debug.WriteLine($"Begin1:{DateTime.Now}"); Logger.Scheduler.Info($"New QqtSRM({dlvy.company})开始推送数据..."); var DeliveryNo = dlvy.documnetNumber; //送货单加入列表供保存时用 deliveryNoList.Add(DeliveryNo); var snList = db.Queryable().Where(q => q.DELIVERY_NO == DeliveryNo).ToList(); var statusitem = dlvys.Count(i => i.bookDeliveryItems.Any(a => a.itemStatus != "4")); BIZ_SRM_DLVY _dlvy = db.Queryable().Where(q => q.DELIVERY_NO == DeliveryNo).Single() ?? new() { DELIVERY_NO = DeliveryNo, STATUS = Convert.ToInt32(dlvy.documentStatus), SUPP_CODE = dlvy.supplierCode, HANDLED = 0, SUPP_NAME = dlvy.supplierName, DELIVERY_DATE = iSRM.FromUnixTime(Convert.ToInt64(dlvy.deliveryDate)), PLANARRIVED_DATE = iSRM.FromUnixTime(Convert.ToInt64(dlvy.bookDeliveryDate)), AUTH_ORG = dlvy.company, }; if (statusitem == 0) { _dlvy.STATUS = 4; } dlvyList.Add(_dlvy); //循环单身列表 var PoNo = dlvy.bookDeliveryItems[0].orderNumber; var dtls = db.Queryable().Where(q => q.DELIVERY_NO == DeliveryNo).ToList(); foreach (var item in dlvy.bookDeliveryItems) { BIZ_SRM_DLVY_DTL dtl = dtls.Where(x => x.ITEM_CODE == item.materialNumber && x.PO_LINE_NO == Convert.ToInt32(item.itemNumber)).FirstOrDefault() ?? new(); dtl.DELIVERY_NO = DeliveryNo; dtl.LINE_NO = Convert.ToInt32(item.orderItemNumber); //pmdt002 项次 dtl.ERP_PO_NO = item.orderNumber; dtl.BATCH_NUMBER = item.lotNum; //分批序 pmdt004 dtl.PO_TYPE = Convert.ToInt32(item.purchaseType); dtl.ITEM_CODE = item.materialNumber; //productName = item.productName, //productScale = item.productScale, dtl.QTY = Convert.ToDecimal(item.deliveryQuantity); dtl.UNIT = item.purchaseUnit; dtl.PRICE = Convert.ToDouble(item.price); dtl.TAX_PRICE = Convert.ToDouble(item.taxPrice); dtl.STATUS = Convert.ToInt32(item.itemStatus); dtl.PO_LINE_NO = Convert.ToInt32(item.itemNumber); //pmdtseq dtl.BUYER = item.buyerName; //receiveStatus = Convert.ToInt32(item.receiveStatus), //expectedDate = FromUnixTime(Convert.ToInt64(item.expectedDate)), //answerDate = FromUnixTime(Convert.ToInt64(item.answerDate)), //currencyCode = item.currencyCode, //currencyName = item.currencyName, //sendVerifyStatus = Convert.ToInt32(item.sendVerifyStatus), //resultFlag = item.resultFlag, //remark = item.remark, //brandName = item.brandName, dtl.AUTH_ORG = dlvy.company; dlvyDtlList.Add(dtl); Logger.Scheduler.Info($"新SRM单身:[{DeliveryNo} - {item.materialNumber}]"); } //循环条码列表 foreach (var item in dlvy.barcodeDetailDatas.OrderBy(x => x.materialNumber)) { var sn = item.packetBarcodeNumber; BIZ_SRM_DLVY_SN dlvySn = snList.Where(q => q.SMALL_BARCODE == sn).SingleOrDefault() ?? new(); dlvySn.DELIVERY_NO = DeliveryNo; //dlvySn.PO_LINE_NO = lineno; dlvySn.ITEM_CODE = item.materialNumber; dlvySn.QTY = Convert.ToDecimal(item.materialQuantity); dlvySn.SMALL_BARCODE = sn; dlvySn.SMALL_SN = sn; dlvySn.BIG_BARCODE = item.mediumBarcodeNumber; dlvySn.BIG_SN = item.mediumBarcodeNumber; dlvySn.OUTER_BARCODE = item.cartonBarcodeNumber; dlvySn.OUTER_SN = item.cartonBarcodeNumber; dlvySn.AUTH_ORG = dlvy.company; dlvySn.PO_ERP_NO = PoNo; dlvySn.IMPORTED = 1; dlvySn.IMPORTED_DATE = DateTime.Now; //dlvySn.PROD_DATE = DateTime.Now; snList.RemoveAll(q => q.SMALL_BARCODE == sn); dlvySnList.Add(dlvySn); Debug.WriteLine(dlvySnList.Count); #region MyRegion ////OUTER_SN //if (!dlvySn.OUTER_SN.IsNullOrEmpty() && !pkgs.Any(q => q.SN == dlvySn.OUTER_SN)) //{ // //var pkg = db.Queryable().Where(x => x.SN == dlvySn.OUTER_SN).First() ?? new() { // //}; // pkgs.Add(new WMS_ITEM_PKG() // { // AUTH_ORG = dlvy.company, // SN = dlvySn.OUTER_SN, // PKG_TYPE = dlvySn.OUTER_SN.StartsWith("P") ? WMS_ITEM_PKG.PKG_TYPEs.Pallet.GetValue() : (dlvySn.OUTER_SN.StartsWith("C") ? WMS_ITEM_PKG.PKG_TYPEs.Carton.GetValue() : WMS_ITEM_PKG.PKG_TYPEs.OnePiece.GetValue()), // ITEM_CODE = dlvySn.ITEM_CODE, // QTY = dlvy.barcodeDetailDatas.Where(q => q.cartonBarcodeNumber == dlvySn.OUTER_SN).Sum(q => Convert.ToDecimal(q.materialQuantity)), // TRANS_CODE = nameof(BIZ_SRM_DLVY), // TRANS_NO = dlvySn.DELIVERY_NO, // SUPP_CODE = dlvySn.SUPP_CODE, // }); //} ////BIG_SN //if (!dlvySn.BIG_SN.IsNullOrEmpty() && !pkgs.Any(q => q.SN == dlvySn.BIG_SN)) //{ // pkgs.Add(new WMS_ITEM_PKG() // { // AUTH_ORG = dlvy.company, // SN = dlvySn.BIG_SN, // PARENT_SN = dlvySn.OUTER_SN, // PKG_TYPE = dlvySn.BIG_SN.StartsWith("P") ? WMS_ITEM_PKG.PKG_TYPEs.Pallet.GetValue() : (dlvySn.BIG_SN.StartsWith("C") ? WMS_ITEM_PKG.PKG_TYPEs.Carton.GetValue() : WMS_ITEM_PKG.PKG_TYPEs.OnePiece.GetValue()), // ITEM_CODE = dlvySn.ITEM_CODE, // QTY = dlvy.barcodeDetailDatas.Where(q => q.mediumBarcodeNumber == dlvySn.BIG_SN).Sum(q => Convert.ToDecimal(q.materialQuantity)), // TRANS_CODE = nameof(BIZ_SRM_DLVY), // TRANS_NO = dlvySn.DELIVERY_NO, // SUPP_CODE = dlvySn.SUPP_CODE, // }); //} ////SMALL_SN //if (!dlvySn.SMALL_SN.IsNullOrEmpty() && !pkgs.Any(q => q.SN == dlvySn.SMALL_SN)) //{ // pkgs.Add(new WMS_ITEM_PKG() // { // AUTH_ORG = dlvy.company, // SN = dlvySn.SMALL_SN, // PARENT_SN = dlvySn.BIG_SN, // PKG_TYPE = dlvySn.SMALL_SN.StartsWith("P") ? WMS_ITEM_PKG.PKG_TYPEs.Pallet.GetValue() : (dlvySn.SMALL_SN.StartsWith("C") ? WMS_ITEM_PKG.PKG_TYPEs.Carton.GetValue() : WMS_ITEM_PKG.PKG_TYPEs.OnePiece.GetValue()), // ITEM_CODE = dlvySn.ITEM_CODE, // QTY = dlvySn.QTY, // TRANS_CODE = nameof(BIZ_SRM_DLVY), // TRANS_NO = dlvySn.DELIVERY_NO, // SUPP_CODE = dlvySn.SUPP_CODE, // }); // var newItem = new WMS_ITEM() // { // AUTH_ORG = dlvy.company, // SN = dlvySn.SMALL_SN, // ITEM_CODE = dlvySn.ITEM_CODE, // STATUS = WMS_ITEM.STATUSs.Incoming.GetValue(), // QTY = dlvySn.QTY, // PROD_DATE = dlvySn.PROD_DATE, // FIRST_IN_DATE = DateTime.Now, // TRANS_CODE = nameof(BIZ_SRM_DLVY), // TRANS_LINE = dlvySn.PO_LINE_NO.ToString(), // TRANS_NO = dlvySn.DELIVERY_NO, // SUPP_CODE = dlvy.supplierCode, // CARTON_NO = dlvySn.BIG_SN.StartsWith("C") ? dlvySn.BIG_SN : null, // PALLET_NO = dlvySn.OUTER_SN.StartsWith("P") ? dlvySn.OUTER_SN : null, // IS_LOCKED = "N", // SOURCE_CODE = nameof(BIZ_ERP_PO), // SOURCE_LINE = dlvySn.PO_LINE_NO.ToString(), // SOURCE_ORDER = PoNo, // CREATE_USER = "SRM", // UPDATE_USER = "SRM", // }; // items.Add(newItem); // hiss.Add(new WMS_ITEM_HIS(newItem, $"从供应商送货单获取条码[{dlvySn.SMALL_SN}]数据")); //} #endregion MyRegion } //将sn列表加入字典 if (!snDic.ContainsKey(DeliveryNo)) { snDic.Add(DeliveryNo, snList); } Logger.Scheduler.Info($"New QqtSRM({dlvy.company}) Get Delivery[{DeliveryNo}] Details[{dlvyDtlList.Count}] SN[{dlvySnList.Count}] successful"); //Debug.WriteLine($"End1:{DateTime.Now}"); } else { Logger.Scheduler.Error($"SRM推送送货单状态[{dlvy.documentStatus}]不对"); action.IsSuccessed = false; action.LocaleMsg = Biz.L($"SRM推送送货单状态[{dlvy.documentStatus}]不对"); //return action; } } DbClient _db = Biz.DataSource["WMS57"].Client; //保存到数据库 var dbTran = _db.UseTran(() => { //DateTime startTime = DateTime.Now; //Debug.WriteLine($"Begin:{startTime}"); if (dlvyList.Count > 150) { _db.Utilities.PageEach(dlvyList, 1000, pageList => { var y = _db.Storageable(pageList, "SRM") .WhereColumns(t => new { t.DELIVERY_NO, t.GHOST_ROW }) .ToStorage(); y.BulkCopy(); y.BulkUpdate(); }); } else { var d = _db.Storageable(dlvyList, "SRM") .WhereColumns(t => new { t.DELIVERY_NO, t.GHOST_ROW }) .ToStorage(); d.AsInsertable.ExecuteCommand(); d.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand(); } if (dlvyDtlList.Any()) { //foreach (var d in deliveryNoList) { //_db.Deleteable().Where(q => deliveryNoList.Contains(q.DELIVERY_NO)).ExecuteCommand(); } if (dlvyDtlList.Count > 150) { _db.Utilities.PageEach(dlvyDtlList, 1000, pageList => { var y = _db.Storageable(pageList, "SRM") .WhereColumns(t => new { t.DELIVERY_NO, t.ITEM_CODE, t.PO_LINE_NO, t.GHOST_ROW }) .ToStorage(); y.BulkCopy(); y.BulkUpdate(); }); } else { var l = _db.Storageable(dlvyDtlList, "SRM") .WhereColumns(t => new { t.DELIVERY_NO, t.ITEM_CODE, t.PO_LINE_NO, t.GHOST_ROW }) .ToStorage(); l.AsInsertable.ExecuteCommand(); l.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand(); } } if (dlvySnList.Any()) { if (dlvySnList.Count > 150) { _db.Utilities.PageEach(dlvySnList, 1000, pageList => { var y = _db.Storageable(pageList, "SRM") .WhereColumns(t => new { t.SMALL_SN, t.GHOST_ROW }) .ToStorage(); y.BulkCopy(); y.BulkUpdate(); }); } else { var s = _db.Storageable(dlvySnList, "SRM") .WhereColumns(t => new { t.SMALL_SN, t.GHOST_ROW }) .ToStorage(); s.AsInsertable.ExecuteCommand(); s.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand(); } } //循环字典内的sn列表有存在的删除 if (snDic.Any()) { foreach (var item in snDic.Keys) { if (snDic[item].Any()) { var i = 0; while (snDic[item].Count > i) { var temp = snDic[item].Skip(i).Take(500).ToList(); _db.Deleteable(temp).ExecuteCommand(); i += temp.Count; } } } } //if (pkgs.Count > 150) //{ // _db.Utilities.PageEach(pkgs, 1000, pageList => // { // var x = _db.Storageable(pageList, "SRM") // .WhereColumns(t => new { t.SN, t.GHOST_ROW }) // .ToStorage(); // x.BulkCopy(); // x.BulkUpdate(); //.IgnoreColumns(x => x.ID); // }); //} //else //{ // var x = _db.Storageable(pkgs, "SRM") // .WhereColumns(t => new { t.SN, t.GHOST_ROW }) // .ToStorage(); // x.AsInsertable.ExecuteCommand(); // x.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand(); //} //if (items.Count > 150) //{ // _db.Utilities.PageEach(items, 1000, pageList => // { // var y = _db.Storageable(pageList, "SRM") // .WhereColumns(t => new { t.SN, t.GHOST_ROW }) // .ToStorage(); // y.BulkCopy(); // y.BulkUpdate(); // }); //} //else //{ // var y = _db.Storageable(items, "SRM") // .WhereColumns(t => new { t.SN, t.GHOST_ROW }) // .ToStorage(); // y.AsInsertable.ExecuteCommand(); // y.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand(); //} //if (hiss.Count > 150) //{ // _db.Fastest().BulkCopy(hiss);//插入 //} //else //{ // _db.Insertable(hiss, "SRM").ExecuteCommand(); //} //Debug.WriteLine($"End:{DateTime.Now},耗时:[{(DateTime.Now - startTime).TotalSeconds}]"); }); if (!dbTran.IsSuccess) { //throw dbTran.ErrorException; Logger.Scheduler.Error($"QqtSRM推送新送货单异常,错误:[{dbTran.ErrorException.Message}]"); action.LocaleMsg = Biz.L($"QqtSRM推送新送货单异常,错误:[{dbTran.ErrorException.Message}]"); } DbClient adoDb = Biz.DataSource["WMS57"].Client; foreach (var dlvy in dlvys) { if (dlvy.documentStatus != "0") { try { var bTime = DateTime.Now; adoDb.Ado.UseStoredProcedure().ExecuteCommand("pkg_ImportItemFromSRM", new SugarParameter("dlvyNo", dlvy.documnetNumber)); Logger.Scheduler.Info($"New QqtSRM 保存送货单[{dlvy.documnetNumber}]条码导入WMS_ITEM完成,耗时:[{(DateTime.Now - bTime).TotalMilliseconds}]毫秒"); } catch (System.Exception ex) { Logger.Scheduler.Error($"New QqtSRM 保存送货单[{dlvy.documnetNumber}]条码导入WMS_ITEM异常:[{ex.Message}]"); } } } DateTime endTime = DateTime.Now; Logger.Scheduler.Info($"New QqtSRM 推送送货单[{string.Join(",", dlvys.Select(x => x.documnetNumber))}]完成,耗时:[{(endTime - runStart).TotalMilliseconds}]"); action.LocaleMsg = Biz.L($"New QqtSRM 推送送货单[{string.Join(",", dlvys.Select(x => x.documnetNumber))}]完成,耗时:[{(endTime - runStart).TotalMilliseconds}]"); } catch (Exception ex) { Logger.Scheduler.Error($"QqtSRM推送新送货单异常,错误:[{ex.Message}]"); action.IsSuccessed = false; action.LocaleMsg = Biz.L($"QqtSRM推送新送货单异常,错误:[{ex.Message}]"); } return action; } } } }