服务端的TigerApi 框架,基于.NET6 2024 版本
Rodney Chen
5 天以前 beca28ecb3a730ffb33c21e0c55c729774725faf
Tiger.Business.WMS/Common/WmsTask.cs
@@ -1,4 +1,5 @@
using Rhea.Common;
using Microsoft.Extensions.Options;
using Rhea.Common;
using SqlSugar;
using System;
using System.Collections.Generic;
@@ -8,6 +9,7 @@
using Tiger.IBusiness;
using Tiger.Model;
using Tiger.Model.Entitys.MES.Position;
using Tiger.Model.Entitys.MES.U9C;
using static IronPython.Modules._ast;
namespace Tiger.Business.WMS.Transaction
@@ -322,28 +324,25 @@
        /// </summary>
        /// <param name="order">领料单号</param>
        /// <param name="itemCode">物料编码</param>
        /// <param name="erpWH">物料的ERP库位</param>
        /// <param name="whID">物料所在的仓库编码</param>
        /// <param name="regionID">物料所在的储区编码</param>
        /// <param name="shelfID">物料所在的货架编码</param>
        /// <param name="option">授权查询选项</param>
        /// <param name="option">备料物料推荐选项</param>
        /// <param name="auth">授权查询选项</param>
        /// <param name="returnCount">返回的最小包装物料个数,默认返回1个</param>
        /// <returns></returns>
        public Result<List<SuggestItem>> Suggest(string order, string itemCode, string erpWH, string whID, string regionID, string shelfID, AuthOption option, int returnCount = 1)
        public Result<List<SuggestItem>> Suggest(string order, string itemCode, SuggestOption option, AuthOption auth, int returnCount = 1)
        {
            var result = new Result<List<SuggestItem>>(Result.Flags.Success, new List<SuggestItem>()) { LocaleMsg = new("WMS.WmsItem.Suggest.Success") };
            try
            {
                var items = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos(
                var query = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos(
                                                                JoinType.Left, q.SN == p.SN,
                                                                JoinType.Left, q.WH_ID == w.ID,
                                                                JoinType.Left, q.REGION_ID == r.ID,
                                                                JoinType.Left, q.SHELF_ID == s.ID,
                                                                JoinType.Left, q.LOCATION_ID == l.ID))
                                             //检查用户权限
                                             .ByAuth(option)
                                            //允许使用已经分配到库存池中的物料
                                            .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.STATUS <= WMS_ITEM_POOL.STATUSs.WaitPick.GetValue() && p.TRANS_NO == order))
                                             .ByAuth(auth)
                                            //允许使用已经分配到库存池中同一个单据的物料
                                            .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.TRANS_NO == order) || p.IS_LOCKED == "N")
                                            //只允许未锁定的
                                            .Where((q, p, w, r, s, l) => q.IS_LOCKED == "N")
                                            //只允许物料状态是在库的
@@ -351,30 +350,32 @@
                                            //如果有传入料号,则只允该料号的物料
                                            .WhereIF(!itemCode.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ITEM_CODE == itemCode)
                                            //如果有传入库位,则只允该库位中的物料
                                            .WhereIF(!erpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == erpWH && q.AUTH_ORG == option.CurOrg)
                                            .WhereIF(!option.ErpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == option.ErpWH && q.AUTH_ORG == auth.CurOrg)
                                            //如果有传入仓库,则只允该仓库的物料
                                            .WhereIF(!whID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == whID && q.AUTH_ORG == option.CurOrg)
                                            .WhereIF(!option.WHID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == option.WHID && q.AUTH_ORG == auth.CurOrg)
                                            //如果有传入储区,则只允该储区的物料
                                            .WhereIF(!regionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == regionID && q.AUTH_ORG == option.CurOrg)
                                            .WhereIF(!option.RegionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == option.RegionID && q.AUTH_ORG == auth.CurOrg)
                                            //如果有传入货架,则只允该货架的物料
                                            .WhereIF(!shelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == shelfID && q.AUTH_ORG == option.CurOrg)
                                            .WhereIF(!option.ShelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == option.ShelfID && q.AUTH_ORG == auth.CurOrg)
                                            //优先使用库存池中的物料
                                            .OrderBy((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID))
                                            //优先使用尾数物料(截料或者退料之后的物料)
                                            .OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T"))
                                            //按生产日期先进先出,再按物料数量从小到大,最后按条码排序
                                            .OrderBy((q, p, w, r, s, l) => q.PROD_DATE).OrderBy(q => q.QTY).OrderBy(q => q.SN)
                                            .Select((q, p, w, r, s, l) => new SuggestItem
                                            {
                                                Item = q,
                                                poolItem = null,
                                                Warehouse = w,
                                                Region = r,
                                                Shelf = s,
                                                Location = l,
                                            })
                                            //检查用户权限
                                            .Take(returnCount).ToList();
                                            //.OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T"))
                                            //备料策略:按生产日期先进先出
                                            .OrderByIF(option.Strategy.HasFlag(WMS_ITEM_POOL.STRATEGYs.FIFO), (q, p, w, r, s, l) => q.PROD_DATE)
                                            //按生产日期先进先出,再按物料数量从小到大,
                                            .OrderByIF(option.Strategy.HasFlag(WMS_ITEM_POOL.STRATEGYs.FSFO), q => q.QTY)
                                            //最后按条码排序
                                            .OrderBy(q => q.SN);
                var items = query.Select((q, p, w, r, s, l) => new SuggestItem
                                    {
                                        Item = q,
                                        poolItem = null,
                                        Warehouse = w,
                                        Region = r,
                                        Shelf = s,
                                        Location = l,
                                    }).Take(returnCount).ToList();
                //foreach (var item in items)
                //{
                //    var inv = Get(item.SN, option, false);
