服务端的TigerApi 框架,基于.NET6 2024 版本
Rodney Chen
2 天以前 2c60540518b5f2071987dcbe6aa237af4b97c77a
Tiger.Business.WMS/Common/Preparation.cs
@@ -1,20 +1,19 @@
using Rhea.Common;
using Microsoft.IdentityModel.Tokens;
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
{
    /// <summary>
    /// 备料任务单据
    /// </summary>
@@ -29,10 +28,13 @@
        #region Propertys & Variables
        private static object AddOrderLock { get; } = new object();
        private static object AddBatchLock { get; } = new object();
        public DbClient MainDB { get; set; }
        public string UserCode { get; set; }
        public string OrgCode { get; set; }
        public BIZ_WMS_PREP Order { get; set; }
        public BIZ_WMS_PREP.BIZ_TYPEs BizType => Order.BIZ_TYPE.GetEnum<BIZ_WMS_PREP.BIZ_TYPEs>();
        public SuggestOption Option { get; set; }
        #endregion Propertys & Variables
        #region Functions
@@ -44,55 +46,80 @@
        /// <returns></returns>
        public ApiAction<ScanOutput> AddOrder(BIZ_WMS_PREP.BIZ_TYPEs bizType, string orderNo)
        {
            lock(AddOrderLock)
            lock (AddOrderLock)
            {
               var action = new ApiAction<ScanOutput>(new ScanOutput());
               // 查询是否已存在备料任务
               var src = MainDB.Queryable<BIZ_WMS_PREP_SRC>().Where(q => q.SOURCE_ORDER == orderNo &&
                                       SqlFunc.Subqueryable<BIZ_WMS_PREP>().Where(p => p.STATUS < BIZ_WMS_PREP.STATUSs.Sended.GetValue()).Any()).First();
               if (Order.IsNullOrEmpty())
               {
                   if (!src.IsNullOrEmpty())
                   {
                       Order = MainDB.Queryable<BIZ_WMS_PREP>().Where(q => q.ORDER_NO == src.ORDER_NO).IncludesAllFirstLayer().First();
                var action = new ApiAction<ScanOutput>(new ScanOutput());
                // 查询是否已存在备料任务
                var src = MainDB.Queryable<BIZ_WMS_PREP_SRC>().Where(q => q.SOURCE_ORDER == orderNo &&
                                        SqlFunc.Subqueryable<BIZ_WMS_PREP>().Where(p => p.STATUS < BIZ_WMS_PREP.STATUSs.Sended.GetValue()).Any()).First();
                if (Order.IsNullOrEmpty())
                {
                    if (!src.IsNullOrEmpty())
                    {
                        Order = MainDB.Queryable<BIZ_WMS_PREP>().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", Order?.ORDER_NO, orderNo);
                        return action;
                   }
                   else
                   {
                       Order = new BIZ_WMS_PREP()
                       {
                    }
                    else
                    {
                        Order = 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 != Order.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, Order.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;
               }
                            BIZ_TYPE = bizType.GetValue(),
                            STATUS = BIZ_WMS_PREP.STATUSs.Init.GetValue(),
                        };
                    }
                }
                //合并发料只适用于包装车间工单发料,雅达包装车间编码:1002310010030758
                else if (Order.WS_CODE != "1002310010030758")
                {
                    action.IsSuccessed = false;
                    //action.LocaleMsg = Biz.L("备料任务[{0}]不是包装车间工单发料,无法合并单据发料");
                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.AddOrder.PrepNot1002310010030758", Order.ORDER_NO);
                    return action;
                }
                if (!src.IsNullOrEmpty() && src.ORDER_NO != Order.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, Order.ORDER_NO);
                    return action;
                }
                // 查询单据明细,并合并到备料单的备料明细中
                var srcDtls = bizType.GetPickList(orderNo);
                if (srcDtls.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;
                }
                //合并发料只适用于包装车间工单发料
                if (!src.IsNullOrEmpty() && Order.BIZ_TYPE == BIZ_WMS_PREP.BIZ_TYPEs.WorkOrder.GetValue())
                {
                    var wo = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == orderNo).First();
                    //雅达包装车间编码:1002310010030758
                    if (wo?.WS_CODE == "1002310010030758")
                    {
                        Order.WS_CODE = wo.WS_CODE;
                    }
                    else
                    {
                        action.IsSuccessed = false;
                        //action.LocaleMsg = Biz.L("单据[{0}]不是包装车间工单,无法合并单据发料");
                        action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.AddOrder.WoNot1002310010030758", orderNo);
                        return action;
                    }
                }
                Order.SourceOrders = Order.SourceOrders ?? new();
                Order.SourceDetails = Order.SourceDetails ?? new();
                Order.Details = Order.Details ?? new();
                Order.Batchs = Order.Batchs ?? new();
                Order.SnList = Order.SnList ?? new();
                var srcOrder = new BIZ_WMS_PREP_SRC()
                {
@@ -103,63 +130,49 @@
                    ADD_TIME = DateTime.Now,
                };
                Order.SourceOrders.Add(srcOrder);
                foreach (var dtl in dtls)
                foreach (var sdtl in srcDtls)
                {
                    dtl.AUTH_ORG = OrgCode;
                    var pdtl = Order.Details.Where(q => q.ITEM_CODE == dtl.ITEM_CODE).FirstOrDefault();
                    sdtl.AUTH_ORG = OrgCode;
                    var pdtl = Order.Details.Where(q => q.ITEM_CODE == sdtl.ITEM_CODE).FirstOrDefault();
                    if (pdtl.IsNullOrEmpty())
                    {
                        pdtl = new ()
                        pdtl = new()
                        {
                            AUTH_ORG = OrgCode,
                            ORDER_NO = Order.ORDER_NO,
                            ORDER_LINE = (Order.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,
                            ORDER_LINE = Order.Details.IsNullOrEmpty() ? "1" : (Order.Details.Max(q => q.ORDER_LINE.ToInt32()) + 1).ToString(),
                            ITEM_CODE = sdtl.ITEM_CODE,
                            SUBITEM_CODE = sdtl.SUBITEM_CODE,
                            UNIT = sdtl.UNIT,
                            PLAN_LOSS_QTY = sdtl.PLAN_LOSS_QTY,
                            PLAN_LOSS_RATE = sdtl.PLAN_LOSS_RATE,
                            IS_CALC_LOSS = sdtl.IS_CALC_LOSS,
                            IS_WHOLE = sdtl.IS_WHOLE,
                            SOURCE_CODE = sdtl.SOURCE_CODE,
                            SOURCE_ORDER = sdtl.SOURCE_ORDER,
                            SOURCE_LINE = sdtl.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,
                            FTY_CODE = sdtl.FTY_CODE,
                            WS_CODE = sdtl.WS_CODE,
                            LINE_CODE = sdtl.LINE_CODE,
                            POST_CODE = sdtl.POST_CODE,
                            OPER_CODE = sdtl.OPER_CODE,
                            SEGMENT = sdtl.SEGMENT,
                            SMT_NO = sdtl.SMT_NO,
                            STATION_NO = sdtl.STATION_NO,
                            FEEDER_NO = sdtl.FEEDER_NO,
                            FEEDER_TYPE = sdtl.FEEDER_TYPE,
                        };
                        Order.Details.Add(pdtl);
                    }
                    pdtl.QTY_REQ += dtl.QTY_ACT_REQ;
                    Order.SourceDetails.Add(dtl);
                    pdtl.QTY_REQ += sdtl.QTY_ACT_REQ;
                    sdtl.ORDER_NO = pdtl.ORDER_NO;
                    sdtl.ORDER_LINE = pdtl.ORDER_LINE;
                    Order.SourceDetails.Add(sdtl);
                }
                var srcInfo = Order.SourceOrders.Select(q => new { q.SOURCE_CODE, q.SOURCE_ORDER }).DistinctBy(q => q.SOURCE_ORDER).OrderBy(q => q.SOURCE_ORDER);
                Order.SOURCE_CODE = string.Join(",", srcInfo.Select(q => q.SOURCE_CODE));
                Order.SOURCE_ORDER = string.Join(",", srcInfo.Select(q => q.SOURCE_ORDER));
                if (Order.CurBatch.IsNullOrEmpty())
                {
                    var bacth = new BIZ_WMS_PREP_BTH()
                    {
                        AUTH_ORG = OrgCode,
                        ORDER_NO = Order.ORDER_NO,
                        BATCH = Order.Batchs.Max(q => q.BATCH) + 1,
                        PREP_MODE = BIZ_WMS_PREP_BTH.PREP_MODEs.Whole.GetValue(),
                        DLVY_MODE = BIZ_WMS_PREP_BTH.DLVY_MODEs.Supply.GetValue(),
                        STATUS = BIZ_WMS_PREP_BTH.STATUSs.WaitPick.GetValue(),
                        CALL_TIME = DateTime.Now,
                        PRIORITY = 4,
                    };
                    bacth.PLAN_TIME = bacth.CALL_TIME.AddHours(1);
                    Order.Batchs.Add(bacth);
                }
                //使用统一的事务DB对象
                var db = Biz.Db;
@@ -167,13 +180,12 @@
                {
                    var o = db.Storageable(Order, 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();
                    o.AsUpdateable.IgnoreColumns(q => q.ID).UpdateColumns(q => new { q.WS_CODE, q.SOURCE_CODE, q.SOURCE_ORDER, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
                    db.Storageable(Order.SourceOrders, UserCode).WhereColumns(t => new { t.ORDER_NO, t.SOURCE_ORDER, t.GHOST_ROW }).ToStorage().AsInsertable.ExecuteCommand();
                    db.Storageable(Order.SourceDetails, UserCode).WhereColumns(t => new { t.ORDER_NO, t.ITEM_CODE, t.GHOST_ROW }).ToStorage().AsInsertable.ExecuteCommand();
                    var d = db.Storageable(Order.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();
                    db.Storageable(Order.Batchs, UserCode).WhereColumns(t => new { t.ORDER_NO, t.BATCH, t.GHOST_ROW }).ToStorage().AsInsertable.ExecuteCommand();
                });
                if (dbTran.IsSuccess)
                {