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;
}
}
}
}