using Newtonsoft.Json; using Rhea.Common; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using Tiger.IBusiness; using Tiger.Model; using Tiger.Model.Minsun; namespace Tiger.Business.WMS { public class ProdMaterialReq : IProdMaterialReq { /// /// T100推送领料单到WMS /// /// /// public ApiAction GetMaterialReq(List prd_hs) { var action = new ApiAction(); try { if (prd_hs.Count > 0) { List entity_h = new(); List entity_d = new(); //查询出来的列表 List list_d = new(); DbClient db = Biz.DataSource["WMS57"].Client; foreach (var item_h in prd_hs) { var prd_h = db.Queryable().Where(s => s.BILLCODE == item_h.BILLCODE).Single(); if (prd_h?.STATUS != BIZ_ERP_PROD_OUT.STATUSs.COMPLETE.GetValue()) { prd_h = prd_h ?? new BIZ_ERP_PROD_OUT() { STATUS = BIZ_ERP_PROD_OUT.STATUSs.INIT.GetValue(), BIZTYPE = "1", }; prd_h.BILLCODE = item_h.BILLCODE; prd_h.BILLDATE = item_h.BILLDATE??DateTime.MinValue; prd_h.SOURCETYPE = item_h.SOURCETYPE; prd_h.STATUS = prd_h.STATUS == BIZ_ERP_PROD_OUT.STATUSs.DELETE.GetValue() ? BIZ_ERP_PROD_OUT.STATUSs.INIT.GetValue() : prd_h.STATUS; prd_h.REMARK = item_h.REMARK; prd_h.SOURCECODE = item_h.SOURCECODE; prd_h.AUTH_ORG = item_h.STRONGHOID; prd_h.HANDLED = 0; entity_h.Add(prd_h); } } Logger.Interface.Info($"推送到新数据库,开始保存数据,数量[{entity_h.Count}]"); //保存到数据库 var dbTran = db.UseTran(() => { db.Storageable(entity_h, "T100").ExecuteCommand(); }); if (!dbTran.IsSuccess) { action.CatchExceptionWithLog(dbTran.ErrorException, $"数据保存失败"); } //异步拉取单身列表 GenerateReqDetailNew(prd_hs, db); } return action; } catch (Exception ex) { return action.GetResponse().CatchExceptionWithLog(ex, $"领料单生成异常"); } } /// /// 根据领料单头拉单身 /// /// /// /// private static ApiAction GenerateReqDetailNew(List dtls, DbClient db) { Thread.Sleep(5000); var action = new ApiAction(); try { Logger.Interface.Info($"推送到新数据库,根据领料单头拉单身开始"); List entity_h = new(); List entity_d = new(); List transferH = new(); List sctrwos = new(); //查询出来的列表 List list_dOld = new(); foreach (var item_h in dtls) { var prd_h = db.Queryable().Where(s => s.BILLCODE == item_h.BILLCODE).Single(); if (prd_h?.STATUS != BIZ_ERP_PROD_OUT.STATUSs.COMPLETE.GetValue()) { var list_d = db.Queryable().Where(s => s.BILLCODE == item_h.BILLCODE).ToList(); var item_h_list = new List(); var ret = DI.Resolve().GetMaterialReqDetail(new ReqInputParameter { parameter = new reqParameter { sfdcdocno = item_h.BILLCODE }, datakey = new Datakey { EntId = item_h.ENTERPRISECODE.ToString(), CompanyId = item_h.STRONGHOID } }); List ret_list = new List(); if (ret.payload.std_data.execution.code != "0") { action.IsSuccessed = false; action.Message = $"错误信息:[{ret.payload.std_data.execution.description}]"; Logger.Default.Info(action.Message); var dt = DateTime.Now; while ((dt - DateTime.Now).TotalSeconds < 10) { } var ret1 = DI.Resolve().GetMaterialReqDetail(new ReqInputParameter { parameter = new reqParameter { sfdcdocno = item_h.BILLCODE }, datakey = new Datakey { EntId = item_h.ENTERPRISECODE.ToString(), CompanyId = item_h.STRONGHOID } }); if (ret1.payload.std_data.execution.code != "0") { action.IsSuccessed = false; action.Message = $"错误信息:[{ret1.payload.std_data.execution.description}]"; Logger.Default.Info(action.Message); return action; } else { ret_list = ret1.payload.std_data.parameter.@return; } } else { ret_list = ret.payload.std_data.parameter.@return; } foreach (var item in ret_list) { BIZ_ERP_PROD_OUT_DTL d = new BIZ_ERP_PROD_OUT_DTL { BILLCODE = item.sfdcdocno, BILLLINE = item.sfdcseq, UNITCODE = item.sfdc006, ITEM_CODE = item.sfdc004, PRQTY = Convert.ToDecimal(item.sfdc007), DELIVERYDATE = Convert.ToDateTime(item.sfdareqdt), WAREHOUSECODE = item.sfdc012, SOURCETYPE = Convert.ToInt32(item.sfdc003), SOURCECODE = item.sfdc001, SOURCELINE = item.sfdc002, AUTH_ORG = item_h.STRONGHOID, }; item_h_list.Add(d); } //保存委外工单号对应关系 WMS_SCTRWO_TRANSFER sctr = new WMS_SCTRWO_TRANSFER { ID = Guid.NewGuid().ToString("N"), ORIGINAL_WORKORDER = ret_list[0]?.sfdc001, TARGET_WORKORDER = ret_list[0]?.sfdc001_1 }; sctrwos.Add(sctr); action.Message += $",领料单明细获取成功,[{string.Join(",", item_h_list.Select(x => x.BILLCODE + ";" + x.ITEM_CODE).ToList())},获取总数[{item_h_list.Count}],数据库中总数[{list_d.Count}]"; action.Message += $",委外工单,[{string.Join(",", sctrwos.Select(x => x.ORIGINAL_WORKORDER + ";" + x.TARGET_WORKORDER).ToList())}"; if (list_d.Count != item_h_list.Count) { foreach (var d in list_d) { d.PRQTY = 0; } //需求数量都弄成0 } int n = 0; List prdDList = new List(); foreach (var item_d in item_h_list) { //根据单据重新到数据查找相应的单据明细 var prd_d = list_d.Where(s => s.BILLCODE == item_d.BILLCODE && s.BILLLINE == item_d.BILLLINE).FirstOrDefault(); prd_d = prd_d ?? new BIZ_ERP_PROD_OUT_DTL() { LINESTATUS = BIZ_ERP_PROD_OUT.STATUSs.INIT.GetValue(), QTY = Convert.ToDecimal(0), }; prd_d.BILLCODE = item_d.BILLCODE; prd_d.BILLLINE = item_d.BILLLINE; prd_d.UNITCODE = item_d.UNITCODE; prd_d.ITEM_CODE = item_d.ITEM_CODE; prd_d.PRQTY = Convert.ToDecimal(item_d.PRQTY); prd_d.DELIVERYDATE = Convert.ToDateTime(item_d.DELIVERYDATE); prd_d.WAREHOUSECODE = item_d.WAREHOUSECODE; prd_d.LINESTATUS = prd_d.PRQTY == prd_d.QTY ? BIZ_ERP_PROD_OUT.STATUSs.COMPLETE.GetValue() : Convert.ToDecimal(item_d.PRQTY) == 0 ? BIZ_ERP_PROD_OUT.STATUSs.COMPLETE.GetValue() : prd_d.LINESTATUS == BIZ_ERP_PROD_OUT.STATUSs.DELETE.GetValue() ? BIZ_ERP_PROD_OUT.STATUSs.INIT.GetValue() : prd_d.LINESTATUS; prd_d.SOURCETYPE = item_d.SOURCETYPE; prd_d.SOURCECODE = item_d.SOURCECODE; prd_d.SOURCELINE = item_d.SOURCELINE; prd_d.AUTH_ORG = item_d.AUTH_ORG; list_d.RemoveAll(q => q.BILLCODE == item_d.BILLCODE && q.BILLLINE == item_d.BILLLINE); if (prd_d.LINESTATUS == BIZ_ERP_PROD_OUT.STATUSs.COMPLETE.GetValue()) { n++; } prdDList.Add(prd_d); entity_d.Add(prd_d); } if (prdDList.Count == n) { prd_h.STATUS = BIZ_ERP_PROD_OUT.STATUSs.COMPLETE.GetValue(); } entity_h.Add(prd_h); list_dOld.AddRange(list_d); //检查有没有调拨单,有就更新状态为完成 var transferList = db.Queryable().Where(s => s.SOURCECODE == prd_h.BILLCODE).ToList(); if (transferList.Any()) { foreach (var item in transferList) { item.STATUS = BIZ_WMS_TRANSFER.STATUSs.FINISHED.GetValue(); item.SOURCECODE = prd_h.BILLCODE; transferH.Add(item); action.Message += $",领料单[{prd_h.BILLCODE}]对应调拨单[{item.BILLCODE}]完成"; } } } } //保存到数据库 var dbTran = db.UseTran(() => { db.Storageable(entity_h, "T100").ExecuteCommand(); db.Storageable(entity_d, "T100").ExecuteCommand(); if (transferH.Any()) { db.Updateable(transferH, "T100").ExecuteCommand(); } if (sctrwos.Any()) { //db.Insertable(sctrwos).ExecuteCommand(); var y = db.Storageable(sctrwos) .WhereColumns(t => new { t.ORIGINAL_WORKORDER, t.TARGET_WORKORDER }) .ToStorage(); y.AsInsertable.ExecuteCommand(); y.AsUpdateable.IgnoreColumns(t => t.ID).ExecuteCommand(); } if (list_dOld.Any()) { db.Deleteable(list_dOld).ExecuteCommand(); } }); if (!dbTran.IsSuccess) { action.CatchExceptionWithLog(dbTran.ErrorException, $"数据保存失败"); } //如果未过账则尝试过账 foreach (var reqNo in dtls.Select(x=>x.BILLCODE).ToList()) { Logger.Interface.Info($"开始检测是否T100重新推过来的领料单[{reqNo}]"); var req = db.Queryable().Where(x => x.BILLCODE == reqNo && x.STATUS == BIZ_ERP_PROD_OUT.STATUSs.COMPLETE.GetValue() && SqlFunc.IsNullOrEmpty(x.ERP_BILL_CODE)).First(); var dtlList = db.Queryable().Where(x => x.BILLCODE == reqNo).ToList(); if (req != null && dtlList.Where(x => x.LINESTATUS == BIZ_ERP_PROD_OUT.STATUSs.COMPLETE.GetValue()).Count() == dtlList.Count) { Logger.Interface.Info($"领料单[{reqNo}]重新过账准备进入过账进程"); iWMS.MaterialReqOldToErpNew(new MReqPostParam() {BillCode = req.BILLCODE, CompanyId=req.AUTH_ORG}); } } Logger.Interface.Info(action.Message); return action; } catch (System.Exception ex) { return action.GetResponse().CatchExceptionWithLog(ex, $"领料单生成异常"); } } /// /// 获取领料单列表 /// /// /// /// public ApiAction> GetProdMaterialReqHeaders(int pageIndex, int pageSize, string orgcode, string billcode) { var action = new ApiAction>(); var query = Biz.Db.Queryable().Where(x => (x.STATUS == BIZ_ERP_PROD_OUT.STATUSs.INIT.GetValue() || x.STATUS == BIZ_ERP_PROD_OUT.STATUSs.WORKING.GetValue()) && x.AUTH_ORG == orgcode) .WhereIF(!billcode.IsNullOrEmpty(),x=>x.BILLCODE.Contains(billcode)) .OrderByDescending(x => x.UPDATE_TIME.ToString("yyyy-MM-dd")) .OrderBy(x => x.REMARK == "L40774" ? 0 : 1) .OrderBy(x => x.SOURCECODE == null ? 1 : 0) .OrderBy(x => x.CREATE_TIME) .ToPage(pageIndex, pageSize); action.Data = query; return action; } public ApiAction> GetWoReqHeaders(int pageIndex, int pageSize, string orgcode, string billcode) { var action = new ApiAction>(); var query = Biz.Db.Queryable().Where(x => (x.STATUS == BIZ_ERP_PROD_OUT.STATUSs.INIT.GetValue() || x.STATUS == BIZ_ERP_PROD_OUT.STATUSs.WORKING.GetValue()) && x.AUTH_ORG == orgcode) .WhereIF(!billcode.IsNullOrEmpty(), x => x.BILLCODE.Contains(billcode)) .OrderByDescending(x => x.UPDATE_TIME.ToString("yyyy-MM-dd")) .OrderByDescending(x => x.BILLDATE) .OrderBy(x => new { x.CREATE_TIME, x.BILLCODE }) .ToPage(pageIndex, pageSize); action.Data = query; return action; } /// /// 调拨出库明细 /// /// /// /// /// /// public ApiAction> GetOutTransferHeaders(int pageIndex, int pageSize, string orgcode, string billcode) { var action = new ApiAction>(); var query = Biz.Db.Queryable().Where(x => (x.STATUS == BIZ_WMS_TRANSFER.STATUSs.INIT.GetValue() || x.STATUS == BIZ_WMS_TRANSFER.STATUSs.MANUAL.GetValue() || x.STATUS == BIZ_WMS_TRANSFER.STATUSs.WORKING.GetValue()) && x.AUTH_ORG == orgcode) .WhereIF(!billcode.IsNullOrEmpty(), x => x.BILLCODE.Contains(billcode)) .OrderByDescending(x => x.UPDATE_TIME.ToString("yyyy-MM-dd")) //.OrderBy(x => x.REMARK == "L40774" ? 0 : 1) //.OrderBy(x => x.SOURCECODE == null ? 1 : 0) .OrderByDescending(x => x.BILLDATE) .OrderBy(x => new { x.CREATE_TIME, x.BILLCODE}) //.OrderBy(x => x.CREATE_TIME) .ToPage(pageIndex, pageSize); action.Data = query; return action; } /// /// 领料单过账到T100 /// /// /// public ApiAction MaterialReqToErp(MReqPostParam param) { var action = new ApiAction(); Work.DoAsync(() => { Thread.Sleep(3000); try { BIZ_ERP_PROD_OUT entity_h = Biz.Db.Queryable().Where(x => x.BILLCODE == param.BillCode && x.ERP_BILL_CODE == null).First(); List entity_d = Biz.Db.Queryable().Where(x => x.BILLCODE == param.BillCode && Convert.ToInt32(x.PRQTY) != 0).ToList(); List details = new List(); foreach (var item in entity_d) { //计算数量 var qty = item.QTY > item.PRQTY ? item.PRQTY.ToString() : item.QTY.ToString(); details.Add(new Detail5 { sfdcseq = item.BILLLINE.ToString(), sfdc001 = item.SOURCECODE, sfdc002 = item.SOURCELINE.ToString(), sfdc003 = item.SOURCETYPE.ToString(), sfdc007 = qty, }); } var ret = ErpT100.MaterialReqToErp(new ReqErpInputParameter { parameter = new Parameter4 { sfdatype = entity_h.SOURCETYPE.ToString(), sfdadocno = entity_h.BILLCODE, detail = details }, datakey = new Datakey { EntId = "88", //ApiConfig.IsTestServer ? "108" : "88", CompanyId = param.CompanyId } }); if (ret.payload.std_data.execution.code == "0") //成功 { entity_h.ERP_BILL_CODE = ret.payload.std_data.parameter.docno; entity_h.UPDATE_TIME = DateTime.Now; action.Message += $"{action.Message.IsNullOrEmpty("", ";")}{ret.payload.std_data.execution.description},返回的ERP_BILL_CODE:[{ret.payload.std_data.parameter.docno}]"; Logger.Interface.Info(action.Message); } else //失败 { action.IsSuccessed = false; action.Message += $",领料单{entity_h.BILLCODE}过账失败,返回的信息:{ret.payload.std_data.execution.description}"; Logger.Interface.Error(action.Message); //return action; } //数据库处理操作 DbClient db = Business.Biz.Db; if (action.IsSuccessed) { action.Message += $",领料单{entity_h.BILLCODE}过账成功"; var dbTran = db.UseTran(() => { db.Updateable(entity_h).ExecuteCommand(); db.Updateable(entity_d).ExecuteCommand(); }); if (!dbTran.IsSuccess) { action.CatchExceptionWithLog(dbTran.ErrorException, $"数据处理失败"); } } Logger.Interface.Info(action.Message); //return action; } catch (Exception ex) { action.GetResponse().CatchExceptionWithLog(ex, $"发料单过账异常"); } }); return action; } } }