服务端的TigerApi 框架,基于.NET6 2024 版本
Rodney Chen
2025-03-10 40df5d91f800bb8b7be2638c13b4f9292d461221
Tiger.Business.WMS/Transaction/Out_Default.cs
@@ -9,34 +9,23 @@
using System.Threading.Tasks;
using Tiger.Model;
using Tiger.IBusiness;
using Org.BouncyCastle.Ocsp;
using Tiger.Model.MES.Yada;
namespace Tiger.Business.WMS.Transaction
{
    /// <summary>
    /// 标准下架事务
    /// </summary>
    public class Out_Default : WMSTransactionBase, IOut_Default
    public class Out_Default : WmsTask, IOut_Default
    {
        public IOut_Default Init(string id, string userCode, string apiHost, string orgCode)
        {
            TransID = id;
            UserCode = userCode;
            ApiHost = apiHost;
            OrgCode = orgCode;
            base.Init(id, apiHost, userCode, orgCode);
            Logger.Console.Info($"Start {this.GetType().Name} Transaction[ID: {TransID}]");
            return this;
        }
        #region Propertys & Variables
        public string UserCode { get; set; }
        public long UserId { get; set; }
        public string OrgCode { get; set; }
        public Inventory CurInvItem { get; set; }
        public ScanShelfInfo CurScanShelf { get; set; }
        public string Command { get; set; } = "Normal";
        #endregion
        #region Functions
@@ -63,7 +52,7 @@
            catch (Exception ex)
            {
                //取消当前操作
                ResetInfo();
                ResetScan();
                //action.CatchExceptionWithLog(ex, $"扫描[{input.SN}]异常");
                action.CatchExceptionWithLog(ex, Biz.L("WMS.Default.Scan.ScanException", input.SN));
            }
@@ -127,7 +116,7 @@
                    }
                }
                Dictionary<string, decimal> downDic = null;
                Dictionary<string, double> downDic = null;
                //更新下架后的物料数量
                if (Command == "ComfirmQty")
                {
@@ -163,15 +152,14 @@
                    item.TRANS_CODE = "Out_Default";
                    item.TRANS_NO = $"Out_Default_{DateTime.Now:yyyyMMdd}";
                }
                Result<TakeDownInfo> downResult = WMS_ITEM_Biz.WmsItem.TakeDown(CurInvItem, downDic, input.AuthOption, WMS_ITEM.STATUSs.OffShelf);
                Result downResult = TakeDown(downDic, input.AuthOption, WMS_ITEM.STATUSs.OffShelf);
                if (!downResult.IsSuccessed)
                {
                    action.IsSuccessed = false;
                    action.LocaleMsg = downResult.LocaleMsg;
                    CurInvItem = null;
                    ResetScan();
                    return action;
                }
                TakeDownInfo downInfo = downResult.Data;
                //灭灯
                if (CurInvItem.Shelf.IsLightShelf)
@@ -179,40 +167,12 @@
                    await Share.Shelf.DownSingle(TransID, CurInvItem.Location);
                }
                //保存数据库
                var db = Business.Biz.Db;
                var dbTran = db.UseTran(() =>
                {
                    //下架
                    db.Updateable(downInfo.Items, UserCode).ExecuteCommand();
                    db.Insertable(downInfo.History, UserCode).ExecuteCommand();
                    db.Updateable(downInfo.Packages, UserCode).ExecuteCommand();
                });
                if (!dbTran.IsSuccess)
                {
                    Logger.Default.Fatal(dbTran.ErrorException, "Database transaction save exception");
                    throw dbTran.ErrorException;
                }
                action.Data.Data = new DefaultScanItemOutput()
                {
                    SN = CurInvItem.SN,
                    ItemCode = CurInvItem.ItemInfo.ITEM_CODE,
                    MaterialName = CurInvItem.ItemInfo.ITEM_NAME,
                    Qty = CurInvItem.CurPkg.QTY,
                    Unit = CurInvItem.CurPkg.UNIT,
                    regionCode = CurInvItem.Region.REGION_CODE,
                    locationCode = CurInvItem.Location?.LOCATION_CODE,
                    DateCode = CurInvItem.Items[0].PROD_DATE,
                    ScanAfCut = CurInvItem.Warehouse.SCAN_AF_CUT
                };
                //action.LocaleMsg = Biz.L($"扫描条码[{0}]从储位[{1}]下架成功");
                action.LocaleMsg = Biz.L("WMS.Default.ScanItem.TakeDownSucceeded", CurInvItem.SN, CurInvItem.Location?.LOCATION_CODE);
                CurInvItem = null;
                //完成所有处理后使用事务保存数据
                action = DoIfFinish(action, input.Locale);
            }
            catch (Exception ex)
            {
                ResetInfo();
                ResetScan();
                //action.CatchExceptionWithLog(ex, $"扫描条码[{input.SN}]复核异常");
                action.CatchExceptionWithLog(ex, Biz.L("WMS.Default.ScanItem.ScanException", input.SN));
            }
