using MailKit.Search;
|
using Microsoft.Scripting.Utils;
|
using Newtonsoft.Json;
|
using Newtonsoft.Json.Serialization;
|
using Org.BouncyCastle.Asn1.X509;
|
using Org.BouncyCastle.Ocsp;
|
using Rhea.Common;
|
using SqlSugar;
|
using System;
|
using System.IO;
|
using Tiger.Business.WMS.Transaction;
|
using Tiger.IBusiness;
|
using Tiger.Model;
|
using Tiger.Model.Base;
|
using Tiger.Model.Entitys.MES.U9C;
|
using Tiger.Model.MES.Yada;
|
|
namespace Tiger.Business.WMS.Extensions
|
{
|
/// <summary>
|
/// 工单发料扩展方法
|
/// </summary>
|
public static class OutExtension
|
{
|
/// <summary>
|
/// 根据发料类型,获取来源单据编码
|
/// </summary>
|
/// <param name="type"></param>
|
/// <returns></returns>
|
public static string GetSourceCode(this BIZ_WMS_PREP.BIZ_TYPEs type)
|
{
|
switch (type)
|
{
|
case BIZ_WMS_PREP.BIZ_TYPEs.Others:
|
return nameof(BIZ_U9_MISC_OUT);
|
case BIZ_WMS_PREP.BIZ_TYPEs.WorkOrder:
|
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>
|
/// 根据发料类型,获取发料单据来源明细
|
/// </summary>
|
/// <param name="type"></param>
|
/// <param name="orderNo"></param>
|
/// <returns></returns>
|
public static List<BIZ_WMS_PREP_SRC_DTL> GetPickList(this BIZ_WMS_PREP.BIZ_TYPEs type, string orderNo)
|
{
|
// 查询单据明细
|
var pickList = new List<BIZ_WMS_PREP_SRC_DTL>();
|
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>
|
/// 实际需求数量计算方法
|
/// </summary>
|
/// <param name="type"></param>
|
/// <param name="dtl"></param>
|
/// <returns></returns>
|
public static double GetActReqQty(this BIZ_WMS_PREP.BIZ_TYPEs type, BIZ_WMS_PREP_DTL dtl)
|
{
|
switch (type)
|
{
|
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;
|
}
|
}
|
|
/// <summary>
|
/// 根据发料类型,调用相应发料单据的ERP接口
|
/// </summary>
|
/// <param name="type"></param>
|
/// <param name="trans"></param>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
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, range);
|
case BIZ_WMS_PREP.BIZ_TYPEs.WorkOrder:
|
return await CreateIssueDoc(trans, range);
|
case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing:
|
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接口调用");
|
}
|
}
|
|
/// <summary>
|
/// U9杂发单审核
|
/// </summary>
|
/// <param name="trans"></param>
|
/// <param name="range"></param>
|
/// <returns></returns>
|
private static async Task<ApiAction> MiscShipApprove(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())
|
{
|
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;
|
}
|
|
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_U9_MISC_OUT>().Where(q => trans.CurPREP.Order.SourceOrders.Select(s => s.SOURCE_ORDER).Contains(q.ORDER_NO)).IncludesAllFirstLayer().ToList();
|
foreach (var order in orders)
|
{
|
order.STATUS = BIZ_U9_MISC_OUT.STATUSs.Sended.GetValue();
|
order.PREP_PERSON = trans.UserCode;
|
order.FINISH_TIME = DateTime.Now;
|
order.REQ_PERSON = trans.UserCode;
|
order.DLVY_TIME = DateTime.Now;
|
foreach (var dtl in order.Details)
|
{
|
dtl.STATUS = BIZ_WMS_TRANSFER.STATUSs.Sended.GetValue();
|
}
|
order.SnList ??= new();
|
foreach (var sn in trans.CurPREP.Order.SnList)
|
{
|
var dtl = order.Details.Where(q => q.ITEM_CODE == sn.ITEM_CODE).First();
|
order.SnList.Add(new()
|
{
|
AUTH_ORG = dtl.AUTH_ORG,
|
ORDER_NO = dtl.ORDER_NO,
|
LINE_NO = dtl.LINE_NO,
|
SN = sn.SN,
|
STATUS = sn.STATUS,
|
ITEM_CODE = sn.ITEM_CODE,
|
QTY = sn.QTY,
|
UNIT = sn.UNIT,
|
WH_CODE = sn.WH_CODE,
|
REGION_CODE = sn.REGION_CODE,
|
SHELF_CODE = sn.SHELF_CODE,
|
LOCATION_CODE = sn.LOCATION_CODE,
|
DOWN_TIME = sn.DOWN_TIME,
|
DLVY_TIME = DateTime.Now,
|
IS_OUT = "Y",
|
LOTNO = sn.LOTNO,
|
});
|
}
|
}
|
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();
|
db.Updateable(orders.SelectMany(q => q.Details).ToList(), trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
|
db.Storageable(orders.SelectMany(q => q.SnList).ToList(), trans.UserCode).ToStorage().AsInsertable.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="range"></param>
|
/// <returns></returns>
|
private static async Task<ApiAction> CreateIssueDoc(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.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 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;
|
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();
|
sn.REQ_ID = batch.REQ_ID;
|
sn.REQ_ORDER = batch.REQ_ORDER;
|
}
|
|
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 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, q.REQ_ID, q.REQ_ORDER }).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}]成功,来源单号如下:{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();
|
sn.REQ_ID = batch.REQ_ID;
|
sn.REQ_ORDER = batch.REQ_ORDER;
|
}
|
|
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, q.REQ_ID, q.REQ_ORDER }).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)).IncludesAllFirstLayer().ToList();
|
foreach (var order in orders)
|
{
|
order.STATUS = BIZ_WMS_TRANSFER.STATUSs.Sended.GetValue();
|
order.OUT_WH_CODE = string.Join(",", trans.CurPREP.Order.SnList.Select(q => q.WH_CODE).Distinct());
|
foreach (var dtl in order.Details)
|
{
|
dtl.STATUS = BIZ_WMS_TRANSFER.STATUSs.Sended.GetValue();
|
dtl.OUT_WH_CODE = string.Join(",", trans.CurPREP.Order.SnList.Select(q => q.WH_CODE).Distinct());
|
dtl.QTY_OUT = dtl.QTY_REQ;
|
dtl.OUT_LOTNO = string.Join(",", trans.CurPREP.Order.SnList.Select(q => q.LOTNO).Distinct());
|
}
|
order.SnList ??= new();
|
foreach (var sn in trans.CurPREP.Order.SnList)
|
{
|
var dtl = order.Details.Where(q => q.ITEM_CODE == sn.ITEM_CODE).First();
|
order.SnList.Add(new()
|
{
|
AUTH_ORG = dtl.AUTH_ORG,
|
ORDER_NO = dtl.ORDER_NO,
|
ORDER_LINE = dtl.ORDER_LINE,
|
SN = sn.SN,
|
STATUS = sn.STATUS,
|
ITEM_CODE = sn.ITEM_CODE,
|
QTY = sn.QTY,
|
LOTNO = sn.LOTNO,
|
OUT_WH_CODE = sn.WH_CODE,
|
OUT_REGION_CODE = sn.REGION_CODE,
|
OUT_SHELF_CODE = sn.SHELF_CODE,
|
OUT_LOCATION_CODE = sn.LOCATION_CODE,
|
OUT_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.OUT_WH_CODE }).ExecuteCommand();
|
db.Updateable(orders.SelectMany(q => q.Details).ToList(), trans.UserCode).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.OUT_WH_CODE, q.QTY_OUT, q.OUT_LOTNO }).ExecuteCommand();
|
db.Storageable(orders.SelectMany(q => q.SnList).ToList(), trans.UserCode).ToStorage().AsInsertable.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;
|
}
|
|
}//endClass
|
}
|