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.Model; using Rhea.Common.Authorization; using Tiger.Model.Minsun; using Tiger.IBusiness; namespace Tiger.Business.WMS { /// /// SRM数据接口 /// public partial class iSRM : IiSRM { public static string GetSign(CommonParam param) { Dictionary jsonDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(param)); string valueStr = ""; foreach (var item in jsonDic.OrderBy(q => q.Key/*, new KeyComparator()*/)) { if (item.Key.ToLower() != "sign") { valueStr += item.Value?.ToString().Trim() + ":"; } } var md5 = Hash.MD5(valueStr + param.GetAppSecret()).ToLower(); return md5; } public static DateTime FromUnixTime(long? timestamp) { var epoch = new DateTime(1970, 1, 1, 0, 0, 0); return timestamp.IsNullOrEmpty() ? DateTime.MinValue : new DateTime((long)timestamp * 10000 + epoch.Ticks).ToLocalTime(); } public static void GetNoList(DateTime start, DateTime end) { var url = "https://openapi.xiekeyun.com/delivery/getNoList.json"; CommonParam apiParam = new CommonParam(); apiParam.sign = GetSign(apiParam); var requestData = new SrmParam() { commonParam = apiParam, body = new GetNoListBody() { startDate = start.ToUnixTime(),//DateTime.Now.AddHours(-2).ToUnixTime(), endDate = end.ToUnixTime(),//DateTime.Now.ToUnixTime(), erpCode = "L39571", } }; var requestJson = JsonConvert.SerializeObject(requestData); try { var response = HttpHelper.PostAsync(url, requestJson).Result; var responseJson = JObject.Parse(response.Message); if (responseJson["result"]?.ToString() == "1") { var dlvyList = new List(); foreach (var item in responseJson["dataList"].Children()) { var dlvyNo = item["deliveryNo"]?.ToString(); WMS_SRMRcece dlvy = Biz.Db.Queryable().Where(q => q.DeliveryNo == dlvyNo).Single() ?? new(); dlvy.DeliveryNo = item["deliveryNo"]?.ToString(); dlvy.Status = item["status"]?.ToString(); dlvy.InnerVendorCode = item["innerVendorCode"]?.ToString(); dlvy.DeliveryType = item["deliveryType"]?.ToInt32() ?? 0; dlvy.LogisticsStatus = item["logisticsStatus"]?.ToString(); dlvy.PurchaseType = item["purchaseType"]?.ToInt32() ?? 0; dlvy.LastOperateTime = item["lastOperateTime"]?.ToString(); dlvy.CreationTime = DateTime.Now; dlvy.LastModificationTime = DateTime.Now; dlvy.FLAW = "N"; dlvy.FLAT = "N"; dlvy.FLAN = "N"; dlvyList.Add(dlvy); } var LastRun = Biz.Db.Queryable().Where(q => q.CodeType == "SRM_Interface" && q.Value == "LastRun").Single(); LastRun.Text = end.ToString("yyyy/MM/dd HH:mm:ss"); //保存到数据库 var db = Business.Biz.Db; var dbTran = db.UseTran(() => { db.Storageable(dlvyList, "system").ExecuteCommand(); db.Storageable(LastRun, "system").ExecuteCommand(); }); if (!dbTran.IsSuccess) { throw dbTran.ErrorException; } Logger.Console.Info($"SRM Get Delivery List[{dlvyList.Count}] from {start:yyyy-MM-dd HH:mm:ss} to {end:yyyy-MM-dd HH:mm:ss} successful"); Logger.Scheduler.Info($"SRM Get Delivery List[{dlvyList.Count}] from {start:yyyy-MM-dd HH:mm:ss} to {end:yyyy-MM-dd HH:mm:ss} successful"); } else { Logger.Scheduler.Error($"SRM送货单接口回复异常: From {start:yyyy-MM-dd HH:mm:ss} to {end:yyyy-MM-dd HH:mm:ss}, Result: {responseJson["result"]?.ToString()}, ErrorCode: {responseJson["errorCode"]?.ToString()}, ErrorMessage: {responseJson["errorMsg"]?.ToString()}, RequestData: {requestJson}"); } } catch (Exception ex) { new ApiAction().CatchExceptionWithLog(ex, $"SRM GetNoList 访问异常[{url}]"); } } public static void GetDetail(WMS_SRMRcece dlvy) { var url = "https://openapi.xiekeyun.com/delivery/getDetail.json"; CommonParam apiParam = new CommonParam(); apiParam.sign = GetSign(apiParam); var requestData = new SrmParam() { commonParam = apiParam, body = new GetDetailBody() { erpCode = "L39571", deliveryNo = dlvy.DeliveryNo, returnVerifyFlag = 1, } }; var requestJson = JsonConvert.SerializeObject(requestData); try { var response = HttpHelper.PostAsync(url, requestJson).Result; var responseJson = JObject.Parse(response.Message); if (responseJson["result"]?.ToString() == "1") { WMS_SRM_ASN asn = Biz.Db.Queryable().Where(q => q.DeliveryNo == dlvy.DeliveryNo).Single() ?? new(); asn.DeliveryNo = dlvy.DeliveryNo; asn.status = responseJson["data"]["status"]?.ToInt32() ?? 0; asn.innerVendorCode = responseJson["data"]["innerVendorCode"]?.ToString(); asn.innerVendorName = responseJson["data"]["innerVendorName"]?.ToString(); asn.deliveryType = responseJson["data"]["deliveryType"]?.ToInt32() ?? 0; asn.logisticsStatus = responseJson["data"]["logisticsStatus"]?.ToInt32() ?? 0; asn.deliveryDate = FromUnixTime(responseJson["data"]["deliveryDate"]?.ToInt64()); asn.planArrivedDate = FromUnixTime(responseJson["data"]["planArrivedDate"]?.ToInt64()); asn.CreationTime = DateTime.Now; asn.LastModificationTime = DateTime.Now; asn.updateTime = FromUnixTime(responseJson["data"]["updateTime"]?.ToInt64()); asn.grossWeight = responseJson["data"]["grossWeight"]?.ToDouble() ?? 0; asn.netWeight = responseJson["data"]["netWeight"]?.ToDouble() ?? 0; asn.totalPackingQty = responseJson["data"]["totalPackingQty"]?.ToDouble() ?? 0; asn.cargoDeliveryTime = FromUnixTime(responseJson["data"]["cargoDeliveryTime"]?.ToInt64()); asn.CreationTime = DateTime.Now; dlvy.FLAW = "Y"; var dlvyDtlList = new List(); var dlvySnList = new List(); var snList = Biz.Db.Queryable().Where(q => q.DeliveryNo == dlvy.DeliveryNo).ToList(); foreach (var item in responseJson["data"]["lineList"].Children()) { WMS_SRM_ASN_LINES dtl = new() { DeliveryNo = dlvy.DeliveryNo, lineNo = item["lineNo"]?.ToInt32() ?? 0, poErpNo = item["poErpNo"]?.ToString(), poLineNo = item["poLineNo"]?.ToString(), purchaseType = item["purchaseType"]?.ToInt32() ?? 0, productCode = item["productCode"]?.ToString(), productName = item["productName"]?.ToString(), productScale = item["productScale"]?.ToString(), deliveryQty = item["deliveryQty"]?.ToDouble() ?? 0, deliveryUnitCode = item["deliveryUnitCode"]?.ToString(), deliveryUnitName = item["deliveryUnitName"]?.ToString(), deliveryValuationQty = item["deliveryValuationQty"]?.ToDouble() ?? 0, price = item["price"]?.ToDouble() ?? double.MinValue, taxPrice = item["taxPrice"]?.ToDouble() ?? double.MinValue, status = item["status"]?.ToInt32() ?? 0, receiveStatus = item["receiveStatus"]?.ToInt32() ?? 0, buyerName = item["buyerName"]?.ToString(), expectedDate = FromUnixTime(item["expectedDate"]?.ToInt64()), answerDate = FromUnixTime(item["answerDate"]?.ToInt64()), currencyCode = item["currencyCode"]?.ToString(), currencyName = item["currencyName"]?.ToString(), sendVerifyStatus = item["sendVerifyStatus"]?.ToInt32() ?? 0, resultFlag = item["resultFlag"]?.ToString(), remark = item["remark"]?.ToString(), brandName = item["brandName"]?.ToString(), }; dlvyDtlList.Add(dtl); } //获取条码明细 var snUrl = "https://openapi.xiekeyun.com/barcode/byDeliveryNo.json"; CommonParam snApiParam = new CommonParam(); snApiParam.sign = GetSign(snApiParam); var snRequestData = new SrmParam() { commonParam = snApiParam, body = new ByDeliveryNoBody() { erpCode = "L39571", deliveryNo = dlvy.DeliveryNo, } }; var snRequestJson = JsonConvert.SerializeObject(snRequestData); var snResponse = HttpHelper.PostAsync(snUrl, snRequestJson).Result; var snResponseJson = JObject.Parse(snResponse.Message); if (snResponseJson["result"]?.ToString() == "1") { foreach (var item in snResponseJson["dataList"].Children()) { var sn = item["smallBarcode"]?.ToString(); WMS_SRMSNList dlvySn = snList.Where(q => q.SmallBarcode == sn).SingleOrDefault() ?? new(); dlvySn.DeliveryNo = dlvy.DeliveryNo; dlvySn.BILLCODE = item["poErpNo"]?.ToString(); dlvySn.BILLLINE = item["poLineNo"]?.ToString(); dlvySn.MATERIALCODE = item["productCode"]?.ToString(); dlvySn.SOURCETYPE = "SRM"; //dlvySn.ITEM_NAME = item["productName"]?.ToString(); //dlvySn.SPECIFICATION = item["productScale"]?.ToString(); dlvySn.IncludeQty = item["includeQty"]?.ToInt32() ?? int.MinValue; dlvySn.SmallBarcode = item["smallBarcode"]?.ToString(); dlvySn.BigBarcode = item["bigBarcode"]?.ToString(); dlvySn.OuterBarcode = item["outerBarcode"]?.ToString(); dlvySn.CreationTime = DateTime.Now; dlvySn.production_date = DateTime.Now; dlvySn.LastModificationTime = DateTime.Now; snList.RemoveAll(q => q.SmallBarcode == sn); dlvySnList.Add(dlvySn); } //var bigs = from q in dlvySnList // group q by new { q.BIG_BARCODE, q.SUPP_CODE } into g // select new // { // Barcode = g.Key.BIG_BARCODE, // SuppCode = g.Key.SUPP_CODE, // Qty = g.Sum(q => q.QTY) // }; //var outers = from q in dlvySnList // group q by new { q.OUTER_BARCODE, q.SUPP_CODE } into g // select new // { // Barcode = g.Key.OUTER_BARCODE, // SuppCode = g.Key.SUPP_CODE, // Qty = g.Sum(q => q.QTY) // }; //foreach (var sn in dlvySnList) //{ // var bigSn = bigs.Where(q => q.Barcode == sn.BIG_BARCODE && q.SuppCode == sn.SUPP_CODE).SingleOrDefault(); // if (!bigSn.IsNullOrEmpty()) // { // sn.BIG_SN = bigSn.Barcode.Replace(bigSn.SuppCode, bigSn.SuppCode.Replace("GY", "")) + // (bigSn.Barcode.EndsWith("_") ? "" : "_") + bigSn.Qty.ToString("00000"); // } // var outerSn = outers.Where(q => q.Barcode == sn.OUTER_BARCODE && q.SuppCode == sn.SUPP_CODE).SingleOrDefault(); // if (!outerSn.IsNullOrEmpty()) // { // sn.OUTER_SN = outerSn.Barcode.Replace(outerSn.SuppCode, outerSn.SuppCode.Replace("GY", "")) + // (outerSn.Barcode.EndsWith("_") ? "" : "_") + outerSn.Qty.ToString("00000"); // } //} } else { //dlvy.HANDLED++; dlvy.FLAW = "N"; Logger.Scheduler.Error($"SRM送货单条码明细接口回复异常: DeliveryNo: {dlvy.DeliveryNo}, Result: {snResponseJson["result"]?.ToString()}, ErrorCode: {snResponseJson["errorCode"]?.ToString()}, ErrorMessage: {snResponseJson["errorMsg"]?.ToString()}, RequestData: {requestJson}"); Logger.Console.Error($"SRM送货单条码明细接口回复异常: DeliveryNo: {dlvy.DeliveryNo}, Result: {snResponseJson["result"]?.ToString()}, ErrorCode: {snResponseJson["errorCode"]?.ToString()}, ErrorMessage: {snResponseJson["errorMsg"]?.ToString()}, RequestData: {requestJson}"); } //保存到数据库 var db = Business.Biz.Db; var dbTran = db.UseTran(() => { var dt = dlvySnList.ToDataTable(); db.Storageable(dlvy, "system").ExecuteCommand(); db.Storageable(asn, "system").ExecuteCommand(); if (dlvyDtlList.Any()) { db.Deleteable().Where(q => q.DeliveryNo == dlvy.DeliveryNo).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; } } if (snList.Any()) { //db.Deleteable(snList).ExecuteCommand(); var i = 0; while (snList.Count > i) { var temp = snList.Skip(i).Take(500).ToList(); db.Deleteable(temp).ExecuteCommand(); i += temp.Count; } } }); Logger.Console.Info($"SRM Get Delivery[{dlvy.DeliveryNo}] Details[{dlvyDtlList.Count}] SN[{dlvySnList.Count}] successful"); Logger.Scheduler.Info($"SRM Get Delivery[{dlvy.DeliveryNo}] Details[{dlvyDtlList.Count}] SN[{dlvySnList.Count}] successful"); } else { Logger.Scheduler.Error($"SRM送货单明细接口回复异常: DeliveryNo: {dlvy.DeliveryNo}, Result: {responseJson["result"]?.ToString()}, ErrorCode: {responseJson["errorCode"]?.ToString()}, ErrorMessage: {responseJson["errorMsg"]?.ToString()}, RequestData: {requestJson}"); } } catch (Exception ex) { new ApiAction().CatchExceptionWithLog(ex, $"SRM 送货单[{dlvy.DeliveryNo}]明细接口异常[{url}]"); } } /// /// 获取SRM送货单及条码列表 /// /// /// public ApiAction GetSRMList(iSrmParams iParams) { var action = new ApiAction(); var rootUrl = iParams.serverId != "55" ? "https://api.51qqt.com" : "https://api-sit.51qqt.com"; var url = $"{rootUrl}/els/openApi/invoke"; var requestData = new GetSrmListBody() { bus_account = "1398210", interface_code = "JK20230411000005", body = new body { data = new data { company = iParams.company, //"XCSJ", startDate = iParams.startDate, endDate = iParams.endDate }, busAccount = "1398210", simpleFlag = "1", interfaceCode = "wmsPullSrmBookDeliveryData" } }; var requestJson = JsonConvert.SerializeObject(requestData); DbClient db = Business.Biz.Db; var _lastrun = ""; switch (iParams.serverId) { case "55": db = Biz.DataSource["Test"].Client; break; case "XCSJ": db = Biz.Db; _lastrun = "QqtLastRun"; break; case "DGXC": db = Biz.DataSource["DGXC"].Client; _lastrun = "QqtLastRun_dgxc"; break; case "AHXC": db = Biz.DataSource["AHXC"].Client; _lastrun = "QqtLastRun_ahxc"; break; } try { GetSecret secret = iParams.serverId != "55" ? new GetSecret {key = "ed3ccc64", secret = "b6178cd87ea4400eb38c0af8ea9d7419" } : new GetSecret(); var token = GetToken(secret, rootUrl); Dictionary dic = new Dictionary() { { "elsAccount", "1398210" }, { "token", token }, { "subAccount", "App_interface" }, { "pwd", "123" } }; var response = HttpHelper.PostAsync(url, requestJson, dic).Result; var responseJson = JObject.Parse(response.Message); if (responseJson["code"]?.ToString() == "200") { action.Message = responseJson["message"]?.ToString(); var data = responseJson["result"]["data"]; var respbody = data["respBody"]; var dlvyList = new List(); var asnList = new List(); var dlvyDtlList = new List(); var dlvySnList = new List(); var deliveryNoList = new List(); var snDic = new Dictionary>(); Logger.Scheduler.Info($"QqtSRM({iParams.company}) Response from {iParams.startDate:yyyy-MM-dd HH:mm:ss} to {iParams.endDate:yyyy-MM-dd HH:mm:ss} successful"); if (!respbody.IsNullOrEmpty()) { //Logger.Scheduler.Info($"SRM Response Json[{respbody}] from {iParams.startDate:yyyy-MM-dd HH:mm:ss} to {iParams.endDate:yyyy-MM-dd HH:mm:ss} successful"); //循环单头列表 foreach (var dlvy in respbody.Children()) { if (dlvy["documentStatus"]?.ToString() != "0") { var DeliveryNo = dlvy["documnetNumber"]?.ToString(); //送货单加入列表供保存时用 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"]?.ToString(); srmRcece.InnerVendorCode = dlvy["supplierCode"]?.ToString(); //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 = (dlvy["documentStatus"]?.ToInt32() ?? 0); asn.innerVendorCode = dlvy["supplierCode"]?.ToString(); asn.innerVendorName = dlvy["supplierName"]?.ToString(); //asn.deliveryType = dlvy["deliveryType"]?.ToInt32() ?? 0; //asn.logisticsStatus = dlvy["logisticsStatus"]?.ToInt32() ?? 0; asn.deliveryDate = FromUnixTime(dlvy["deliveryDate"]?.ToInt64()); asn.planArrivedDate = FromUnixTime(dlvy["bookDeliveryDate"]?.ToInt64()); 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"].Children()) { WMS_SRM_ASN_LINES dtl = new() { DeliveryNo = DeliveryNo, lineNo = item["orderItemNumber"]?.ToInt32() ?? 0, poErpNo = item["orderNumber"]?.ToString(), poLineNo = item["lotNum"]?.ToString(), purchaseType = item["purchaseType"]?.ToInt32() ?? 0, productCode = item["materialNumber"]?.ToString(), //productName = item["productName"]?.ToString(), //productScale = item["productScale"]?.ToString(), deliveryQty = item["deliveryQuantity"]?.ToDouble() ?? 0, //deliveryUnitCode = item["deliveryUnitCode"]?.ToString(), deliveryUnitName = item["purchaseUnit"]?.ToString(), //deliveryValuationQty = item["deliveryValuationQty"]?.ToInt32() ?? 0, //price = item["price"]?.ToDouble() ?? double.MinValue, //taxPrice = item["taxPrice"]?.ToDouble() ?? double.MinValue, status = (item["itemStatus"]?.ToInt32() ?? 0), extendN01 = item["itemNumber"]?.ToString(), //receiveStatus = item["receiveStatus"]?.ToInt32() ?? 0, //buyerName = item["buyerName"]?.ToString(), //expectedDate = FromUnixTime(item["expectedDate"]?.ToInt64()), //answerDate = FromUnixTime(item["answerDate"]?.ToInt64()), //currencyCode = item["currencyCode"]?.ToString(), //currencyName = item["currencyName"]?.ToString(), //sendVerifyStatus = item["sendVerifyStatus"]?.ToInt32() ?? 0, //resultFlag = item["resultFlag"]?.ToString(), //remark = item["remark"]?.ToString(), //brandName = item["brandName"]?.ToString(), }; dlvyDtlList.Add(dtl); } //循环条码列表 foreach (var item in dlvy["barcodeDetailDatas"].Children()) { var sn = item["packetBarcodeNumber"]?.ToString(); WMS_SRMSNList dlvySn = snList.Where(q => q.SmallBarcode == sn).SingleOrDefault() ?? new(); dlvySn.DeliveryNo = DeliveryNo; //dlvySn.BILLCODE = item["poErpNo"]?.ToString(); //dlvySn.BILLLINE = item["poLineNo"]?.ToString(); dlvySn.MATERIALCODE = item["materialNumber"]?.ToString(); dlvySn.SOURCETYPE = "SRM"; //dlvySn.ITEM_NAME = item["productName"]?.ToString(); //dlvySn.SPECIFICATION = item["productScale"]?.ToString(); dlvySn.IncludeQty = item["materialQuantity"]?.ToDouble() ?? int.MinValue; dlvySn.SmallBarcode = item["packetBarcodeNumber"]?.ToString(); dlvySn.BigBarcode = item["mediumBarcodeNumber"]?.ToString(); dlvySn.OuterBarcode = item["cartonBarcodeNumber"]?.ToString(); 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({iParams.company}) Get Delivery[{DeliveryNo}] Details[{dlvyDtlList.Count}] SN[{dlvySnList.Count}] successful"); } } } else { action.Message = "没有数据可导入"; } //保存到数据库 var LastRun = db.Queryable().Where(q => q.CodeType == "SRM_Interface" && q.Value == _lastrun).Single(); LastRun.Text = iParams.endDate; 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; } } } } db.Storageable(LastRun, "system").ExecuteCommand(); }); if (!dbTran.IsSuccess) { throw dbTran.ErrorException; } Logger.Scheduler.Info($"QqtSRM({iParams.company}) Get Delivery List[{dlvyList.Count}] done"); } else { action.Message = "没有数据可导入"; Logger.Scheduler.Error($"SRM送货单接口回复异常: From {iParams.startDate:yyyy-MM-dd HH:mm:ss} to {iParams.endDate:yyyy-MM-dd HH:mm:ss}, Result: {responseJson["result"]?.ToString()}, ErrorCode: {responseJson["errorCode"]?.ToString()}, ErrorMessage: {responseJson["errorMsg"]?.ToString()}, RequestData: {requestJson}"); } } catch (Exception ex) { return action.GetResponse().CatchExceptionWithLog(ex, $"SRM GetSRMList 访问异常[{url}]"); } return action; } /// /// 获取SRM送货单及条码列表 /// /// /// /// public static ApiAction GetSuppDlvy(iSrmParams iParams) { var action = new ApiAction(); var rootUrl = iParams.serverId != "55" ? "https://api.51qqt.com" : "https://api-sit.51qqt.com"; var url = $"{rootUrl}/els/openApi/invoke"; var requestData = new GetSrmListBody() { bus_account = "1398210", interface_code = "JK20230411000005", body = new body { data = new data { company = iParams.company, //"XCSJ", startDate = iParams.startDate, endDate = iParams.endDate }, busAccount = "1398210", simpleFlag = "1", interfaceCode = "wmsPullSrmBookDeliveryData" } }; var requestJson = JsonConvert.SerializeObject(requestData); var db = Biz.Db; try { GetSecret secret = iParams.serverId != "55" ? new GetSecret { key = "ed3ccc64", secret = "b6178cd87ea4400eb38c0af8ea9d7419" } : new GetSecret(); var token = GetToken(secret, rootUrl); Dictionary dic = new Dictionary() { { "elsAccount", "1398210" }, { "token", token }, { "subAccount", "App_interface" }, { "pwd", "123" } }; var response = HttpHelper.PostAsync(url, requestJson, dic).Result; var responseJson = JObject.Parse(response.Message); var LastRun = Biz.Db.Queryable().Where(q => q.PRMG_CODE == "SRM_Interface" && q.PARAM_CODE == "LastRun").Single(); if (responseJson["code"]?.ToString() == "200") { action.Message = responseJson["message"]?.ToString(); var data = responseJson["result"]["data"]; var respbody = data["respBody"]; var dlvyList = new List(); var dlvyDtlList = new List(); var dlvySnList = new List(); var deliveryNoList = new List(); var snDic = new Dictionary>(); if (!respbody.IsNullOrEmpty()) { Logger.Scheduler.Info($"SRM Response Json[{respbody}] from {iParams.startDate:yyyy-MM-dd HH:mm:ss} to {iParams.endDate:yyyy-MM-dd HH:mm:ss} successful"); action.Message += $", SRM 返回JSON:{respbody}"; //循环单头列表 foreach (var dlvy in respbody.Children()) { if (dlvy["documentStatus"]?.ToString() != "0") { var DeliveryNo = dlvy["documnetNumber"]?.ToString(); //送货单加入列表供保存时用 deliveryNoList.Add(DeliveryNo); var snList = db.Queryable().Where(q => q.DELIVERY_NO == DeliveryNo).ToList(); WMS_SUPP_DLVY srmDlvy = db.Queryable().Where(q => q.DELIVERY_NO == DeliveryNo).Single() ?? new(); srmDlvy.DELIVERY_NO = DeliveryNo; srmDlvy.STATUS = dlvy["documentStatus"]?.ToInt32() ?? 0; srmDlvy.SUPP_CODE = dlvy["supplierCode"]?.ToString(); //srmDlvy.DeliveryType = dlvy["deliveryType"]?.ToInt32() ?? 0; //srmDlvy.LogisticsStatus = dlvy["logisticsStatus"]?.ToString(); //srmDlvy.PurchaseType = dlvy["purchaseType"]?.ToInt32() ?? 0; //srmDlvy.LastOperateTime = dlvy["lastOperateTime"]?.ToString(); srmDlvy.CREATE_TIME = DateTime.Now; srmDlvy.UPDATE_TIME = DateTime.Now; srmDlvy.SUPP_NAME = dlvy["supplierName"]?.ToString(); //srmDlvy.deliveryType = dlvy["deliveryType"]?.ToInt32() ?? 0; //srmDlvy.logisticsStatus = dlvy["logisticsStatus"]?.ToInt32() ?? 0; srmDlvy.DELIVERY_DATE = FromUnixTime(dlvy["deliveryDate"]?.ToInt64()); srmDlvy.PLANARRIVED_DATE = FromUnixTime(dlvy["bookDeliveryDate"]?.ToInt64()); //srmDlvy.updateTime = FromUnixTime(dlvy["updateTime"]?.ToInt64()); //srmDlvy.grossWeight = dlvy["grossWeight"]?.ToDecimal() ?? 0; //srmDlvy.netWeight = dlvy["netWeight"]?.ToDecimal() ?? 0; //srmDlvy.totalPackingQty = dlvy["totalPackingQty"]?.ToDecimal() ?? 0; //srmDlvy.cargoDeliveryTime = FromUnixTime(dlvy["cargoDeliveryTime"]?.ToInt64()); srmDlvy.HANDLED = 0; dlvyList.Add(srmDlvy); //循环单身列表 foreach (var item in dlvy["bookDeliveryItems"].Children()) { WMS_SUPP_DLVY_DTL dtl = new() { DELIVERY_NO = DeliveryNo, LINE_NO = item["orderItemNumber"]?.ToInt32() ?? 0, ERP_PO_NO = item["orderNumber"]?.ToString(), PO_LINE_NO = item["lotNum"]?.ToInt32() ?? 0, PO_TYPE = item["purchaseType"]?.ToInt32() ?? 0, ITEM_CODE = item["materialNumber"]?.ToString(), //productName = item["productName"]?.ToString(), //productScale = item["productScale"]?.ToString(), QTY = item["deliveryQuantity"]?.ToDouble() ?? 0, //deliveryUnitCode = item["deliveryUnitCode"]?.ToString(), UNIT = item["purchaseUnit"]?.ToString(), //deliveryValuationQty = item["deliveryValuationQty"]?.ToInt32() ?? 0, PRICE = item["price"]?.ToDouble() ?? 0, TAX_PRICE = item["taxPrice"]?.ToDouble() ?? 0, STATUS = (item["itemStatus"]?.ToInt32() ?? 0), //receiveStatus = item["receiveStatus"]?.ToInt32() ?? 0, BUYER = item["buyerName"]?.ToString(), //expectedDate = FromUnixTime(item["expectedDate"]?.ToInt64()), //answerDate = FromUnixTime(item["answerDate"]?.ToInt64()), //currencyCode = item["currencyCode"]?.ToString(), //currencyName = item["currencyName"]?.ToString(), //sendVerifyStatus = item["sendVerifyStatus"]?.ToInt32() ?? 0, //resultFlag = item["resultFlag"]?.ToString(), //remark = item["remark"]?.ToString(), //brandName = item["brandName"]?.ToString(), }; dlvyDtlList.Add(dtl); } //循环条码列表 foreach (var item in dlvy["barcodeDetailDatas"].Children()) { var sn = item["packetBarcodeNumber"]?.ToString(); WMS_SUPP_DLVY_SN dlvySn = snList.Where(q => q.SMALL_BARCODE == sn).SingleOrDefault() ?? new(); dlvySn.DELIVERY_NO = DeliveryNo; //dlvySn.BILLCODE = item["poErpNo"]?.ToString(); //dlvySn.BILLLINE = item["poLineNo"]?.ToString(); dlvySn.ITEM_CODE = item["materialNumber"]?.ToString(); //dlvySn.SOURCETYPE = "SRM"; //dlvySn.ITEM_NAME = item["productName"]?.ToString(); //dlvySn.SPECIFICATION = item["productScale"]?.ToString(); dlvySn.QTY = item["materialQuantity"]?.ToDouble() ?? int.MinValue; dlvySn.SMALL_BARCODE = item["packetBarcodeNumber"]?.ToString(); dlvySn.BIG_BARCODE = item["mediumBarcodeNumber"]?.ToString(); dlvySn.OUTER_BARCODE = item["cartonBarcodeNumber"]?.ToString(); dlvySn.CREATE_TIME = DateTime.Now; dlvySn.PROD_DATE = DateTime.Now; dlvySn.UPDATE_TIME = DateTime.Now; snList.RemoveAll(q => q.SMALL_BARCODE == sn); dlvySnList.Add(dlvySn); } //将sn列表加入字典 if (!snDic.ContainsKey(DeliveryNo)) { snDic.Add(DeliveryNo, snList); } } } LastRun.PARAM_VALUE = iParams.endDate; //保存到数据库 var dbTran = db.UseTran(() => { db.Storageable(dlvyList, "system").ExecuteCommand(); if (dlvyDtlList.Any()) { foreach (var d in deliveryNoList) { db.Deleteable().Where(q => q.DELIVERY_NO == 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; } } } } db.Storageable(LastRun, "system").ExecuteCommand(); }); if (!dbTran.IsSuccess) { throw dbTran.ErrorException; } Logger.Scheduler.Info($"SRM Get Delivery List[{dlvyList.Count}] from {iParams.startDate:yyyy-MM-dd HH:mm:ss} to {iParams.endDate:yyyy-MM-dd HH:mm:ss} successful"); } else { action.Message = "没有数据可导入"; LastRun.PARAM_VALUE = iParams.endDate; db.Storageable(LastRun, "system").ExecuteCommand(); } Logger.Scheduler.Info($"QqtSRM Get Delivery List[{dlvyList.Count}] done"); } else { LastRun.PARAM_VALUE = iParams.endDate; db.Storageable(LastRun, "system").ExecuteCommand(); action.Message = "没有数据可导入"; Logger.Scheduler.Error($"SRM送货单接口回复异常: From {iParams.startDate:yyyy-MM-dd HH:mm:ss} to {iParams.endDate:yyyy-MM-dd HH:mm:ss}, Result: {responseJson["result"]?.ToString()}, ErrorCode: {responseJson["errorCode"]?.ToString()}, ErrorMessage: {responseJson["errorMsg"]?.ToString()}, RequestData: {requestJson}"); } } catch (Exception ex) { return action.GetResponse().CatchExceptionWithLog(ex, $"SRM GetSRMList 访问异常[{url}]"); } return action; } /// /// /// /// /// public static string GetToken(GetSecret param, string tkUrl) { string result = ""; var url = $"{tkUrl}/els/openApi/getToken?key={param.key}&secret={param.secret}"; var snRequestJson = JsonConvert.SerializeObject(param); var snResponse = HttpHelper.GetAsync(url).Result; var snResponseJson = JObject.Parse(snResponse.Message); if (snResponseJson["success"].ToBoolean()) { result = snResponseJson["result"]["token"]?.ToString(); } return result; } } }