@@ -409,34 +410,25 @@
        /// </summary>
        /// <param name="order">领料单号</param>
        /// <param name="itemCode">物料编码</param>
        /// <param name="erpWH">物料的ERP库位</param>
        /// <param name="whID">物料所在的仓库编码</param>
        /// <param name="regionID">物料所在的储区编码</param>
        /// <param name="shelfID">物料所在的货架编码</param>
        /// <param name="option">授权查询选项</param>
        /// <param name="option">备料物料推荐选项</param>
        /// <param name="auth">授权查询选项</param>
        /// <param name="reqQty">需求数量,会返回满足需求的物料个数</param>
        /// <returns></returns>
        public Result<List<SuggestItem>> Suggest(string order, string itemCode, string erpWH, string whID, string regionID, string shelfID, AuthOption option, double reqQty)
        public Result<List<SuggestItem>> Suggest(string order, string itemCode, SuggestOption option, AuthOption auth, double reqQty)
        {
            var result = new Result<List<SuggestItem>>(Result.Flags.Success, new List<SuggestItem>()) { LocaleMsg = new("WMS.WmsItem.Suggest.Success") };
            try
            {
                var takeCount = 0;
                var checkSum = 0.0;
                var checkCount = 0;
                do
                {
                    takeCount += 50;
                    var check = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos(
                var query = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos(
                                                                JoinType.Left, q.SN == p.SN,
                                                                JoinType.Left, q.WH_ID == w.ID,
                                                                JoinType.Left, q.REGION_ID == r.ID,
                                                                JoinType.Left, q.SHELF_ID == s.ID,
                                                                JoinType.Left, q.LOCATION_ID == l.ID))
                                             //检查用户权限
                                             .ByAuth(option)
                                             .ByAuth(auth)
                                            //允许使用已经分配到库存池中的物料
                                            .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.STATUS <= WMS_ITEM_POOL.STATUSs.WaitPick.GetValue() && p.TRANS_NO == order))
                                            .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.TRANS_NO == order) || p.IS_LOCKED == "N")
                                            //只允许未锁定的
                                            .Where((q, p, w, r, s, l) => q.IS_LOCKED == "N")
                                            //只允许物料状态是在库的
