using MailKit.Search;
|
using Newtonsoft.Json;
|
using Newtonsoft.Json.Serialization;
|
using Org.BouncyCastle.Asn1.X509;
|
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;
|
using static Microsoft.Scripting.Hosting.Shell.ConsoleHostOptions;
|
|
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.Requisition:
|
default:
|
return "";
|
}
|
}
|
|
/// <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.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.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> CommitToERP(this BIZ_WMS_PREP.BIZ_TYPEs type, Out_BIZ_WMS_PREP trans, BaseInput input)
|
{
|
switch (type)
|
{
|
case BIZ_WMS_PREP.BIZ_TYPEs.Others:
|
return await MiscShipApprove(trans, input);
|
case BIZ_WMS_PREP.BIZ_TYPEs.WorkOrder:
|
return await CreateIssueDoc(trans, input);
|
case BIZ_WMS_PREP.BIZ_TYPEs.Outsourcing:
|
return await CreatePMIssueDoc(trans, input);
|
case BIZ_WMS_PREP.BIZ_TYPEs.Requisition:
|
default:
|
throw new NotImplementedException($"发料单据类型[{type.GetDesc()}]未实现ERP接口调用");
|
}
|
}
|
|
/// <summary>
|
/// U9杂发单审核
|
/// </summary>
|
/// <param name="trans"></param>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
private static async Task<ApiAction> MiscShipApprove(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>
|
/// <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>
|
/// <returns></returns>
|
private static async Task<ApiAction> CreateIssueDoc(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;
|
}
|
}//endClass
|
}
|