@@ -238,7 +198,7 @@
                CurScanShelf = new ScanShelfInfo();
                // 查询货架信息
                var whUnit = await Biz.Db.Queryable<V_WH_UNIT>().Where(t => t.SHELF_CODE.ToUpper() == Code.ToUpper() && t.AUTH_ORG == OrgCode).IncludesAllFirstLayer().FirstAsync();
                var whUnit = await MainDB.Queryable<V_WH_UNIT>().Where(t => t.SHELF_CODE.ToUpper() == Code.ToUpper() && t.AUTH_ORG == OrgCode).IncludesAllFirstLayer().FirstAsync();
                // 扫描货架代码,且为智能货架
                if (whUnit != null && whUnit.SHELF_TYPE == WMS_SHELF.SHELF_TYPEs.Smart.GetValue())
@@ -253,7 +213,7 @@
                // 扫描库位代码
                else
                {
                    var nLocation = await Biz.Db.Queryable<V_WH_UNIT>().Where(t => t.LOCATION_CODE.ToUpper() == Code.ToUpper() && t.AUTH_ORG == OrgCode).IncludesAllFirstLayer().FirstAsync();
                    var nLocation = await MainDB.Queryable<V_WH_UNIT>().Where(t => t.LOCATION_CODE.ToUpper() == Code.ToUpper() && t.AUTH_ORG == OrgCode).IncludesAllFirstLayer().FirstAsync();
                    if (nLocation == null)
                    {
                        action.IsSuccessed = false;
@@ -270,7 +230,7 @@
                    }
                    //if (nLocation.Shelf.IsLightShelf || nLocation.Location.IS_SINGLE == "Y")
                    //{
                    //    var locationData = Biz.Db.Queryable<WMS_ITEM>().Where(q => q.LOCATION_ID == nLocation.LOCATION_ID && q.AUTH_ORG == OrgCode).First();
                    //    var locationData = MainDB.Queryable<WMS_ITEM>().Where(q => q.LOCATION_ID == nLocation.LOCATION_ID && q.AUTH_ORG == OrgCode).First();
                    //    if (!locationData.IsNullOrEmpty())
                    //    {
                    //        action.IsSuccessed = false;
@@ -296,10 +256,42 @@
            catch (Exception ex)
            {
                //取消当前操作
                ResetInfo();
                ResetScan();
                //action.CatchExceptionWithLog(ex, $"扫描货架/储位[{0}]异常");
                action.CatchExceptionWithLog(ex, Biz.L("WMS.Default.ScanShelf.ScanException", Code));
            }
            return action;
        }
        /// <summary>
        /// 完成所有处理后使用事务保存数据
        /// </summary>
        /// <param name="action"></param>
        /// <returns></returns>
        public ApiAction<ScanOutput> DoIfFinish(ApiAction<ScanOutput> action, string locale)
        {
            //保存数据库
            SaveCommitListToDB();
            // 返回数据
            action.Data.Data = new DefaultScanItemOutput()
            {
                SN = CurInvItem.SN,
                ItemCode = CurInvItem.ItemInfo.ITEM_CODE,
                MaterialName = CurInvItem.ItemInfo.ITEM_NAME,
                Qty = CurInvItem.CurPkg.QTY,
                Unit = CurInvItem.CurPkg.UNIT,
                regionCode = CurInvItem.Region.REGION_CODE,
                locationCode = CurInvItem.Location?.LOCATION_CODE,
                DateCode = CurInvItem.Items[0].PROD_DATE,
                ScanAfCut = CurInvItem.Warehouse.SCAN_AF_CUT
            };
            //action.LocaleMsg = Biz.L($"扫描条码[{0}]从储位[{1}]下架成功");
            action.LocaleMsg = Biz.L("WMS.Default.ScanItem.TakeDownSucceeded", CurInvItem.SN, CurInvItem.Location?.LOCATION_CODE);
            //重置工序
            ResetScan();
            return action;
        }
@@ -308,9 +300,9 @@
        /// <summary>
        /// 重置当前操作,有需要则重写此方法
        /// </summary>
        public override void ResetInfo()
        public override void ResetScan()
        {
            base.ResetInfo();
            base.ResetScan();
            Command = null;
            CurInvItem = null;
            CurScanShelf = null;