using Rhea.Common;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tiger.Business.WMS.Extensions;
using Tiger.Business.WMS.Transaction;
using Tiger.IBusiness;
using Tiger.Model;
using Tiger.Model.Entitys.MES.Position;
using Tiger.Model.Extensions;
namespace Tiger.Business.WMS.Common
{
///
/// 备料任务单据
///
public class Preparation : IPreparation
{
public Preparation(DbClient mainDB, string userCode, string orgCode)
{
MainDB = mainDB;
UserCode = userCode;
OrgCode = orgCode;
}
#region Propertys & Variables
private static object AddOrderLock { get; } = new object();
public DbClient MainDB { get; set; }
public string UserCode { get; set; }
public string OrgCode { get; set; }
public BIZ_WMS_PREP PrepOrder { get; set; }
#endregion Propertys & Variables
#region Functions
///
/// 备料任务添加单据
///
///
///
///
public ApiAction AddOrder(BIZ_WMS_PREP.BIZ_TYPEs bizType, string orderNo)
{
lock(AddOrderLock)
{
var action = new ApiAction(new ScanOutput());
// 查询是否已存在备料任务
var src = MainDB.Queryable().Where(q => q.SOURCE_ORDER == orderNo &&
SqlFunc.Subqueryable().Where(p => p.STATUS < BIZ_WMS_PREP.STATUSs.Sended.GetValue()).Any()).First();
if (PrepOrder.IsNullOrEmpty())
{
if (!src.IsNullOrEmpty())
{
PrepOrder = MainDB.Queryable().Where(q => q.ORDER_NO == src.ORDER_NO).IncludesAllFirstLayer().First();
//action.LocaleMsg = Biz.L("单据[{0}]的备料任务[{1}]加载成功,可以开始备料下架");
action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.AddOrder.LoadSuccess", orderNo, PrepOrder.ORDER_NO);
return action;
}
else
{
PrepOrder = new BIZ_WMS_PREP()
{
AUTH_ORG = OrgCode,
ORDER_NO = $"MP{DateTime.Now:yyMMdd}{(DateTime.Now - DateTime.Today).TotalSeconds:00000}",
BIZ_TYPE = bizType.GetValue(),
STATUS = BIZ_WMS_PREP.STATUSs.Init.GetValue(),
};
}
}
if (!src.IsNullOrEmpty() && src.ORDER_NO != PrepOrder.ORDER_NO)
{
action.IsSuccessed = false;
//action.LocaleMsg = Biz.L("单据[{0}]已属于备料任务[{1}],无法添加到当前备料任务[{2}]中,如需切换备料业务,请退出后重新选择");
action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.AddOrder.NoFound", orderNo, src.ORDER_NO, PrepOrder.ORDER_NO);
return action;
}
// 查询单据明细,并合并到备料单的备料明细中
var dtls = bizType.GetPickList(orderNo);
if (dtls.Sum(q => q.QTY_ACT_REQ) <= 0)
{
action.IsSuccessed = false;
//action.LocaleMsg = Biz.L("单据[{0}]未找到需要备料的行明细,请扫描正确的单据");
action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.AddOrder.NoNeedPrep", orderNo);
return action;
}
PrepOrder.SourceOrders = PrepOrder.SourceOrders ?? new();
PrepOrder.SourceDetails = PrepOrder.SourceDetails ?? new();
PrepOrder.Details = PrepOrder.Details ?? new();
PrepOrder.Batchs = PrepOrder.Batchs ?? new();
PrepOrder.SnList = PrepOrder.SnList ?? new();
var srcOrder = new BIZ_WMS_PREP_SRC()
{
AUTH_ORG = OrgCode,
ORDER_NO = PrepOrder.ORDER_NO,
SOURCE_CODE = bizType.GetSourceCode(),
SOURCE_ORDER = orderNo,
ADD_TIME = DateTime.Now,
};
PrepOrder.SourceOrders.Add(srcOrder);
foreach (var dtl in dtls)
{
dtl.AUTH_ORG = OrgCode;
var pdtl = PrepOrder.Details.Where(q => q.ITEM_CODE == dtl.ITEM_CODE).FirstOrDefault();
if (pdtl.IsNullOrEmpty())
{
pdtl = new ()
{
AUTH_ORG = OrgCode,
ORDER_NO = PrepOrder.ORDER_NO,
ORDER_LINE = (PrepOrder.Details.Max(q => q.LINE_CODE.ToInt32()) + 1).ToString(),
ITEM_CODE = dtl.ITEM_CODE,
SUBITEM_CODE = dtl.SUBITEM_CODE,
UNIT = dtl.UNIT,
PLAN_LOSS_QTY = dtl.PLAN_LOSS_QTY,
PLAN_LOSS_RATE = dtl.PLAN_LOSS_RATE,
IS_CALC_LOSS = dtl.IS_CALC_LOSS,
IS_WHOLE = dtl.IS_WHOLE,
SOURCE_CODE = dtl.SOURCE_CODE,
SOURCE_ORDER = dtl.SOURCE_ORDER,
SOURCE_LINE = dtl.SOURCE_LINE,
STATUS = BIZ_WMS_PREP_DTL.STATUSs.UnCalc.GetValue(),
FTY_CODE = dtl.FTY_CODE,
WS_CODE = dtl.WS_CODE,
LINE_CODE = dtl.LINE_CODE,
POST_CODE = dtl.POST_CODE,
OPER_CODE = dtl.OPER_CODE,
SEGMENT = dtl.SEGMENT,
SMT_NO = dtl.SMT_NO,
STATION_NO = dtl.STATION_NO,
FEEDER_NO = dtl.FEEDER_NO,
FEEDER_TYPE = dtl.FEEDER_TYPE,
};
PrepOrder.Details.Add(pdtl);
}
pdtl.QTY_REQ += dtl.QTY_ACT_REQ;
PrepOrder.SourceDetails.Add(dtl);
}
var srcInfo = PrepOrder.SourceOrders.Select(q => new { q.SOURCE_CODE, q.SOURCE_ORDER }).DistinctBy(q => q.SOURCE_ORDER).OrderBy(q => q.SOURCE_ORDER);
PrepOrder.SOURCE_CODE = string.Join(",", srcInfo.Select(q => q.SOURCE_CODE));
PrepOrder.SOURCE_ORDER = string.Join(",", srcInfo.Select(q => q.SOURCE_ORDER));
//使用统一的事务DB对象
var db = Biz.Db;
var dbTran = db.UseTran(() =>
{
var o = db.Storageable(PrepOrder, UserCode).WhereColumns(t => new { t.ORDER_NO, t.GHOST_ROW }).ToStorage();
o.AsInsertable.ExecuteCommand();
o.AsUpdateable.IgnoreColumns(q => q.ID).UpdateColumns(q => new { q.SOURCE_CODE, q.SOURCE_ORDER, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
var so = db.Storageable(PrepOrder.SourceOrders, UserCode).WhereColumns(t => new { t.ORDER_NO, t.SOURCE_ORDER, t.GHOST_ROW }).ToStorage();
so.AsInsertable.ExecuteCommand();
var sd = db.Storageable(PrepOrder.SourceDetails, UserCode).WhereColumns(t => new { t.ORDER_NO, t.ITEM_CODE, t.GHOST_ROW }).ToStorage();
sd.AsInsertable.ExecuteCommand();
var d = db.Storageable(PrepOrder.Details, UserCode).WhereColumns(t => new { t.ORDER_NO, t.ITEM_CODE, t.GHOST_ROW }).ToStorage();
d.AsInsertable.ExecuteCommand();
d.AsUpdateable.IgnoreColumns(q => q.ID).UpdateColumns(q => new { q.QTY_REQ, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
});
if (dbTran.IsSuccess)
{
//action.LocaleMsg = Biz.L("备料任务[{0}添加]单据[{1}]成功,可以开始备料下架");
action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.AddOrder.LoadSuccess", PrepOrder?.ORDER_NO, orderNo);
}
else
{
Logger.Default.Fatal(dbTran.ErrorException, "Database transaction save exception");
//抛出异常
throw dbTran.ErrorException;
}
return action;
}
}
#endregion Functions
}
}