| | |
| | | using MailKit.Search; |
| | | using Microsoft.Scripting.Utils; |
| | | using Newtonsoft.Json; |
| | | using Newtonsoft.Json.Serialization; |
| | | using Org.BouncyCastle.Asn1.X509; |
| | |
| | | using Tiger.Model.Base; |
| | | using Tiger.Model.Entitys.MES.U9C; |
| | | using Tiger.Model.MES.Yada; |
| | | using static Microsoft.Scripting.Hosting.Shell.ConsoleHostOptions; |
| | | |
| | | namespace Tiger.Business.WMS.Extensions |
| | | { |
| | |
| | | return nameof(BIZ_MES_WO); |
| | | case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing: |
| | | return nameof(BIZ_U9_SCM_OUT); |
| | | case BIZ_WMS_PREP.BIZ_TYPEs.Transfer: |
| | | return nameof(BIZ_WMS_TRANSFER); |
| | | case BIZ_WMS_PREP.BIZ_TYPEs.Requisition: |
| | | default: |
| | | return ""; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 根据发料类型,获取发料单据的选择列表(带分页) |
| | | /// </summary> |
| | | /// <param name="input"></param> |
| | | /// <returns></returns> |
| | | public static PageAble<BIZ_WMS_PREP_SRC> GetPickList(this BIZ_WMS_PREP.BIZ_TYPEs type, BaseInputWithPage input) |
| | | { |
| | | // 查询单据明细 |
| | | var pickList = new PageAble<BIZ_WMS_PREP_SRC>(); |
| | | switch (type) |
| | | { |
| | | //case BIZ_WMS_PREP.BIZ_TYPEs.Others: |
| | | // { |
| | | // var dtls = Biz.Db.Queryable<BIZ_U9_MISC_OUT_DTL>().Where(q => q.ORDER_NO == orderNo).ToList(); |
| | | // pickList = dtls.Select(q => q.GetPickItem()).ToList(); |
| | | // } |
| | | // break; |
| | | //case BIZ_WMS_PREP.BIZ_TYPEs.WorkOrder: |
| | | // { |
| | | // var dtls = Biz.DataSource["YadaU9C"].Client.Queryable<mes_MOPickList>().Where(q => q.MoDocNo == orderNo).ToList(); |
| | | // pickList = dtls.Select(q => q.GetPickItem()).ToList(); |
| | | // } |
| | | // break; |
| | | //case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing: |
| | | // { |
| | | // var dtls = Biz.DataSource["YadaU9C"].Client.Queryable<mes_SCMPickList>().Where(q => q.PoDocNo == orderNo).ToList(); |
| | | // pickList = dtls.Select(q => q.GetPickItem()).ToList(); |
| | | // } |
| | | // break; |
| | | //case BIZ_WMS_PREP.BIZ_TYPEs.Transfer: |
| | | // { |
| | | // var dtls = Biz.Db.Queryable<BIZ_WMS_TRANSFER_DTL>().Where(q => q.ORDER_NO == orderNo).ToList(); |
| | | // pickList = dtls.Select(q => q.GetPickItem()).ToList(); |
| | | // } |
| | | // break; |
| | | case BIZ_WMS_PREP.BIZ_TYPEs.Requisition: |
| | | default: |
| | | break; |
| | | } |
| | | return pickList; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | pickList = dtls.Select(q => q.GetPickItem()).ToList(); |
| | | } |
| | | break; |
| | | case BIZ_WMS_PREP.BIZ_TYPEs.Transfer: |
| | | { |
| | | var dtls = Biz.Db.Queryable<BIZ_WMS_TRANSFER_DTL>().Where(q => q.ORDER_NO == orderNo).ToList(); |
| | | pickList = dtls.Select(q => q.GetPickItem()).ToList(); |
| | | } |
| | | break; |
| | | case BIZ_WMS_PREP.BIZ_TYPEs.Requisition: |
| | | default: |
| | | break; |
| | |
| | | case BIZ_WMS_PREP.BIZ_TYPEs.Others: |
| | | case BIZ_WMS_PREP.BIZ_TYPEs.WorkOrder: |
| | | case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing: |
| | | case BIZ_WMS_PREP.BIZ_TYPEs.Transfer: |
| | | case BIZ_WMS_PREP.BIZ_TYPEs.Requisition: |
| | | default: |
| | | return dtl.QTY_REQ; |
| | |
| | | /// <param name="trans"></param> |
| | | /// <param name="input"></param> |
| | | /// <returns></returns> |
| | | public static async Task<ApiAction> CommitToERP(this BIZ_WMS_PREP.BIZ_TYPEs type, Out_BIZ_WMS_PREP trans, BaseInput input) |
| | | public static async Task<ApiAction> GenerateDlvyBatch(this BIZ_WMS_PREP.BIZ_TYPEs type, Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range) |
| | | { |
| | | switch (type) |
| | | { |
| | | case BIZ_WMS_PREP.BIZ_TYPEs.Others: |
| | | return await MiscShipApprove(trans, input); |
| | | return await MiscShipApprove(trans, range); |
| | | case BIZ_WMS_PREP.BIZ_TYPEs.WorkOrder: |
| | | return await CreateIssueDoc(trans, input); |
| | | return await CreateIssueDoc(trans, range); |
| | | case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing: |
| | | return await CreatePMIssueDoc(trans, input); |
| | | return await CreatePMIssueDoc(trans, range); |
| | | case BIZ_WMS_PREP.BIZ_TYPEs.Transfer: |
| | | return await TransferComplete(trans, range); |
| | | case BIZ_WMS_PREP.BIZ_TYPEs.Requisition: |
| | | default: |
| | | throw new NotImplementedException($"发料单据类型[{type.GetDesc()}]未实现ERP接口调用"); |
| | |
| | | /// U9杂发单审核 |
| | | /// </summary> |
| | | /// <param name="trans"></param> |
| | | /// <param name="input"></param> |
| | | /// <param name="range"></param> |
| | | /// <returns></returns> |
| | | private static async Task<ApiAction> MiscShipApprove(Out_BIZ_WMS_PREP trans, BaseInput input) |
| | | private static async Task<ApiAction> MiscShipApprove(Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range) |
| | | { |
| | | var action = new ApiAction(); |
| | | |
| | |
| | | return action; |
| | | } |
| | | |
| | | var batch = new BIZ_WMS_PREP_BTH() |
| | | { |
| | | AUTH_ORG = trans.CurPREP.Order.AUTH_ORG, |
| | | ORDER_NO = trans.CurPREP.Order.ORDER_NO, |
| | | DLVY_BATCH = $"{DateTime.Now:yyMMddHHmmssfff}", |
| | | STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(), |
| | | PREP_PERSON = trans.UserCode, |
| | | FINISH_TIME = DateTime.Now, |
| | | REQ_PERSON = trans.UserCode, |
| | | DLVY_TIME = DateTime.Now, |
| | | }; |
| | | trans.CurPREP.Order.Batchs.Add(batch); |
| | | |
| | | foreach (var item in trans.CurPREP.Order.SourceDetails) |
| | | { |
| | | item.QTY_ACT_DLVY = item.QTY_ACT_REQ; |
| | | } |
| | | trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue(); |
| | | trans.CurPREP.Order.CurBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(); |
| | | trans.CurPREP.Order.CurBatch.PREP_PERSON = trans.UserCode; |
| | | trans.CurPREP.Order.CurBatch.FINISH_TIME = DateTime.Now; |
| | | trans.CurPREP.Order.CurBatch.REQ_PERSON = trans.UserCode; |
| | | trans.CurPREP.Order.CurBatch.DLVY_TIME = DateTime.Now; |
| | | var orders = trans.MainDB.Queryable<BIZ_U9_MISC_OUT>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.ORDER_NO)).ToList(); |
| | | foreach (var item in orders) |
| | | { |
| | |
| | | item.REQ_PERSON = trans.UserCode; |
| | | item.DLVY_TIME = DateTime.Now; |
| | | } |
| | | var items = trans.MainDB.Queryable<WMS_ITEM>().Where(q => q.TRANS_NO == trans.CurPREP.Order.ORDER_NO).ToList(); |
| | | var history = new List<WMS_ITEM_HIS>(); |
| | | foreach (var item in items) |
| | | { |
| | | item.STATUS = WMS_ITEM.STATUSs.Sended.GetValue(); |
| | | history.Add(new WMS_ITEM_HIS(item, $"条码[{item.SN}]发料过账成功,操作单据[{item.TRANS_NO}]")); |
| | | } |
| | | |
| | | //使用统一的事务DB对象 |
| | | var db = trans.GetCommitDB(); |
| | | var dbTran = db.UseTran(() => |
| | | { |
| | | db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand(); |
| | | db.Updateable(trans.CurPREP.Order.CurBatch, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand(); |
| | | db.Updateable(trans.CurPREP.Order.SourceDetails, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.QTY_ACT_DLVY }).ExecuteCommand(); |
| | | db.Insertable(batch, trans.UserCode).ExecuteCommand(); |
| | | db.Updateable<BIZ_WMS_PREP_SN>(trans.UserCode).Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO) |
| | | .SetColumns(q => q.DLVY_BATCH == batch.DLVY_BATCH).SetColumns(q => q.STATUS == WMS_ITEM.STATUSs.Sended.GetValue()).ExecuteCommand(); |
| | | db.Updateable(items, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand(); |
| | | db.Insertable(history, trans.UserCode).ExecuteCommand(); |
| | | db.Updateable(orders, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand(); |
| | | }); |
| | | if (dbTran.IsSuccess) |
| | |
| | | } |
| | | return action; |
| | | } |
| | | /// <summary> |
| | | /// U9创建委外生产领料单 |
| | | /// </summary> |
| | | /// <param name="trans"></param> |
| | | /// <param name="input"></param> |
| | | /// <returns></returns> |
| | | private static async Task<ApiAction> CreatePMIssueDoc(Out_BIZ_WMS_PREP trans, BaseInput input) |
| | | { |
| | | var action = new ApiAction(); |
| | | |
| | | var dtls = trans.MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO).ToList(); |
| | | var noFinish = dtls.Where(q => q.QTY_PREP < BIZ_WMS_PREP.BIZ_TYPEs.Others.GetActReqQty(q)); |
| | | if (noFinish.Any()) |
| | | { |
| | | action.IsSuccessed = false; |
| | | //action.LocaleMsg = Biz.L("备料任务[{0}]未能提交审核,未备料完成的行如下:{1}"); |
| | | action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.MiscShipApprove.NoFinish", trans.CurPREP.Order.ORDER_NO, string.Join(",", noFinish.Select(q => q.ORDER_LINE))); |
| | | return action; |
| | | } |
| | | |
| | | var iInput = new MiscShipApproveInput { MiscShipApproveParam = trans.CurPREP.Order.SourceOrders.Select(q => new MiscShipApproveParam() { Code = q.ORDER_NO }).ToList() }; |
| | | var result = await DI.Resolve<IWMS_U9C>().MiscShipApprove(iInput); |
| | | if (!result.IsSuccessed) |
| | | { |
| | | action.IsSuccessed = false; |
| | | action.LocaleMsg = result.LocaleMsg; |
| | | return action; |
| | | } |
| | | |
| | | trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue(); |
| | | trans.CurPREP.Order.CurBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(); |
| | | trans.CurPREP.Order.CurBatch.PREP_PERSON = trans.UserCode; |
| | | trans.CurPREP.Order.CurBatch.FINISH_TIME = DateTime.Now; |
| | | trans.CurPREP.Order.CurBatch.REQ_PERSON = trans.UserCode; |
| | | trans.CurPREP.Order.CurBatch.DLVY_TIME = DateTime.Now; |
| | | var orders = trans.MainDB.Queryable<BIZ_U9_MISC_OUT>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.ORDER_NO)).ToList(); |
| | | foreach (var item in orders) |
| | | { |
| | | item.STATUS = BIZ_U9_MISC_OUT.STATUSs.Sended.GetValue(); |
| | | item.PREP_PERSON = trans.UserCode; |
| | | item.FINISH_TIME = DateTime.Now; |
| | | item.REQ_PERSON = trans.UserCode; |
| | | item.DLVY_TIME = DateTime.Now; |
| | | } |
| | | |
| | | //使用统一的事务DB对象 |
| | | var db = trans.GetCommitDB(); |
| | | var dbTran = db.UseTran(() => |
| | | { |
| | | db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand(); |
| | | db.Updateable(trans.CurPREP.Order.CurBatch, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand(); |
| | | db.Updateable(orders, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand(); |
| | | }); |
| | | if (dbTran.IsSuccess) |
| | | { |
| | | //action.LocaleMsg = Biz.L($"杂发单审核成功,单号如下:{0}"); |
| | | action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.MiscShipApprove.Success", string.Join(",", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER))); |
| | | } |
| | | else |
| | | { |
| | | Logger.Default.Fatal(dbTran.ErrorException, "Database transaction save exception"); |
| | | //抛出异常 |
| | | throw dbTran.ErrorException; |
| | | } |
| | | return action; |
| | | } |
| | | /// <summary> |
| | | /// U9创建生产领料单 |
| | | /// </summary> |
| | | /// <param name="trans"></param> |
| | | /// <param name="input"></param> |
| | | /// <param name="range"></param> |
| | | /// <returns></returns> |
| | | private static async Task<ApiAction> CreateIssueDoc(Out_BIZ_WMS_PREP trans, BaseInput input) |
| | | private static async Task<ApiAction> CreateIssueDoc(Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range) |
| | | { |
| | | var action = new ApiAction(); |
| | | |
| | | var dtls = trans.MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO).ToList(); |
| | | var noFinish = dtls.Where(q => q.QTY_PREP < BIZ_WMS_PREP.BIZ_TYPEs.Others.GetActReqQty(q)); |
| | | if (noFinish.Any()) |
| | | var sns = trans.MainDB.Queryable<BIZ_WMS_PREP_SN>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO && q.STATUS == WMS_ITEM.STATUSs.OffShelf.GetValue()) |
| | | .WhereIF(range == BIZ_WMS_PREP_BTH.BATCH_RANGEs.CurTrans, q => q.TRACE_ID == trans.TransID) |
| | | .WhereIF(range == BIZ_WMS_PREP_BTH.BATCH_RANGEs.CurWH, q => q.WH_ID == trans.CurPREP.Option.WHID) |
| | | .ToList(); |
| | | if (!sns.Any()) |
| | | { |
| | | action.IsSuccessed = false; |
| | | //action.LocaleMsg = Biz.L("备料任务[{0}]未能提交审核,未备料完成的行如下:{1}"); |
| | | action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.MiscShipApprove.NoFinish", trans.CurPREP.Order.ORDER_NO, string.Join(",", noFinish.Select(q => q.ORDER_LINE))); |
| | | //action.LocaleMsg = Biz.L("创建生产领料单失败,备料任务[{0}]未找到{1}已下架的物料数据"); |
| | | action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreateIssueDoc.NoSns", trans.CurPREP.Order.ORDER_NO, range.GetDesc()); |
| | | return action; |
| | | } |
| | | var wos = Biz.DataSource["YadaU9C"].Client.Queryable<mes_Mo>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.DocNo)).ToList(); |
| | | var temp = sns.GroupBy(q => new { q.ITEM_CODE, q.UNIT, q.WH_CODE, q.LOCATION_CODE }) |
| | | .Select(g => new PickListDTOs |
| | | { |
| | | Item = new() { Code = g.Key.ITEM_CODE }, |
| | | IssueWh = new() { Code = g.Key.WH_CODE }, |
| | | IssueBin = new() { code = g.Key.LOCATION_CODE }, |
| | | IssueQty = g.Sum(q => q.QTY), |
| | | IssuedQty = g.Sum(q => q.QTY), |
| | | IssueUOM = new() { Code = g.Key.UNIT.IsNullOrEmpty("PCS") }, |
| | | Lot = new() { code = g.Max(q => q.LOTNO) }, |
| | | }).ToList(); |
| | | var pickList = new List<PickListDTOs>(); |
| | | var prepSrcList = new List<BIZ_WMS_PREP_SRC_DTL>(); |
| | | foreach (var dtl in temp) |
| | | { |
| | | var remain = dtl.IssueQty; |
| | | var srcDtls = trans.CurPREP.Order.SourceDetails.Where(q => q.ITEM_CODE == dtl.Item.Code).ToList(); |
| | | var count = srcDtls.Count; |
| | | foreach (var src in srcDtls) |
| | | { |
| | | var actQty = src.QTY_ACT_REQ - src.QTY_ACT_DLVY; |
| | | if (remain > 0 && actQty > 0) |
| | | { |
| | | //实际需求大于剩余待分配数量,或者当前是最后一个来源明细行,则分配剩余数量 |
| | | var dlvy = (actQty > remain || count == 1) ? remain : actQty; |
| | | src.QTY_ACT_DLVY += dlvy; |
| | | prepSrcList.Add(src); |
| | | var pick = new PickListDTOs |
| | | { |
| | | Item = dtl.Item, |
| | | IssueWh = dtl.IssueWh, |
| | | IssueBin = dtl.IssueBin, |
| | | IssueQty = dlvy, |
| | | IssuedQty = dlvy, |
| | | IssueUOM = dtl.IssueUOM, |
| | | MOPickList = src.SOURCE_ID.ToInt64(), |
| | | Lot = dtl.Lot, |
| | | }; |
| | | pickList.Add(pick); |
| | | remain -= pick.IssueQty; |
| | | } |
| | | count--; |
| | | } |
| | | } |
| | | |
| | | var iInput = new MiscShipApproveInput { MiscShipApproveParam = trans.CurPREP.Order.SourceOrders.Select(q => new MiscShipApproveParam() { Code = q.ORDER_NO }).ToList() }; |
| | | var result = await DI.Resolve<IWMS_U9C>().MiscShipApprove(iInput); |
| | | var iInput = new CreateProdMaterialReqInput {CreateProdMaterialReqParam = new() { new() { |
| | | MOs = trans.CurPREP.Order.SourceOrders.Select(q => new MOs { Code = q.SOURCE_ORDER }).ToList(), |
| | | PickListDTOs = pickList, |
| | | BusinessType = wos.First().BusinessType, |
| | | }}}; |
| | | var result = await DI.Resolve<IWMS_U9C>().CreateProdMaterialReq(iInput); |
| | | if (!result.IsSuccessed) |
| | | { |
| | | action.IsSuccessed = false; |
| | |
| | | return action; |
| | | } |
| | | |
| | | trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue(); |
| | | trans.CurPREP.Order.CurBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(); |
| | | trans.CurPREP.Order.CurBatch.PREP_PERSON = trans.UserCode; |
| | | trans.CurPREP.Order.CurBatch.FINISH_TIME = DateTime.Now; |
| | | trans.CurPREP.Order.CurBatch.REQ_PERSON = trans.UserCode; |
| | | trans.CurPREP.Order.CurBatch.DLVY_TIME = DateTime.Now; |
| | | var orders = trans.MainDB.Queryable<BIZ_U9_MISC_OUT>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.ORDER_NO)).ToList(); |
| | | foreach (var item in orders) |
| | | |
| | | var batch = new BIZ_WMS_PREP_BTH() |
| | | { |
| | | item.STATUS = BIZ_U9_MISC_OUT.STATUSs.Sended.GetValue(); |
| | | item.PREP_PERSON = trans.UserCode; |
| | | item.FINISH_TIME = DateTime.Now; |
| | | item.REQ_PERSON = trans.UserCode; |
| | | item.DLVY_TIME = DateTime.Now; |
| | | AUTH_ORG = trans.CurPREP.Order.AUTH_ORG, |
| | | ORDER_NO = trans.CurPREP.Order.ORDER_NO, |
| | | DLVY_BATCH = $"{DateTime.Now:yyMMddHHmmssfff}", |
| | | STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(), |
| | | PREP_PERSON = trans.UserCode, |
| | | FINISH_TIME = DateTime.Now, |
| | | REQ_PERSON = trans.UserCode, |
| | | REQ_ID = string.Join(",", result.Data.Select(q => q.m_iD)), |
| | | REQ_ORDER = string.Join(",", result.Data.Select(q => q.m_code)), |
| | | DLVY_TIME = DateTime.Now, |
| | | }; |
| | | trans.CurPREP.Order.Batchs.Add(batch); |
| | | foreach (var sn in sns) |
| | | { |
| | | sn.DLVY_BATCH = batch.DLVY_BATCH; |
| | | sn.STATUS = WMS_ITEM.STATUSs.Sended.GetValue(); |
| | | } |
| | | |
| | | var items = trans.MainDB.Queryable<WMS_ITEM>().Where(q => sns.Select(s => s.SN).Contains(q.SN)).ToList(); |
| | | var history = new List<WMS_ITEM_HIS>(); |
| | | foreach (var item in items) |
| | | { |
| | | item.STATUS = WMS_ITEM.STATUSs.Sended.GetValue(); |
| | | history.Add(new WMS_ITEM_HIS(item, $"条码[{item.SN}]发料过账成功,操作单据[{item.TRANS_NO}]")); |
| | | } |
| | | |
| | | var dtls = trans.MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO).ToList(); |
| | | var noFinish = dtls.Where(q => q.QTY_PREP < BIZ_WMS_PREP.BIZ_TYPEs.Others.GetActReqQty(q)); |
| | | if (!noFinish.Any()) |
| | | { |
| | | trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue(); |
| | | } |
| | | |
| | | //使用统一的事务DB对象 |
| | |
| | | var dbTran = db.UseTran(() => |
| | | { |
| | | db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand(); |
| | | db.Updateable(trans.CurPREP.Order.CurBatch, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand(); |
| | | db.Updateable(orders, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand(); |
| | | db.Updateable(prepSrcList, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.QTY_ACT_DLVY }).ExecuteCommand(); |
| | | db.Insertable(batch, trans.UserCode).ExecuteCommand(); |
| | | db.Updateable(sns, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.DLVY_BATCH }).ExecuteCommand(); |
| | | db.Updateable(items, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand(); |
| | | db.Insertable(history, trans.UserCode).ExecuteCommand(); |
| | | }); |
| | | if (dbTran.IsSuccess) |
| | | { |
| | | //action.LocaleMsg = Biz.L($"杂发单审核成功,单号如下:{0}"); |
| | | //action.LocaleMsg = Biz.L($"创建生产领料单[{0}]成功,来源单号如下:{1}"); |
| | | action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreateIssueDoc.Success", batch.REQ_ORDER, string.Join(",", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER))); |
| | | } |
| | | else |
| | | { |
| | | Logger.Default.Fatal(dbTran.ErrorException, "Database transaction save exception"); |
| | | //抛出异常 |
| | | throw dbTran.ErrorException; |
| | | } |
| | | return action; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// U9创建委外生产领料单 |
| | | /// </summary> |
| | | /// <param name="trans"></param> |
| | | /// <param name="range"></param> |
| | | /// <returns></returns> |
| | | private static async Task<ApiAction> CreatePMIssueDoc(Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range) |
| | | { |
| | | var action = new ApiAction(); |
| | | |
| | | var sns = trans.MainDB.Queryable<BIZ_WMS_PREP_SN>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO && q.STATUS == WMS_ITEM.STATUSs.OffShelf.GetValue()) |
| | | .WhereIF(range == BIZ_WMS_PREP_BTH.BATCH_RANGEs.CurTrans, q => q.TRACE_ID == trans.TransID) |
| | | .WhereIF(range == BIZ_WMS_PREP_BTH.BATCH_RANGEs.CurWH, q => q.WH_ID == trans.CurPREP.Option.WHID) |
| | | .ToList(); |
| | | if (!sns.Any()) |
| | | { |
| | | action.IsSuccessed = false; |
| | | //action.LocaleMsg = Biz.L("创建委外生产领料单失败,备料任务[{0}]未找到{1}已下架的物料数据"); |
| | | action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreatePMIssueDoc.NoSns", trans.CurPREP.Order.ORDER_NO, range.GetDesc()); |
| | | return action; |
| | | } |
| | | var temp = sns.GroupBy(q => new { q.ITEM_CODE, q.UNIT, q.WH_CODE, q.LOCATION_CODE }) |
| | | .Select(g => new PickListDTOs2 |
| | | { |
| | | Item = new() { Code = g.Key.ITEM_CODE }, |
| | | IssueWh = new() { Code = g.Key.WH_CODE }, |
| | | IssueBin = new() { code = g.Key.LOCATION_CODE }, |
| | | IssueQty = g.Sum(q => q.QTY), |
| | | IssuedQty = g.Sum(q => q.QTY), |
| | | IssueUOM = new() { Code = g.Key.UNIT.IsNullOrEmpty("PCS") }, |
| | | Lot = new() { code = g.Max(q => q.LOTNO) }, |
| | | }).ToList(); |
| | | var pickList = new List<PickListDTOs2>(); |
| | | var prepSrcList = new List<BIZ_WMS_PREP_SRC_DTL>(); |
| | | foreach (var dtl in temp) |
| | | { |
| | | var remain = dtl.IssueQty; |
| | | var srcDtls = trans.CurPREP.Order.SourceDetails.Where(q => q.ITEM_CODE == dtl.Item.Code).ToList(); |
| | | var count = srcDtls.Count; |
| | | foreach (var src in srcDtls) |
| | | { |
| | | var actQty = src.QTY_ACT_REQ - src.QTY_ACT_DLVY; |
| | | if (remain > 0 && actQty > 0) |
| | | { |
| | | //实际需求大于剩余待分配数量,或者当前是最后一个来源明细行,则分配剩余数量 |
| | | var dlvy = (actQty > remain || count == 1) ? remain : actQty; |
| | | src.QTY_ACT_DLVY += dlvy; |
| | | prepSrcList.Add(src); |
| | | var pick = new PickListDTOs2 |
| | | { |
| | | Item = dtl.Item, |
| | | IssueWh = dtl.IssueWh, |
| | | IssueBin = dtl.IssueBin, |
| | | IssueQty = dlvy, |
| | | IssuedQty = dlvy, |
| | | IssueUOM = dtl.IssueUOM, |
| | | SCMOPickList = src.SOURCE_ID.ToInt64(), |
| | | Lot = dtl.Lot, |
| | | }; |
| | | pickList.Add(pick); |
| | | remain -= pick.IssueQty; |
| | | } |
| | | count--; |
| | | } |
| | | } |
| | | |
| | | var iInput = new CreateOutProdMaterialReqInput { CreateOutProdMaterialReqParam = new() { new() { |
| | | POLine = trans.CurPREP.Order.SourceOrders.Select(q => new POLine { Code = q.SOURCE_ORDER }).ToList(), |
| | | BusinessDate = DateTime.Now.ToString("yyyy-MM-dd"), |
| | | PickListDTOs = pickList, |
| | | BusinessCreatedOn = DateTime.Now.ToString("yyyy-MM-dd"), |
| | | }}}; |
| | | var result = await DI.Resolve<IWMS_U9C>().CreateOutProdMaterialReq(iInput); |
| | | if (!result.IsSuccessed) |
| | | { |
| | | action.IsSuccessed = false; |
| | | action.LocaleMsg = result.LocaleMsg; |
| | | return action; |
| | | } |
| | | |
| | | var batch = new BIZ_WMS_PREP_BTH() |
| | | { |
| | | AUTH_ORG = trans.CurPREP.Order.AUTH_ORG, |
| | | ORDER_NO = trans.CurPREP.Order.ORDER_NO, |
| | | DLVY_BATCH = $"{DateTime.Now:yyMMddHHmmssfff}", |
| | | STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(), |
| | | PREP_PERSON = trans.UserCode, |
| | | FINISH_TIME = DateTime.Now, |
| | | REQ_PERSON = trans.UserCode, |
| | | REQ_ID = string.Join(",", result.Data.Select(q => q.m_iD)), |
| | | REQ_ORDER = string.Join(",", result.Data.Select(q => q.m_code)), |
| | | DLVY_TIME = DateTime.Now, |
| | | }; |
| | | trans.CurPREP.Order.Batchs.Add(batch); |
| | | foreach (var sn in sns) |
| | | { |
| | | sn.DLVY_BATCH = batch.DLVY_BATCH; |
| | | sn.STATUS = WMS_ITEM.STATUSs.Sended.GetValue(); |
| | | } |
| | | |
| | | var items = trans.MainDB.Queryable<WMS_ITEM>().Where(q => sns.Select(s => s.SN).Contains(q.SN)).ToList(); |
| | | var history = new List<WMS_ITEM_HIS>(); |
| | | foreach (var item in items) |
| | | { |
| | | item.STATUS = WMS_ITEM.STATUSs.Sended.GetValue(); |
| | | history.Add(new WMS_ITEM_HIS(item, $"条码[{item.SN}]发料过账成功,操作单据[{item.TRANS_NO}]")); |
| | | } |
| | | |
| | | var dtls = trans.MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO).ToList(); |
| | | var noFinish = dtls.Where(q => q.QTY_PREP < BIZ_WMS_PREP.BIZ_TYPEs.Others.GetActReqQty(q)); |
| | | var orders = new List<BIZ_U9_SCM_OUT>(); |
| | | if (!noFinish.Any()) |
| | | { |
| | | trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue(); |
| | | orders = trans.MainDB.Queryable<BIZ_U9_SCM_OUT>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.ORDER_NO)).ToList(); |
| | | foreach (var item in orders) |
| | | { |
| | | item.STATUS = BIZ_U9_SCM_OUT.STATUSs.Sended.GetValue(); |
| | | item.PREP_PERSON = trans.UserCode; |
| | | item.FINISH_TIME = DateTime.Now; |
| | | item.REQ_PERSON = trans.UserCode; |
| | | item.DLVY_TIME = DateTime.Now; |
| | | } |
| | | } |
| | | |
| | | //使用统一的事务DB对象 |
| | | var db = trans.GetCommitDB(); |
| | | var dbTran = db.UseTran(() => |
| | | { |
| | | db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand(); |
| | | db.Updateable(prepSrcList, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.QTY_ACT_DLVY }).ExecuteCommand(); |
| | | db.Insertable(batch, trans.UserCode).ExecuteCommand(); |
| | | db.Updateable(sns, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.DLVY_BATCH }).ExecuteCommand(); |
| | | db.Updateable(items, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand(); |
| | | db.Insertable(history, trans.UserCode).ExecuteCommand(); |
| | | if (orders.Any()) |
| | | { |
| | | db.Updateable(orders, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand(); |
| | | } |
| | | }); |
| | | if (dbTran.IsSuccess) |
| | | { |
| | | //action.LocaleMsg = Biz.L($"创建委外生产领料单[{0}]成功,来源单号如下:{1}"); |
| | | action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.CreatePMIssueDoc.Success", batch.REQ_ORDER, string.Join(",", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER))); |
| | | } |
| | | else |
| | | { |
| | | Logger.Default.Fatal(dbTran.ErrorException, "Database transaction save exception"); |
| | | //抛出异常 |
| | | throw dbTran.ErrorException; |
| | | } |
| | | return action; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 调拨单完成发料 |
| | | /// </summary> |
| | | /// <param name="trans"></param> |
| | | /// <param name="range"></param> |
| | | /// <returns></returns> |
| | | private static async Task<ApiAction> TransferComplete(Out_BIZ_WMS_PREP trans, BIZ_WMS_PREP_BTH.BATCH_RANGEs range) |
| | | { |
| | | var action = new ApiAction(); |
| | | |
| | | var dtls = trans.MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO).ToList(); |
| | | var noFinish = dtls.Where(q => q.QTY_PREP < BIZ_WMS_PREP.BIZ_TYPEs.Transfer.GetActReqQty(q)); |
| | | if (noFinish.Any()) |
| | | { |
| | | action.IsSuccessed = false; |
| | | //action.LocaleMsg = Biz.L("备料任务[{0}]未能提交审核,未备料完成的行如下:{1}"); |
| | | action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.TransferComplete.NoFinish", trans.CurPREP.Order.ORDER_NO, string.Join(",", noFinish.Select(q => q.ORDER_LINE))); |
| | | return action; |
| | | } |
| | | |
| | | var batch = new BIZ_WMS_PREP_BTH() |
| | | { |
| | | AUTH_ORG = trans.CurPREP.Order.AUTH_ORG, |
| | | ORDER_NO = trans.CurPREP.Order.ORDER_NO, |
| | | DLVY_BATCH = $"{DateTime.Now:yyMMddHHmmssfff}", |
| | | STATUS = BIZ_WMS_PREP_BTH.STATUSs.Sended.GetValue(), |
| | | PREP_PERSON = trans.UserCode, |
| | | FINISH_TIME = DateTime.Now, |
| | | REQ_PERSON = trans.UserCode, |
| | | DLVY_TIME = DateTime.Now, |
| | | }; |
| | | trans.CurPREP.Order.Batchs.Add(batch); |
| | | |
| | | foreach (var item in trans.CurPREP.Order.SourceDetails) |
| | | { |
| | | item.QTY_ACT_DLVY = item.QTY_ACT_REQ; |
| | | } |
| | | trans.CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Sended.GetValue(); |
| | | //var orders = trans.MainDB.Queryable<BIZ_WMS_TRANSFER>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.ORDER_NO)).ToList(); |
| | | //foreach (var item in orders) |
| | | //{ |
| | | // item.STATUS = BIZ_WMS_TRANSFER.STATUSs.Sended.GetValue(); |
| | | // item.PREP_PERSON = trans.UserCode; |
| | | // item.FINISH_TIME = DateTime.Now; |
| | | // item.REQ_PERSON = trans.UserCode; |
| | | // item.DLVY_TIME = DateTime.Now; |
| | | //} |
| | | var items = trans.MainDB.Queryable<WMS_ITEM>().Where(q => q.TRANS_NO == trans.CurPREP.Order.ORDER_NO).ToList(); |
| | | var history = new List<WMS_ITEM_HIS>(); |
| | | foreach(var item in items) |
| | | { |
| | | item.STATUS = WMS_ITEM.STATUSs.Sended.GetValue(); |
| | | history.Add(new WMS_ITEM_HIS(item, $"条码[{item.SN}]发料成功,操作单据[{item.TRANS_NO}]")); |
| | | } |
| | | |
| | | //使用统一的事务DB对象 |
| | | var db = trans.GetCommitDB(); |
| | | var dbTran = db.UseTran(() => |
| | | { |
| | | db.Updateable(trans.CurPREP.Order, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand(); |
| | | db.Updateable(trans.CurPREP.Order.SourceDetails, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.QTY_ACT_DLVY }).ExecuteCommand(); |
| | | db.Insertable(batch, trans.UserCode).ExecuteCommand(); |
| | | db.Updateable<BIZ_WMS_PREP_SN>(trans.UserCode).Where(q => q.ORDER_NO == trans.CurPREP.Order.ORDER_NO) |
| | | .SetColumns(q => q.DLVY_BATCH == batch.DLVY_BATCH).SetColumns(q => q.STATUS == WMS_ITEM.STATUSs.Sended.GetValue()).ExecuteCommand(); |
| | | db.Updateable(items, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand(); |
| | | db.Insertable(history, trans.UserCode).ExecuteCommand(); |
| | | //db.Updateable(orders, trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.PREP_PERSON, q.FINISH_TIME, q.REQ_PERSON, q.DLVY_TIME }).ExecuteCommand(); |
| | | }); |
| | | if (dbTran.IsSuccess) |
| | | { |
| | | //action.LocaleMsg = Biz.L($"调拨单发料完成,单号如下:{0}"); |
| | | action.LocaleMsg = Biz.L("WMS.BIZ_WMS_PREP.MiscShipApprove.Success", string.Join(",", trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER))); |
| | | } |
| | | else |
| | |
| | | } |
| | | return action; |
| | | } |
| | | |
| | | }//endClass |
| | | } |