using Newtonsoft.Json; using Rhea.Common; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Tiger.Business.SqlSugarHepler; using Tiger.Business.WMS.Transaction; using Tiger.IBusiness; using Tiger.Model; using Tiger.Model.DTO; using Tiger.Model.Entitys.MES; using Tiger.Model.Entitys.WMS.DTOS; namespace Tiger.Business.WMS { /// /// /// public class ProductInputBusiness : IProductInputBusiness { /// /// T100接口URL /// public string t100Url { get; set; } = @"http://172.18.8.11/wstopprd/ws/r/awsp920"; /// /// /// public readonly ITrasferInfoBusiness _transferBus; /// /// /// /// public ProductInputBusiness(ITrasferInfoBusiness transferBus) { _transferBus = transferBus; } /// /// SMT退料对接MES接口 /// /// /// /// public int SMTReturnFormMES(SMTReturnDTO input) { //var db = Biz.Db; var db = Biz.DataSource["WMS57"].Client; Logger.Scheduler.Info($"单号{input.BillCode}开始退料!"); var snList = input.BarCodes.Select(i => i.SN).Distinct().ToList(); var snData = db.Queryable().Where(i => snList.Contains(i.SN)).ToList(); var oldsnData = snData.Select(i => i.SN).Distinct().ToList(); var exceptData = snList.Except(oldsnData).ToList();// 传入的数据中有,item表中没有的条码 if (exceptData.Any()) { Logger.Scheduler.Info($"条码{string.Join(",", exceptData)}未能查询到对应的库存信息,拒绝退料,请确认!"); throw new Exception($"条码{string.Join(",", exceptData)}未能查询到对应的库存信息,拒绝退料,请确认!"); } var warehouse = CheckData(input, db);// 数据检查 #region 主表实体构建 var masterModel = new BIZ_ERP_PROD_RETURN() { AUTH_ORG = warehouse.OrgCode, BILLCODE = input.BillCode, WAREHOUSECODE = warehouse.data.WH_CODE, STATUS = 0 }; #endregion 主表实体构建 #region 明细表实体构建 var dicitemcode = new Dictionary(); var itemcodeLst = snData.Select(i => i.ITEM_CODE).Distinct().ToList(); int sqn = 0; foreach (var itemcode in itemcodeLst) { if (!dicitemcode.ContainsKey(itemcode)) { sqn++; dicitemcode.Add(itemcode, sqn.ToString()); } } var snModel = new List(); var snLst = new List(); if (!input.BarCodes.IsNullOrEmpty()) { foreach (var item in input.BarCodes) { snModel.Add(new BIZ_ERP_PROD_RETURN_SN() { AUTH_ORG = warehouse.OrgCode, BUSINESSCODE = input.BillCode, SN = item.SN, STATUS = WMS_ITEM.STATUSs.WaitIn.GetValue(), ITEM_CODE = snData.Where(i => i.SN == item.SN).FirstOrDefault()?.ITEM_CODE, QTY = item.Qty }); snLst.Add(new BIZ_WMS_TRANSFER_SN() { AUTH_ORG = warehouse.OrgCode, BILLCODE = input.BillCode, SN = item.SN, STATUS = WMS_ITEM.STATUSs.WaitIn.GetValue(), ITEM_CODE = snData.Where(i => i.SN == item.SN).FirstOrDefault()?.ITEM_CODE, QTY = item.Qty, BILLLINE = dicitemcode[item.ItemCode] }); } } #endregion 明细表实体构建 #region DTL表数据实体构建 var dtlModel = new List(); if (!input.BarCodes.IsNullOrEmpty()) { foreach (var itemcode in itemcodeLst) { var prqty = input.BarCodes.Where(i => i.ItemCode == itemcode).Sum(i => i.Qty);// 获取当前物料编号的总数量 dtlModel.Add(new BIZ_ERP_PROD_RETURN_DTL() { AUTH_ORG = warehouse.OrgCode, BILLCODE = input.BillCode, LINESTATUS = 0, ITEM_CODE = itemcode, WAREHOUSECODE = warehouse.data.WH_CODE, BILLLINE = dicitemcode[itemcode], PRQTY = prqty }); } } #endregion DTL表数据实体构建 int res = 0; try { BizSqlsugar.CreateTran(() => { if (!masterModel.IsNullOrEmpty()) { res = db.Insertable(masterModel).ExecuteCommand(); } if (!snModel.IsNullOrEmpty()) { res += db.Insertable(snModel).ExecuteCommand(); } if (!dtlModel.IsNullOrEmpty()) { res += db.Insertable(dtlModel).ExecuteCommand(); } }, db); } catch (Exception) { } var inputdto = new List(); #region 请求实体构建 var detaildatas = dtlModel.Where(i => i.BILLCODE == masterModel.BILLCODE).ToList(); var detaildto = new List(); foreach (var detailitem in detaildatas) { detaildto.Add(new TrasferInfoDetailDTO() { BILLCODE = detailitem.BILLCODE, AUTH_ORG = warehouse.OrgCode, BILLLINE = Convert.ToInt32(detailitem.BILLLINE), LINESTATUS = detailitem.LINESTATUS.ToString(), OUTQTY = detailitem.PRQTY, ITEM_CODE = detailitem.ITEM_CODE, UNITCODE = detailitem.UNITCODE, PRQTY = detailitem.PRQTY, OUTWAREHOUSECODE = warehouse.data.TRANSFER_WH, INWAREHOUSECODE = warehouse.data.WH_CODE, CREATE_TIME = DateTime.Now }); } inputdto.Add(new TrasferInfoDTO() { AUTH_ORG = warehouse.OrgCode, BILLCODE = masterModel.BILLCODE, BILLDATE = masterModel.BILLDATE, OUTWAREHOUSECODE = warehouse.data.TRANSFER_WH, INWAREHOUSECODE = warehouse.data.WH_CODE, CREATE_TIME = masterModel.CREATE_TIME, details = detaildto }); #endregion 请求实体构建 #region 添加调拨单信息 _transferBus.SaveTrasferInfo(inputdto, "2"); if (snLst.Any()) { var history = db.Queryable().Where(i => i.BILLCODE == input.BillCode).ToList(); if (history.Any()) { db.Deleteable(history).ExecuteCommand(); } db.Insertable(snLst).ExecuteCommand(); } #endregion 添加调拨单信息 return res; } /// /// 数据检查 /// /// /// /// public OrgDataDTO CheckData(SMTReturnDTO input, DbClient db) { var olddata = db.Queryable().Where(i => i.BILLCODE == input.BillCode).ToList(); if (olddata.Any()) { throw new Exception($"当前单据:{input.BillCode} 已存在退料信息数据,请确认!"); } var snList = input.BarCodes.Select(i => i.SN).Distinct().ToList(); var itemData = db.Queryable().Where(i => snList.Contains(i.SN)).ToList(); var orgLst = itemData.Select(i => i.AUTH_ORG).Distinct().ToList(); if (orgLst is { Count: > 1 }) { throw new Exception($"违规操作!当前SN明细数据对应多个据点{string.Join(",", orgLst)},拒绝退料!"); } var whcodes = itemData.Select(i => i.ERP_WH).Distinct().ToList(); if (whcodes is { Count: > 1 }) { throw new Exception($"违规操作!当前SN明细数据对应多个仓库{string.Join(",", whcodes)},拒绝退料!"); } var snSource = itemData.Where(i => i.STATUS != 60).Select(i => i.SN).Distinct().ToList(); if (snSource.Any()) { throw new Exception($"SN条码:{string.Join(",", snSource)},对应库存状态不为【已发料】状态,拒绝退货!"); } var oldSNLst = itemData.Select(i => i.SN).Distinct().ToList(); var noSnList = snList.Except(oldSNLst).ToList(); if (noSnList.Any()) { throw new Exception($"SN条码:{string.Join(",", noSnList)}不存在库存信息,拒绝退货!"); } var warehouse = db.Queryable().Where(i => i.WH_CODE == whcodes[0]).First();// 获取仓库信息 if (warehouse == null) { throw new Exception($"未能查询到当前仓库{whcodes[0]}信息,退料失败,请确认!"); } var sns = input.BarCodes.GroupBy(i => i.SN).Where(i => i.Count() > 1).Select(i => i.Key).Distinct().ToList();// 查询重复的条码 if (sns.Any()) { throw new Exception($"条码明细中有重复的SN条码:{string.Join(",", sns)},拒绝退货!"); } var barSns = input.BarCodes.Select(i => i.SN).Distinct().ToList();// 条码明细 var data = db.Queryable((a, b) => new object[] { JoinType.Left,a.BILLCODE == b.BUSINESSCODE }).Where((a, b) => barSns.Contains(b.SN)) .Select((a, b) => new { b.SN, a.ERP_BILL_CODE }).Distinct().ToList(); var nullerp = data.Where(i => string.IsNullOrWhiteSpace(i.ERP_BILL_CODE)).Select(i => i.SN).Distinct().ToList();// 获取所有erpbillcode为空的条码数据 if (nullerp.Any()) { throw new Exception($"传入的条码/t{string.Join(",", nullerp)}/t存在已退料未过账的数据,请勿重复退料!"); } var model = new OrgDataDTO() { data = warehouse, OrgCode = orgLst[0] }; return model; } /// /// 成品入库 /// /// /// /// public int GetProductInputInfoFromT100(ProduceInputDataDTO input) { //var db = Biz.Db; var db = Biz.DataSource["WMS57"].Client; //var db1 = Biz.DataSource["Test"].Client; var olddata = db.Queryable().Where(i => i.BILLCODE == input.sfeadocno).ToList(); //if (olddata.Any()) //{ // throw new Exception($"当前单号:{input.sfeadocno} 已存在库存信息数据,不允许重复入库!"); //} var warehouseLst = input.Details.Select(i => i.sfeb013).Distinct().ToList(); if (warehouseLst is { Count: > 1 }) { throw new Exception($"同一批明细数据中不允许存在多个库位号,请确认!"); } var models = input.Details.Where(i => i.sfeb004.StartsWith("10")).Select(i => i.sfebud001).Distinct().ToList();// T100 推送过来的机型 if (models is { Count: > 1 }) { throw new Exception($"同一批明细数据中不允许存在多个机型,请确认!"); } #region 主表实体构建 var masterModel = new BIZ_ERP_PROD_IN() { AUTH_ORG = input.sfeasite, BILLCODE = input.sfeadocno, WAREHOUSECODE = input.Details.FirstOrDefault()?.sfeb013, CREATE_USER = input.sfea002, ITEM_MODEL = models.Count() == 0 ? null : models[0], STATUS = 0 }; var hostoryMasterData = db.Queryable().Where(i => i.BILLCODE == masterModel.BILLCODE).ToList();// 获取历史数据 #endregion 主表实体构建 #region 明细表实体构建 var dtlModel = new List(); foreach (var item in input.Details) { dtlModel.Add(new BIZ_ERP_PROD_IN_DTL() { AUTH_ORG = input.sfeasite, BILLCODE = input.sfeadocno, ITEM_CODE = item.sfeb004, PRQTY = item.sfeb008, WAREHOUSECODE = item.sfeb013, CREATE_USER = input.sfea002, LINESTATUS = 0, UNITCODE = item.sfeb007, BILLLINE = item.sfebseq.ToString(), REMARK = item.sfeb003 }); } var hostoryDtlData = db.Queryable().Where(i => i.BILLCODE == masterModel.BILLCODE).ToList(); #endregion 明细表实体构建 int res = 0; try { BizSqlsugar.CreateTran(() => { #region 成品入库表 if (hostoryMasterData.Any()) { db.Deleteable(hostoryMasterData).ExecuteCommand(); } if (!masterModel.IsNullOrEmpty()) { res = db.Insertable(masterModel).ExecuteCommand(); //res = db1.Insertable(masterModel).ExecuteCommand(); } if (hostoryDtlData.Any()) { db.Deleteable(hostoryDtlData).ExecuteCommand(); } if (!dtlModel.IsNullOrEmpty()) { res += db.Insertable(dtlModel).ExecuteCommand(); //res += db1.Insertable(dtlModel).ExecuteCommand(); } #endregion 成品入库表 }, db); } catch (Exception) { } //DataToT100(input, authOrg); return res; } /// /// 成品入库 /// /// /// /// public string GetProductInputInfo(ProductInputDTO input) { //var db = Biz.Db; var db = Biz.DataSource["WMS57"].Client; //var db = Biz.DataSource["Test"].Client; var sndataList = input.details.Select(i => i.SN).Distinct().ToList();// 新的条码 var oldsnList = db.Queryable().Where(i => i.BUSINESSCODE == input.WorkOrder).Select(i => i.SN).Distinct().ToList();// 已入库的SN条码 var needinsertSNList = sndataList.Except(oldsnList).ToList(); var detail = input.details.Where(i => needinsertSNList.Contains(i.SN)).ToList();// 需要处理的新SN条码数据 if (!detail.Any()) { return null; } var inData = db.Queryable().Where(i => i.BILLCODE == input.WorkOrder).First(); var inDtlData = db.Queryable().Where(i => i.BILLCODE == input.WorkOrder).ToList(); var sumprqty = inDtlData.Sum(i => i.PRQTY);// 需求总数量 var suminputqty = inDtlData.Sum(i => i.INSTOCKQTY);// 已入库数量 if (detail.Count() + suminputqty > sumprqty) { Logger.Scheduler.Info($"当前工单:{input.WorkOrder} 当前数量:{detail.Count()}与已入库数量:{suminputqty}之和超过需求数量:{sumprqty},拒绝入库,请确认!"); throw new Exception($"当前工单:{input.WorkOrder} 当前数量:{detail.Count()}与已入库数量:{suminputqty}之和超过需求数量:{sumprqty},拒绝入库,请确认!"); } // 2023年10月25日11:11:07 by 杨浩 //if (!string.IsNullOrEmpty(inData.ITEM_MODEL) && input.ITEM_MODEL != inData.ITEM_MODEL) //{ // Logger.Scheduler.Info($"当前工单:{input.WorkOrder} 机型:{input.ITEM_MODEL}与T100机型:{inData.ITEM_MODEL}不一致,拒绝入库,请确认!"); // throw new Exception($"当前工单:{input.WorkOrder} 机型:{input.ITEM_MODEL}与T100机型:{inData.ITEM_MODEL}不一致,拒绝入库,请确认!"); //} var detailModel = new List();// 条码表实体构建 var itemModel = new List(); // 库存信息实体构建 var hisModel = new List();// 库存历史实体构造 var pkgModel = new List();// 包装信息实体构建 #region 实体构建 #region 给现有成品料号进行编号 var dtlsumData = inDtlData.Where(i => i.PRQTY != i.INSTOCKQTY).OrderBy(i => i.BILLLINE).Select(i => new { i.ITEM_CODE, i.PRQTY, i.INSTOCKQTY }).ToList(); var dic = new Dictionary(); var count = 0M; foreach (var item in dtlsumData) { var sum = item.PRQTY - item.INSTOCKQTY; for (var i = 1; i <= sum; i++) { count++; if (!dic.ContainsKey(count)) { dic.Add(count, item.ITEM_CODE); } } } #endregion 给现有成品料号进行编号 var whUnits = db.Queryable().Where(q => detail.Select(d => input.WarehouseCode + "@" + d.Location).Contains(q.WH_CODE + "@" + q.LOCATION_CODE)).ToList(); var sqn = 0M; #region 数据填充 var bol = false; var palletno = input.details.Select(i => i.Pallet).Distinct().First(); var newData = db.Queryable().Where(i => i.BILLCODE == input.WorkOrder).ToList(); var itemlist = newData.Where(i => i.ITEM_CODE.StartsWith("5405") || i.ITEM_CODE.StartsWith("5402") || i.ITEM_CODE.StartsWith("1060")).Select(i => i.ITEM_CODE).Distinct().ToList(); var mesData = new List(); if (newData.FirstOrDefault()?.AUTH_ORG == "YTXC" && itemlist.Count() == newData.Count()) { var ytdb = Biz.DataSource["YTMES"].Client; mesData = ytdb.Queryable().Where(i => i.STOCK_NO == input.WorkOrder) .Select(i => new MESDTO() { Stock_No = i.STOCK_NO, SO_NUMBER = i.SO_NUMBER, SHIPPING_SN = i.SHIPPING_SN, SERIAL_NUMBER = i.SERIAL_NUMBER, CARTON_NO = i.CARTON_NO, PALLET_NO = i.PALLET_NO, IN_STATION_TIME = i.IN_STATION_TIME, Model_Name = i.MODEL_NAME }).ToList(); bol = true; } foreach (var item in detail) { sqn++; var itemcode = dic[sqn]; var whUnit = whUnits.FirstOrDefault(q => q.WH_CODE + "@" + q.LOCATION_CODE == input.WarehouseCode + "@" + item.Location); var mesCount = mesData.Count != 0 ? (mesData.FirstOrDefault(i => i.SHIPPING_SN == item.SN).SO_NUMBER).ToDecimal() : 0; if (whUnit.IsNullOrEmpty()) { Logger.Scheduler.Info($"当前工单:{input.WorkOrder} 未能查询到当前库位/储位{input.WarehouseCode}/{item.Location}信息,请确认该库位/储位是否存在!"); throw new Exception($"当前工单:{input.WorkOrder} 未能查询到当前库位/储位{input.WarehouseCode}/{item.Location}信息,请确认该库位/储位是否存在!"); } detailModel.Add(new BIZ_ERP_PROD_IN_SN() { AUTH_ORG = inData?.AUTH_ORG, SN = item.SN, ITEM_MODEL = input.ITEM_MODEL, STATUS = WMS_ITEM.STATUSs.WaitIn.GetValue(), Qty = bol ? mesCount : 1, META_SN = "", BUSINESSCODE = input.WorkOrder, CARTONNO = item.Carton, ITEM_CODE = itemcode, PALLETNO = item.Pallet, DATECODE = item.ProdDate.HasValue ? item.ProdDate.Value : DateTime.Now, CREATE_USER = input.UserCode }); itemModel.Add(new WMS_ITEM() { AUTH_ORG = inData?.AUTH_ORG, SN = item.SN, ITEM_MODEL = input.ITEM_MODEL, STATUS = WMS_ITEM.STATUSs.WaitIn.GetValue(), ITEM_CODE = itemcode, QTY = bol ? mesCount : 1, UNIT = item.Unit, PROD_DATE = item.ProdDate.HasValue ? detail[0].ProdDate.Value : DateTime.Now, TRANS_NO = input.WorkOrder, CARTON_NO = item.Carton, PALLET_NO = item.Pallet, ERP_WH = inData.WAREHOUSECODE, WH_ID = whUnit?.WH_ID, REGION_ID = whUnit?.REGION_ID, SHELF_ID = whUnit?.SHELF_ID, LOCATION_ID = whUnit?.LOCATION_ID, CREATE_USER = input.UserCode, FIRST_IN_DATE = DateTime.Now }); hisModel.Add(new WMS_ITEM_HIS() { AUTH_ORG = inData?.AUTH_ORG, SN = item.SN, TRANS_NO = input.WorkOrder, STATUS = WMS_ITEM.STATUSs.WaitIn.GetValue(), ITEM_CODE = itemcode, QTY = detail.Count(), UNIT = item.Unit, PROD_DATE = item.ProdDate.HasValue ? item.ProdDate.Value : DateTime.Now, CARTON_NO = item.Carton, PALLET_NO = item.Pallet, ERP_WH = inData.WAREHOUSECODE, WH_ID = whUnit?.WH_ID, REGION_ID = whUnit?.REGION_ID, SHELF_ID = whUnit?.SHELF_ID, LOCATION_ID = whUnit?.LOCATION_ID, CREATE_USER = input.UserCode, TRACE_INFO = "WMS成品入库,待入库" }); } #endregion 数据填充 var palletLst = detail.Select(i => i.Pallet).Distinct().ToList(); // 获取所有的栈板号 foreach (var pallet in palletLst) { var boxLst = detail.Where(i => i.Pallet == pallet).Select(i => i.Carton).Distinct().ToList();// 获取所有的箱号 var m = 0M; foreach (var box in boxLst) { var sndata = detail.Where(i => i.Pallet == pallet && i.Carton == box).ToList();// 当前栈板号/箱号下的所有SN数据 foreach (var item in sndata) { m++; var itemcode = dic[m]; #region 添加 SN-Box数据 var whUnit = whUnits.FirstOrDefault(q => q.WH_CODE + "@" + q.LOCATION_CODE == input.WarehouseCode + "@" + item.Location); var mesCount = mesData.Count != 0 ? (mesData.FirstOrDefault(i => i.SHIPPING_SN == item.SN).SO_NUMBER).ToDecimal() : 0; pkgModel.Add(new WMS_ITEM_PKG() { AUTH_ORG = inData?.AUTH_ORG, TRANS_NO = input.WorkOrder, SN = item.SN, PARENT_SN = box, ITEM_CODE = itemcode, QTY = bol ? mesCount : 1, UNIT = item.Unit, ERP_WH = inData.WAREHOUSECODE, WH_ID = whUnit?.WH_ID, REGION_ID = whUnit?.REGION_ID, SHELF_ID = whUnit?.SHELF_ID, LOCATION_ID = whUnit?.LOCATION_ID, CREATE_USER = input.UserCode }); #endregion 添加 SN-Box数据 } #region 添加Box-Pallet对应关系 pkgModel.Add(new WMS_ITEM_PKG() { AUTH_ORG = inData?.AUTH_ORG, TRANS_NO = input.WorkOrder, SN = box, PARENT_SN = pallet, //ITEM_CODE = itemcode, QTY = sndata.Count(), ERP_WH = inData.WAREHOUSECODE, CREATE_USER = input.UserCode }); #endregion 添加Box-Pallet对应关系 } #region 添加Pallet-Null对应关系 var Count = detail.Where(i => i.Pallet == pallet).Count(); pkgModel.Add(new WMS_ITEM_PKG() { AUTH_ORG = inData?.AUTH_ORG, TRANS_NO = input.WorkOrder, SN = pallet, ITEM_CODE = input.ItemCode, QTY = Count, ERP_WH = inData.WAREHOUSECODE, CREATE_USER = input.UserCode }); #endregion 添加Pallet-Null对应关系 } //var snList = input.details.Select(i => i.SN).Distinct().ToList(); var dataList = pkgModel.Where(i => i.SN == i.PARENT_SN).ToList(); var pkgData = pkgModel.Except(dataList).ToList();// 剔除掉箱号=栈板号的数据 //var hostoryDetailData = db.Queryable().Where(i => i.BUSINESSCODE == input.WorkOrder).ToList(); #endregion 实体构建 #region 筛选 增——删——改数据——已删除 #region 库存信息 //var oldItemData = db.Queryable().Where(i => i.TRANS_NO == input.WorkOrder).ToList();// 获取当前工单的历史数据 //var oldSnLst = oldItemData.Select(i => i.SN).Distinct().ToList();// 获取旧的SN码 //var needDeleteSns = oldSnLst.Except(snList).ToList();// 需要删除的SN码 //var deletedData = oldItemData.Where(i => needDeleteSns.Contains(i.SN)).ToList();// 需要删除的数据 //var needInsertSns = snList.Except(oldSnLst).ToList();// 需要新增的数据 //var insertData = itemModel.Where(i => needInsertSns.Contains(i.SN)).ToList();// 需要新增的数据 //var needUpdateSn = oldSnLst.Intersect(snList).ToList();// 需要更新的数据 //var updateData = oldItemData.Where(i => needUpdateSn.Contains(i.SN)).ToList(); //foreach (var item in updateData) //{ // item.ITEM_CODE = input.ItemCode; // item.QTY = input.details.Count(); // item.UNIT = itemModel.Where(i => i.SN == item.SN).FirstOrDefault()?.UNIT; // item.PROD_DATE = itemModel.Where(i => i.SN == item.SN).FirstOrDefault().PROD_DATE; // item.TRANS_NO = input.WorkOrder; // item.CARTON_NO = itemModel.Where(i => i.SN == item.SN).FirstOrDefault().CARTON_NO; // item.PALLET_NO = itemModel.Where(i => i.SN == item.SN).FirstOrDefault().PALLET_NO; // item.ERP_WH = itemModel.Where(i => i.SN == item.SN).FirstOrDefault().ERP_WH; // item.WH_ID = itemModel.Where(i => i.SN == item.SN).FirstOrDefault().WH_ID; // item.REGION_ID = itemModel.Where(i => i.SN == item.SN).FirstOrDefault().REGION_ID; // item.SHELF_ID = itemModel.Where(i => i.SN == item.SN).FirstOrDefault().SHELF_ID; // item.LOCATION_ID = itemModel.Where(i => i.SN == item.SN).FirstOrDefault().LOCATION_ID; // item.CREATE_USER = input.UserCode; //} #endregion 库存信息 #region 库存历史 //var oldhisData = db.Queryable().Where(i => i.TRANS_NO == input.WorkOrder).ToList();// 获取当前工单的历史数据 //var oldhisSnLst = oldhisData.Select(i => i.SN).Distinct().ToList();// 获取旧的SN码 //var needDeletehisSns = oldhisSnLst.Except(snList).ToList();// 需要删除的SN码 //var deletedhisData = oldhisData.Where(i => needDeletehisSns.Contains(i.SN)).ToList();// 需要删除的数据 //var hisneedInsertSns = snList.Except(oldhisSnLst).ToList();// 需要新增的数据 //var hisinsertData = hisModel.Where(i => hisneedInsertSns.Contains(i.SN)).ToList();// 需要新增的数据 //var hisneedUpdateSn = oldhisSnLst.Intersect(snList).ToList();// 需要更新的数据 //var hisupdateData = oldhisData.Where(i => hisneedUpdateSn.Contains(i.SN)).ToList(); //foreach (var item in hisupdateData) //{ // item.ITEM_CODE = input.ItemCode; // item.QTY = input.details.Count(); // item.UNIT = itemModel.Where(i => i.SN == item.SN).FirstOrDefault()?.UNIT; // item.PROD_DATE = itemModel.Where(i => i.SN == item.SN).FirstOrDefault().PROD_DATE; // item.TRANS_NO = input.WorkOrder; // item.CARTON_NO = itemModel.Where(i => i.SN == item.SN).FirstOrDefault().CARTON_NO; // item.PALLET_NO = itemModel.Where(i => i.SN == item.SN).FirstOrDefault().PALLET_NO; // item.ERP_WH = itemModel.Where(i => i.SN == item.SN).FirstOrDefault().ERP_WH; // item.WH_ID = itemModel.Where(i => i.SN == item.SN).FirstOrDefault().WH_ID; // item.REGION_ID = itemModel.Where(i => i.SN == item.SN).FirstOrDefault().REGION_ID; // item.SHELF_ID = itemModel.Where(i => i.SN == item.SN).FirstOrDefault().SHELF_ID; // item.LOCATION_ID = itemModel.Where(i => i.SN == item.SN).FirstOrDefault().LOCATION_ID; //} #endregion 库存历史 #endregion 筛选 增——删——改数据——已删除 foreach (var item in inDtlData) { item.LINESTATUS = 1; } inData.STATUS = 1; int res = 0; try { BizSqlsugar.CreateTran(() => { #region 成品入库表 if (detailModel.Any()) { res += BizSqlsugar.InsertDataTable(detailModel, db); } #endregion 成品入库表 #region 库存信息表 if (itemModel.Any()) { BizSqlsugar.InsertDataTable(itemModel, db); } #endregion 库存信息表 #region 库存历史 if (hisModel.Any()) { BizSqlsugar.InsertDataTable(hisModel, db); } #endregion 库存历史 #region 包装信息 if (pkgData.Any()) { BizSqlsugar.InsertDataTable(pkgData, db); } #endregion 包装信息 #region 成品入库头表 db.Updateable(inDtlData).ExecuteCommand(); #endregion 成品入库头表 #region 成品入库DTL表 BizSqlsugar.UpdateDataTable(inDtlData, db); #endregion 成品入库DTL表 }, db); } catch (Exception ex) { Logger.Scheduler.Info($"工单:{input.WorkOrder} 成品入库对接MES存储数据失败,失败原因: {ex.Message}"); throw new Exception($"工单:{input.WorkOrder} 成品入库对接MES存储数据失败,失败原因: {ex.Message}"); } Logger.Scheduler.Info($"数据存储成功!"); //DataToT100(input, authOrg); #region 明细数据入库数量更新 int SNCount = detail.Count(); //var itemlist = newData.Where(i => i.ITEM_CODE.StartsWith("5405") || i.ITEM_CODE.StartsWith("5402") || i.ITEM_CODE.StartsWith("1060")).Select(i => i.ITEM_CODE).Distinct().ToList(); if (newData.FirstOrDefault()?.AUTH_ORG == "YTXC" && itemlist.Count() == newData.Count()) { var ytdb = Biz.DataSource["YTMES"].Client; var ytsourceData2 = ytdb.Queryable().Where(i => i.STOCK_NO == input.WorkOrder && i.PALLET_NO == palletno).ToList(); var mescount = ytsourceData2.Sum(i => i.SO_NUMBER.ToInt32()); SNCount = mescount; if (SNCount + suminputqty > sumprqty) { Logger.Scheduler.Info($"当前工单:{input.WorkOrder} 当前数量:{detail.Count()}与已入库数量:{suminputqty}之和超过需求数量:{sumprqty},拒绝入库,请确认!"); throw new Exception($"当前工单:{input.WorkOrder} 当前数量:{detail.Count()}与已入库数量:{suminputqty}之和超过需求数量:{sumprqty},拒绝入库,请确认!"); } } var Data = ChangeDTL(newData, SNCount); #region 更新明细数据入库数量 if (Data.Any()) { BizSqlsugar.UpdateDataTable(Data, db); } #endregion 更新明细数据入库数量 #endregion 明细数据入库数量更新 #region 调用T100过账 var msg = string.Empty; var prqtySum = newData.Sum(i => i.PRQTY); var inSum = newData.Sum(i => i.INSTOCKQTY); if (prqtySum == inSum) { try { msg = GetProductInputPostingToT100(input);// 当需求数量与入库数量一致时,调用T100过账接口进行过账 } catch (Exception) { Logger.Scheduler.Info($"单号:{input.WorkOrder}\t推送T100过账失败,失败原因:{msg}"); //throw new Exception($"当前单号:{input.WorkOrder}\t推送T100过账失败,失败原因:{msg}"); } Logger.Scheduler.Info($"单号:{input.WorkOrder}状态及时间开始更新!"); var wmsitemData = db.Queryable().Where(i => i.TRANS_NO == input.WorkOrder).ToList(); foreach (var item in wmsitemData) { item.STATUS = WMS_ITEM.STATUSs.InStore.GetValue(); item.UPDATE_TIME = DateTime.Now; } var hisData = new WMS_ITEM_HIS() { CREATE_TIME = DateTime.Now, TRANS_NO = input.WorkOrder, SN = "固定条码", TRACE_INFO = "成品入库单已推送T100过账" }; var inSource = db.Queryable().Where(i => i.BILLCODE == input.WorkOrder).ToList(); foreach (var item in inSource) { item.STATUS = 3; } var dtlSource = db.Queryable().Where(i => i.BILLCODE == input.WorkOrder).ToList();// 获取单身表数据 foreach (var item in dtlSource) { item.LINESTATUS = 3; } var snSource = db.Queryable().Where(i => i.BUSINESSCODE == input.WorkOrder).ToList();// 获取单身表数据 foreach (var item in snSource) { item.STATUS = WMS_ITEM.STATUSs.InStore.GetValue(); } BizSqlsugar.UpdateDataTable(inSource, db); BizSqlsugar.UpdateDataTable(dtlSource, db); BizSqlsugar.UpdateDataTable(snSource, db); BizSqlsugar.UpdateDataTable(wmsitemData, db); //db.Updateable(wmsitemData).ExecuteCommand(); //db.Updateable(wmsitemData).ExecuteCommand(); db.Insertable(hisData).ExecuteCommand(); Logger.Scheduler.Info($"单号:{input.WorkOrder}状态及时间更新完成!"); } #endregion 调用T100过账 Logger.Scheduler.Info($"单号:{input.WorkOrder}/t {string.Join(",", palletLst)}过账成功!过账数量:{input.details.Count()}"); return msg; } /// /// 更新明细数据的入库数量 /// /// /// /// public List ChangeDTL(List input, decimal Count) { var model = new List(); var data = input.Where(i => i.INSTOCKQTY < i.PRQTY).OrderBy(i => i.BILLLINE).ToList(); var sumprqty = input.Sum(i => i.PRQTY);// 需求总数量 var suminputqty = input.Sum(i => i.INSTOCKQTY);// 已入库数量 if (Count + suminputqty > sumprqty) { Logger.Scheduler.Info($"工单:{input[0].BILLCODE} 当前数量:{Count}与已入库数量:{suminputqty}之和超过需求数量:{sumprqty},拒绝入库,请确认!"); throw new Exception($"工单:{input[0].BILLCODE} 当前数量:{Count}与已入库数量:{suminputqty}之和超过需求数量:{sumprqty},拒绝入库,请确认!"); } foreach (var item in data) { var prqty = item.PRQTY; if (prqty >= Count + item.INSTOCKQTY) { item.INSTOCKQTY = Count + item.INSTOCKQTY; if (prqty == Count + item.INSTOCKQTY) { item.LINESTATUS = 2; } model.Add(item); return model;// 如果当前传入数量小于当前需求数量,则直接更新 } else { Count = Count - (item.PRQTY - item.INSTOCKQTY); item.INSTOCKQTY = prqty; item.LINESTATUS = 2; model.Add(item);// 否则循环更新多条数量 } } return model; } /// /// 根据工单号获取据点名称 /// /// /// public string GetAuthOrg(string workOrder) { var authOrg = string.Empty; var org = workOrder.Substring(0, 2); switch (org) { #region 循环取值 case "PH": authOrg = "PHXC"; break; case "YX": authOrg = "YXYY"; break; case "XP": authOrg = "XCXP"; break; case "XN": authOrg = "XCXN"; break; case "TH": authOrg = "STTH"; break; case "XC": authOrg = "XCSJ"; break; case "DG": authOrg = "DGXC"; break; case "HK": authOrg = "HKXC"; break; case "TX": authOrg = "TXXC"; break; case "LR": authOrg = "XCLR"; break; case "OM": authOrg = "OMKJ"; break; case "AH": authOrg = "AHXC"; break; case "YK": authOrg = "XCYK"; break; case "CC": authOrg = "XCCC"; break; case "TC": authOrg = "XCTC"; break; case "TK": authOrg = "STTK"; break; case "MM": authOrg = "STMM"; break; case "YT": authOrg = "YTXC"; break; default: throw new Exception($"单号前两位:{org}未能找到对应的据点,请确认!"); #endregion 循环取值 } return authOrg; } /// /// /// /// public void DataToT100(ProductInputDTO input, string authOrg) { #region 创建请求实体 var detail = new List(); detail.Add(new FinishProductDTO() { sfeb001 = input.WorkOrder, sfeb008 = input.details.Count(), sfeb013 = input.WarehouseCode, sfeb014 = input.details[0].Location, sfeb015 = "" }); var shipment = new List(); shipment.Add(new ShipMent() { sfeadocdt = DateTime.Now.ToString("yyyy-MM-dd"), sfeadocno = "5801", sfea002 = input.UserCode, detail1 = detail }); var model = new BodyDTO>>() { host = new HostDTO(), datakey = new DataKey() { EntId = "88", CompanyId = authOrg }, service = new ServiceDTO() { name = "wms_gen_asft340" }, payload = new PayLoad>() { std_data = new Std_Data() { parameter = new ParameterFinishProductDTO() { shipment = shipment } } } }; #endregion 创建请求实体 #region 发起请求 var result = new T100ActionResult>(); try { var requestJson = JsonConvert.SerializeObject(model); var response = HttpHelper.PostAsync(t100Url, requestJson).Result; result = JsonConvert.DeserializeObject>>(response.Message); Logger.Scheduler.Info($"成品入库信息同步提交Json: {requestJson},返回Json: {response.Message}"); } catch (Exception) { Logger.Scheduler.Info($"成品入库信息同步失败"); } #endregion 发起请求 } /// /// 成品入库对接T100过账接口 /// /// /// /// public string GetProductInputPostingToT100(ProductInputDTO input) { var authOrg = GetAuthOrg(input.WorkOrder); #region 创建请求实体 var model = new BodyDTO>>() { host = new HostDTO(), datakey = new DataKey() { EntId = "88", CompanyId = authOrg }, service = new ServiceDTO() { name = "wms_post_asft340" }, payload = new PayLoad>() { std_data = new Std_Data() { parameter = new ParameterPostingDTO() { sfeadocno = input.WorkOrder, sfea001 = DateTime.Now.ToString("yyyy-MM-dd") } } } }; #endregion 创建请求实体 #region 发起请求 var result = new T100ActionResult(); try { var requestJson = JsonConvert.SerializeObject(model); var response = HttpHelper.PostAsync(t100Url, requestJson).Result; result = JsonConvert.DeserializeObject>(response.Message); Logger.Scheduler.Info($"成品入库对接T100过账提交Json: {requestJson},返回Json: {response.Message}"); } catch (Exception ex) { Logger.Scheduler.Info($"成品入库对接T100过账失败"); return "0"; } #endregion 发起请求 var db = Biz.DataSource["WMS57"].Client; var olddata = db.Queryable().Where(i => i.BILLCODE == input.WorkOrder).ToList(); var msg = result.payload.std_data?.execution.description.ToString(); if (result.payload.std_data?.execution.code == "S") { //msg = result.payload.std_data?.execution.description.ToString(); foreach (var data in olddata) { data.ERP_BILL_CODE = "T100返回信息已过账"; } } if (result.payload.std_data?.execution.code == "0")//msg == "1" && { foreach (var data in olddata) { data.ERP_BILL_CODE = input.WorkOrder;// 更新单号 } } BizSqlsugar.CreateTran(() => { //BizSqlsugar.UpdateDataTable(wmsitemData, db); BizSqlsugar.UpdateDataTable(olddata, db); //db.Insertable(hisData).ExecuteCommand(); }, db); return msg; } /// /// /// /// /// public async Task> GetProductInputResultInfoAsync(ProductInputResultDTO input) { var db = Biz.DataSource["MES"].Client; var data = await db.Queryable() .WhereIF(!string.IsNullOrWhiteSpace(input.WorkOrder), i => i.STOCK_NO == input.WorkOrder) .Where(i => i.STOCK_NO.Contains("-")).ToListAsync();// 所有的成品入库单 if (string.IsNullOrWhiteSpace(input.WorkOrder)) { var data1 = data?.Where(i => i.UP_FLAG == 1).Select(i => i.STOCK_NO).Distinct().ToList();// 所有已经过账的单号 var data2 = data?.Where(i => i.UP_FLAG == 0).Select(i => i.STOCK_NO).Distinct().ToList();// 所有未过账的单号 var stocknoList = data2.Except(data1).ToList(); // 单号集合 var model = data.Where(i => stocknoList.Contains(i.STOCK_NO)).ToList(); return model; } return data; } /// /// /// /// /// public int ProductInputStatusRestoredAsync(ProductInputResultDTO input) { int s = 0; if (string.IsNullOrWhiteSpace(input.WorkOrder)) { throw new Exception($"单号不允许为空!"); } var db = Biz.DataSource["MES"].Client; var data = db.Queryable() .WhereIF(!string.IsNullOrWhiteSpace(input.WorkOrder), i => i.STOCK_NO == input.WorkOrder).ToList();// 获取MES单号信息 foreach (var item in data) { item.UP_FLAG = 0; } var db1 = Biz.DataSource["WMS57"].Client;// WMS数据库 var dtlData = db1.Queryable().Where(i => i.BILLCODE == input.WorkOrder).ToList(); foreach (var item in dtlData) { item.INSTOCKQTY = 0; } var snData = db1.Queryable().Where(i => i.BUSINESSCODE == input.WorkOrder).ToList(); try { BizSqlsugar.CreateTran(() => { BizSqlsugar.UpdateDataTable(data, db);// MES数据表状态复原 BizSqlsugar.UpdateDataTable(dtlData, db1);// WMS的DTL表入库数量复原 db1.Deleteable(snData).ExecuteCommand(); // 清除SN条码明细 }, db1); } catch (Exception ex) { throw new Exception($"状态复原失败,请联系项目管理员!"); } return s++; } } }