@@ -444,20 +436,30 @@
                                            //如果有传入料号,则只允该料号的物料
                                            .WhereIF(!itemCode.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ITEM_CODE == itemCode)
                                            //如果有传入库位,则只允该库位中的物料
                                            .WhereIF(!erpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == erpWH && q.AUTH_ORG == option.CurOrg)
                                            .WhereIF(!option.ErpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == option.ErpWH && q.AUTH_ORG == auth.CurOrg)
                                            //如果有传入仓库,则只允该仓库的物料
                                            .WhereIF(!whID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == whID && q.AUTH_ORG == option.CurOrg)
                                            .WhereIF(!option.WHID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == option.WHID && q.AUTH_ORG == auth.CurOrg)
                                            //如果有传入储区,则只允该储区的物料
                                            .WhereIF(!regionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == regionID && q.AUTH_ORG == option.CurOrg)
                                            .WhereIF(!option.RegionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == option.RegionID && q.AUTH_ORG == auth.CurOrg)
                                            //如果有传入货架,则只允该货架的物料
                                            .WhereIF(!shelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == shelfID && q.AUTH_ORG == option.CurOrg)
                                            .WhereIF(!option.ShelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == option.ShelfID && q.AUTH_ORG == auth.CurOrg)
                                            //优先使用库存池中的物料
                                            .OrderBy((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID))
                                            //优先使用尾数物料(截料或者退料之后的物料)
                                            .OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T"))
                                            //按生产日期先进先出,再按物料数量从小到大,最后按条码排序
                                            .OrderBy((q, p, w, r, s, l) => q.PROD_DATE).OrderBy(q => q.QTY).OrderBy(q => q.SN)
                                            .Select((q, p, w, r, s, l) => new
                                            //.OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T"))
                                            //备料策略:按生产日期先进先出
                                            .OrderByIF(option.Strategy.HasFlag(WMS_ITEM_POOL.STRATEGYs.FIFO), (q, p, w, r, s, l) => q.PROD_DATE)
                                            //按生产日期先进先出,再按物料数量从小到大,
                                            .OrderByIF(option.Strategy.HasFlag(WMS_ITEM_POOL.STRATEGYs.FSFO), q => q.QTY)
                                            //最后按条码排序
                                            .OrderBy(q => q.SN);
                var takeCount = 0;
                var checkSum = 0.0;
                var checkCount = 0;
                do
                {
                    takeCount += 50;
                    var check = query.Select((q, p, w, r, s, l) => new
                                            {
                                                ItemCode = q.ITEM_CODE,
                                                Sn = q.SN,
@@ -483,37 +485,7 @@
                    }
                } while (checkSum < reqQty && checkCount >= takeCount);
                var items = Biz.Db.Queryable<WMS_ITEM, WMS_ITEM_POOL, WMS_WAREHOUSE, WMS_REGION, WMS_SHELF, WMS_LOCATION>((q, p, w, r, s, l) => new JoinQueryInfos(
                                                                JoinType.Left, q.SN == p.SN,
                                                                JoinType.Left, q.WH_ID == w.ID,
                                                                JoinType.Left, q.REGION_ID == r.ID,
                                                                JoinType.Left, q.SHELF_ID == s.ID,
                                                                JoinType.Left, q.LOCATION_ID == l.ID))
                                             //检查用户权限
                                             .ByAuth(option)
                                            //允许使用已经分配到库存池中的物料
                                            .Where((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID) || (!SqlFunc.IsNullOrEmpty(order) && p.STATUS <= WMS_ITEM_POOL.STATUSs.WaitPick.GetValue() && p.TRANS_NO == order))
                                            //只允许未锁定的
                                            .Where((q, p, w, r, s, l) => q.IS_LOCKED == "N")
                                            //只允许物料状态是在库的
                                            .Where((q, p, w, r, s, l) => q.STATUS == WMS_ITEM.STATUSs.InStore.GetValue())
                                            //如果有传入料号,则只允该料号的物料
                                            .WhereIF(!itemCode.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ITEM_CODE == itemCode)
                                            //如果有传入库位,则只允该库位中的物料
                                            .WhereIF(!erpWH.IsNullOrEmpty(), (q, p, w, r, s, l) => q.ERP_WH == erpWH && q.AUTH_ORG == option.CurOrg)
                                            //如果有传入仓库,则只允该仓库的物料
                                            .WhereIF(!whID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.WH_ID == whID && q.AUTH_ORG == option.CurOrg)
                                            //如果有传入储区,则只允该储区的物料
                                            .WhereIF(!regionID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.REGION_ID == regionID && q.AUTH_ORG == option.CurOrg)
                                            //如果有传入货架,则只允该货架的物料
                                            .WhereIF(!shelfID.IsNullOrEmpty(), (q, p, w, r, s, l) => q.SHELF_ID == shelfID && q.AUTH_ORG == option.CurOrg)
                                            //优先使用库存池中的物料
                                            .OrderBy((q, p, w, r, s, l) => SqlFunc.IsNullOrEmpty(p.ID))
                                            //优先使用尾数物料(截料或者退料之后的物料)
                                            .OrderByDescending((q, p, w, r, s, l) => q.SN.Contains("_C") || q.SN.Contains("_T"))
                                            //按生产日期先进先出,再按物料数量从小到大,最后按条码排序
                                            .OrderBy((q, p, w, r, s, l) => q.PROD_DATE).OrderBy(q => q.QTY).OrderBy(q => q.SN)
                                            .Select((q, p, w, r, s, l) => new SuggestItem
                var items = query.Select((q, p, w, r, s, l) => new SuggestItem
                                            {
                                                Item = q,
                                                poolItem = null,
@@ -793,6 +765,33 @@
            action.Data.MqttMsg = msg;
            return action;
        }
        /// <summary>
        /// 设置当前物料的默认储位
        /// </summary>
        public ApiAction<ScanOutput> SetDefaultLocation(DbClient db, BAS_ITEM Item, WMS_LOCATION location)
        {
            var action = new ApiAction<ScanOutput>(new ScanOutput());
            //调用设置默认储位接口
            //var iInput = new CreateRcvLineLocationInput
            //{
            //};
            //var result = await DI.Resolve<IWMS_U9C>().CreateRcvLineLocation(iInput);
            //if (!result.IsSuccessed)
            //{
            //    action.IsSuccessed = false;
            //    action.LocaleMsg = result.LocaleMsg;
            //}
            //else
            {
                Item.DEFAULT_LOCATION = location.LOCATION_CODE;
                db.Updateable(Item, UserCode).UpdateColumns(q => new { q.DEFAULT_LOCATION, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
            }
            return action;
        }
        #endregion Functions
        /// <summary>