| | |
| | | using Rhea.Common; |
| | | using Microsoft.Extensions.Options; |
| | | using Rhea.Common; |
| | | using SqlSugar; |
| | | using System; |
| | | using System.Collections.Generic; |
| | |
| | | /// </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") |
| | | //只允许物料状态是在库的 |
| | |
| | | //如果有传入料号,则只允该料号的物料 |
| | | .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); |
| | |
| | | /// </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") |
| | | //只允许物料状态是在库的 |
| | |
| | | //如果有传入料号,则只允该料号的物料 |
| | | .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, |
| | |
| | | } |
| | | } 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, |