服务端的TigerApi 框架,基于.NET6 2024 版本
Rodney Chen
22 小时以前 2c60540518b5f2071987dcbe6aa237af4b97c77a
Tiger.Business.WMS/Transaction/Yada/Out_BIZ_WMS_PREP.cs
@@ -10,9 +10,6 @@
using Tiger.Model;
using Tiger.IBusiness;
using Tiger.Business.WMS.Common;
using Org.BouncyCastle.Ocsp;
using Tiger.Model.Sharetronic.Shelf;
using MailKit.Search;
using Tiger.Business.WMS.Extensions;
namespace Tiger.Business.WMS.Transaction
@@ -33,7 +30,7 @@
        #region Propertys & Variables
        public Preparation CurPREP { get; set; }
        private List<BIZ_WMS_PREP_SN> CurSn = new();
        private BIZ_WMS_PREP_DTL CurPrepDtl = new();
        private BIZ_WMS_PREP_DTL CurPrepDtl;
        public List<SuggestItem> Suggests { get; set; } = new();
        public List<WMS_ITEM_POOL> CurPoolList => Suggests.Where(q => !q.poolItem.IsNullOrEmpty()).Select(q => q.poolItem).ToList();
        public List<WMS_LOCATION> LocationHis { get; set; } = new();
@@ -50,7 +47,8 @@
            var action = new ApiAction<ScanOutput>(new ScanOutput());
            try
            {
                //Result<List<SuggestItem>> result = Suggest("CurPrepDtl.ORDER_NO", "CurPrepDtl.ITEM_CODE", new SuggestOption(), new(), 100.0);
                //action.LocaleMsg = result.LocaleMsg;
                if (input.Command == "ScanOrder")
                {
                    action = await ScanOrder(input);
@@ -130,7 +128,7 @@
                if (CurPREP.Order.IsNullOrEmpty() || !CurPREP.Order.SourceOrders.Any(q => q.SOURCE_ORDER == inputOrder.SOURCE_ORDER))
                {
                    action = CurPREP.AddOrder(inputOrder.BIZ_TYPE.GetEnum<BIZ_WMS_PREP.BIZ_TYPEs>(), inputOrder.SOURCE_CODE);
                    action = CurPREP.AddOrder(inputOrder.BIZ_TYPE.GetEnum<BIZ_WMS_PREP.BIZ_TYPEs>(), inputOrder.SOURCE_ORDER);
                }
                else
                {
@@ -157,8 +155,8 @@
        public async Task<ApiAction<BIZ_WMS_PREP>> GetPrepInfo()
        {
            var action = new ApiAction<BIZ_WMS_PREP>();
            CurPREP.Order = MainDB.Queryable<BIZ_WMS_PREP>().Where(q => q.ID == CurPREP.Order.ID).IncludesAllFirstLayer().First();
            var prepId = CurPREP?.Order?.ID;
            CurPREP.Order = MainDB.Queryable<BIZ_WMS_PREP>().Where(q => q.ID == prepId).IncludesAllFirstLayer().First();
            action.Data = CurPREP.Order;
            return action;
        }
@@ -171,8 +169,8 @@
            var action = new ApiAction<ScanOutput>(new ScanOutput());
            try
            {
                var inputDtl = input?.Data?.JsonToObject<BIZ_WMS_PREP_DTL>();
                var prepDtl = MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ID == inputDtl.ID).First();
                var option = CurPREP.Option = new BaseInput<SuggestOption>(input).Data;
                var prepDtl = MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ID == option.LineID).First();
                if (prepDtl.IsNullOrEmpty())
                {
                    action.IsSuccessed = false;
@@ -202,10 +200,10 @@
                }
                //如果是首套发料,则只推荐当前物料行的一盘物料
                if (CurPREP.Order.CurBatch.DLVY_MODE == BIZ_WMS_PREP_BTH.DLVY_MODEs.First.GetValue())
                if (option.DlvyMode == WMS_ITEM_POOL.DLVY_MODEs.First)
                {
                    //推荐物料
                    Result<List<SuggestItem>> result = Suggest(CurPrepDtl.ORDER_NO, CurPrepDtl.ITEM_CODE, null, inputDtl.WH_ID, inputDtl.REGION_ID, inputDtl.SHELF_ID, input.AuthOption, 1);
                    Result<List<SuggestItem>> result = Suggest(CurPrepDtl.ORDER_NO, CurPrepDtl.ITEM_CODE, option, input.AuthOption, 1);
                    action.LocaleMsg = result.LocaleMsg;
                    if (result.IsException)
                    {
@@ -221,7 +219,7 @@
                        var actQty = CurPrepDtl.QTY_PREP > CurPREP.BizType.GetActReqQty(CurPrepDtl) ? 0 : (CurPREP.BizType.GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP);
                        if (inv != null && actQty > 0)
                        {
                            inv.poolItem = inv.Item.GetPoolItem(OrgCode, nameof(CurPREP.Order), CurPrepDtl.ORDER_NO, CurPrepDtl.ORDER_LINE, actQty, true);
                            inv.poolItem = inv.Item.GetPoolItem(OrgCode, TransID, nameof(CurPREP.Order), CurPrepDtl.ORDER_NO, CurPrepDtl.ORDER_LINE, actQty, true);
                        }
                        else
                        {
@@ -232,11 +230,11 @@
                }
                //如果是正常发料,则按实际需求数量推荐当前物料行的所有物料
                if (CurPREP.Order.CurBatch.DLVY_MODE == BIZ_WMS_PREP_BTH.DLVY_MODEs.Supply.GetValue())
                if (option.DlvyMode == WMS_ITEM_POOL.DLVY_MODEs.Supply)
                {
                    //推荐物料
                    var actQty = CurPrepDtl.QTY_PREP > CurPREP.BizType.GetActReqQty(CurPrepDtl) ? 0 : (CurPREP.BizType.GetActReqQty(CurPrepDtl) - CurPrepDtl.QTY_PREP);
                    Result<List<SuggestItem>> result = Suggest(CurPrepDtl.ORDER_NO, CurPrepDtl.ITEM_CODE, null, inputDtl.WH_ID, inputDtl.REGION_ID, inputDtl.SHELF_ID, input.AuthOption, actQty);
                    Result<List<SuggestItem>> result = Suggest(CurPrepDtl.ORDER_NO, CurPrepDtl.ITEM_CODE, option, input.AuthOption, actQty);
                    action.LocaleMsg = result.LocaleMsg;
                    if (result.IsException)
                    {
@@ -245,12 +243,13 @@
                    }
                    Suggests.Clear();
                    Suggests = result.Data;
                    var remain = actQty;
                    Suggests.ForEach((inv) =>
                    {
                        if (remain > 0)
                        {
                            inv.poolItem = inv.Item.GetPoolItem(input.AuthOption.OrgCode, nameof(CurPREP.Order), CurPrepDtl.ORDER_NO, CurPrepDtl.ORDER_LINE, remain, false);
                            inv.poolItem = inv.Item.GetPoolItem(OrgCode, TransID, nameof(CurPREP.Order), CurPrepDtl.ORDER_NO, CurPrepDtl.ORDER_LINE, remain, false);
                            remain -= inv.poolItem.ALLOC_QTY;
                        }
                        else
@@ -289,16 +288,15 @@
        public async Task<ApiAction<BIZ_WMS_PREP_DTL>> GetCurPrepItem()
        {
            var action = new ApiAction<BIZ_WMS_PREP_DTL>();
            var prepDtl = MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ID == CurPrepDtl.ID).First();
            prepDtl.ERP_WH = CurPrepDtl.ERP_WH;
            prepDtl.WH_ID = CurPrepDtl.WH_ID;
            prepDtl.REGION_ID = CurPrepDtl.REGION_ID;
            prepDtl.SHELF_ID = CurPrepDtl.SHELF_ID;
            prepDtl.Suggests = Suggests;
            CurPrepDtl = prepDtl;
            CurPREP.Order.Details.RemoveAll(q => q.ID == CurPrepDtl.ID);
            CurPREP.Order.Details.Add(CurPrepDtl);
            action.Data = CurPrepDtl;
            if (!CurPrepDtl.IsNullOrEmpty())
            {
               var prepDtl = MainDB.Queryable<BIZ_WMS_PREP_DTL>().Where(q => q.ID == CurPrepDtl.ID).First();
               prepDtl.Suggests = Suggests;
               CurPrepDtl = prepDtl;
               CurPREP.Order.Details.RemoveAll(q => q.ID == CurPrepDtl.ID);
               CurPREP.Order.Details.Add(CurPrepDtl);
               action.Data = CurPrepDtl;
            }
            return action;
        }
@@ -415,6 +413,14 @@
                    action.LocaleMsg = Biz.L("WMS.Default.ScanItem.ItemIsLock", inv.CurPkg.SN);
                    return SetOutPutMqttMsg(action, input.Locale);
                }
                //验证条码是否被其他用户和单据锁定
                if (inv.Items.Any(q => q.IS_LOCKED == "Y"))
                {
                    action.IsSuccessed = false;
                    //action.LocaleMsg = Biz.L("条码[{0}]已被锁定,请重新扫描");
                    action.LocaleMsg = Biz.L("WMS.Default.ScanItem.ItemIsLock", inv.CurPkg.SN);
                    return SetOutPutMqttMsg(action, input.Locale);
                }
                //储位验证
                if (inv.Location.IsNullOrEmpty())
                {
@@ -432,13 +438,22 @@
                    return SetOutPutMqttMsg(action, input.Locale);
                }
                //判断是否在备料中的物料
                if (!CurPREP.Order.Details.Any(q => q.ITEM_CODE == inv.ItemInfo.ITEM_CODE))
                if (inv.ItemInfo.ITEM_CODE != CurPrepDtl.ITEM_CODE)
                {
                    action.IsSuccessed = false;
                    //action.LocaleMsg = Biz.L($"当前备料任务[{0}]不包含条码[{1}]的物料编码[{2}],请放回原储位");
                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanItem.NoNeedItemCode", inv.ItemInfo.ITEM_CODE.IsNullOrEmpty(inv.Barcode.ItemCode));
                    //action.LocaleMsg = Biz.L($"条码[{0}]不是当前选中的物料行[{1}],请放回原储位或者重新选择下架物料行");
                    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanItem.NoNeedItemCode", inv.CurPkg.SN, CurPrepDtl.ITEM_CODE);
                    return action;
                }
                //判断是否在备料中的物料
                //if (!CurPREP.Order.Details.Any(q => q.ITEM_CODE == inv.ItemInfo.ITEM_CODE))
                //{
                //    action.IsSuccessed = false;
                //    //action.LocaleMsg = Biz.L($"当前备料任务[{0}]不包含条码[{1}]的物料编码[{2}],请放回原储位");
                //    action.LocaleMsg = Biz.L("WMS.Out_BIZ_WMS_PREP.ScanItem.NoNeedItemCode", inv.ItemInfo.ITEM_CODE.IsNullOrEmpty(inv.Barcode.ItemCode));
                //    return action;
                //}
                //ProcessingOrderDetail = input.SN;
                //if (WMSContext.TransactionDic.Where(q => !string.IsNullOrWhiteSpace(q.Value.ProcessingSn)).Any(q => q.Value.ProcessingSn == ProcessingSn && q.Value.TransID != this.TransID))
                //{
@@ -450,7 +465,6 @@
                CurSn = CurInvItem.Items.Select(q => new BIZ_WMS_PREP_SN() {
                    ORDER_NO = CurPREP.Order.ORDER_NO,
                    ORDER_LINE = CurPrepDtl.ORDER_LINE,
                    ORDER_BATCH = CurPREP.Order.CurBatch.BATCH.ToString(),
                    SN = q.SN,
                    ITEM_CODE = q.ITEM_CODE,
                    UNIT = q.UNIT,
@@ -458,22 +472,23 @@
                    QTY_DLVY = q.QTY,
                    STATUS = q.STATUS,
                    LOTNO = q.LOTNO,
                    WH_ID = CurInvItem.Warehouse.ID,
                    WH_CODE = CurInvItem.Warehouse.WH_CODE,
                    REGION_ID = CurInvItem.Region.ID,
                    REGION_CODE = CurInvItem.Region.REGION_CODE,
                    SHELF_ID = CurInvItem.Shelf.ID,
                    SHELF_CODE = CurInvItem.Shelf.SHELF_CODE,
                    LOCATION_ID = CurInvItem.Location.ID,
                    LOCATION_CODE = CurInvItem.Location.LOCATION_CODE,
                    FTY_CODE = CurPREP.Order.CurBatch.FTY_CODE,
                    WS_CODE = CurPREP.Order.CurBatch.WS_CODE,
                    LINE_CODE = CurPREP.Order.CurBatch.LINE_CODE,
                    POST_CODE = CurPREP.Order.CurBatch.POST_CODE,
                    OPER_CODE = CurPREP.Order.CurBatch.OPER_CODE,
                    SEGMENT = CurPREP.Order.CurBatch.SEGMENT,
                    PREP_USER = UserCode,
                    DOWN_TIME = DateTime.Now,
                    SMT_NO = CurPrepDtl.SMT_NO,
                    STATION_NO = CurPrepDtl.STATION_NO,
                    FEEDER_NO = CurPrepDtl.FEEDER_NO,
                    FEEDER_TYPE = CurPrepDtl.FEEDER_TYPE,
                    IS_FIRST = CurPREP.Order.CurBatch.DLVY_MODE == BIZ_WMS_PREP_BTH.DLVY_MODEs.First.GetValue() ? "Y" : "N",
                    IS_FIRST = CurPREP.Option.DlvyMode == WMS_ITEM_POOL.DLVY_MODEs.First ? "Y" : "N",
                    NEED_CUTTING = "N",
                    TRACE_ID = TransID,
                }).ToList();
@@ -604,14 +619,11 @@
                    }
                    CurPrepDtl.QTY_PREP += CurSn.Sum(q => q.QTY_DLVY);
                    CurPREP.Order.STATUS = BIZ_WMS_PREP.STATUSs.Picking.GetValue();
                    CurPREP.Order.CurBatch.STATUS = BIZ_WMS_PREP_BTH.STATUSs.Picking.GetValue();
                    CurPREP.Order.CurBatch.PICK_TIME = CurPREP.Order.CurBatch.PICK_TIME < new DateTime(2000, 1, 1) ? DateTime.Now : CurPREP.Order.CurBatch.PICK_TIME;
                    //创建变量克隆对象用于传入DBSubmitAction中保存当前需要暂存的数据值
                    var _CurSn = CurSn.Clone();
                    var _CurPrepDtl = CurPrepDtl.Clone();
                    var _CurPREPOrder = CurPREP.Order.Clone();
                    var _CurPREPCurBatch = CurPREP.Order.CurBatch.Clone();
                    AddCommitAction("UpdatePrep", () =>
                    {
                        //使用统一的事务DB对象
@@ -621,7 +633,6 @@
                        _CurPrepDtl.QTY_PREP = db.Queryable<BIZ_WMS_PREP_SN>().Where(q => q.ORDER_NO == _CurPrepDtl.ORDER_NO && q.ORDER_LINE == _CurPrepDtl.ORDER_LINE).Sum(q => q.QTY_DLVY);
                        db.Updateable(_CurPrepDtl, UserCode).UpdateColumns(q => new { q.QTY_PREP, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
                        db.Updateable(_CurPREPOrder, UserCode).UpdateColumns(q => new { q.STATUS, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
                        db.Updateable(_CurPREPCurBatch, UserCode).UpdateColumns(q => new { q.STATUS, q.PICK_TIME, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
                    });
                    //灭灯
@@ -773,13 +784,14 @@
        }
        /// <summary>
        /// 调用发料单据的ERP接口
        /// 创建发料批次以完成本次发料,调用发料单据的ERP接口
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<ApiAction> CommitToERP(BaseInput input)
        public async Task<ApiAction> GenerateDlvyBatch(BaseInput input)
        {
            var action = await CurPREP.Order.BIZ_TYPE.GetEnum<BIZ_WMS_PREP.BIZ_TYPEs>() .CommitToERP(this, input);
            var range = input.Data.ToInt32().GetEnum<BIZ_WMS_PREP_BTH.BATCH_RANGEs>();
            var action = await CurPREP.Order.BIZ_TYPE.GetEnum<BIZ_WMS_PREP.BIZ_TYPEs>() .GenerateDlvyBatch(this, range);
            return action;
        }
@@ -792,7 +804,7 @@
        {
            ResetScan();
            CurPREP = new(MainDB, UserCode, OrgCode);
            CurPrepDtl = new();
            CurPrepDtl = null;
            CurScanShelf = null;
            base.ResetTrans();
        }
@@ -813,7 +825,7 @@
            //CloseLight(LocationHis).Wait();
            if (!(CurPREP?.Order?.ORDER_NO ?? "").IsNullOrEmpty())
            {
                MainDB.Deleteable<WMS_ITEM_POOL>().Where(x => x.TRANS_NO == CurPREP.Order.ORDER_NO).ExecuteCommand();
                MainDB.Deleteable<WMS_ITEM_POOL>().Where(q => q.TRANS_NO == CurPREP.Order.ORDER_NO || q.TRANS_ID == TransID).ExecuteCommand();
            }
            this.IsFinished = true;