| | |
| | | using Rhea.Common; |
| | | using Microsoft.Extensions.Options; |
| | | using Rhea.Common; |
| | | using SqlSugar; |
| | | using System; |
| | | using System.Collections.Generic; |
| | |
| | | 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 |
| | |
| | | foreach (var item in CurInvItem.Items) |
| | | { |
| | | item.STATUS = WMS_ITEM.STATUSs.InStore.GetValue(); |
| | | item.LOTNO = item.LOTNO.IsNullOrEmpty(new Barcode(item.SN).LotNo); |
| | | item.SUPP_LOTNO = CurInvItem.Barcode.LotNo; |
| | | item.FIRST_IN_DATE = item.FIRST_IN_DATE <= DateTime.MinValue ? DateTime.Now : item.FIRST_IN_DATE; |
| | | item.PROD_DATE = item.PROD_DATE <= DateTime.MinValue ? item.FIRST_IN_DATE : item.PROD_DATE; |
| | |
| | | /// </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, |
| | |
| | | action.Data.MqttMsg = msg; |
| | | return action; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 设置当前物料的默认储位 |
| | | /// </summary> |
| | | public ApiAction<ScanOutput> SetDefaultLocation(DbClient db, BAS_ITEM Item, WMS_LOCATION location, long RcvLineId) |
| | | { |
| | | var action = new ApiAction<ScanOutput>(new ScanOutput()); |
| | | |
| | | //调用设置默认储位接口 |
| | | var iInput = new CreateRcvLineLocationInput |
| | | { |
| | | IsLogin = true, |
| | | RcvLineLocationParam = new() |
| | | { |
| | | RcvLineId = RcvLineId, |
| | | BinCode = location.LOCATION_CODE, |
| | | } |
| | | }; |
| | | var result = DI.Resolve<IWMS_U9C>().CreateRcvLineLocation(iInput).Result; |
| | | 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> |
| | | /// 重置本次扫码信息 |
| | | /// </summary> |
| | | public virtual void ResetScan() |
| | | { |
| | | //清理暂存数据提交操作 |
| | | DBCommitList.Clear(); |
| | | } |
| | | |
| | | public override bool Close(bool needSaveHistoryLog = false) |
| | | { |
| | | //needSaveHistoryLog = true; |