匹配库存出库排除部分仓库不参与拣货实现案例原创
5人赞赏了该文章
1,632次浏览
编辑于2022年12月07日 10:44:46
一、【业务需求】
单据执行匹配出库服务进行拣货的时候,限制不拣货某个仓库
二、【场景分析】
以直接调拨单为例,二次开发步骤:
1、扩展"多选基础资料"类型,绑定仓库基础资料,用于单据指定不参与拣货的仓库集合
2、编写插件继承批号拣货插件基类;
3、根据业务需要重载对应事件BeforePicking、RegexUseableInvData,该事件用于处理拣货前处理获取的即时库存数据,根据设置,过滤排除不进行拣货的仓库库存数据
using Kingdee.BOS.Orm.DataEntity; using Kingdee.K3.SCM.App.Core.ConvertBusinessService; using Kingdee.K3.SCM.App.Core.ConvertBusinessService.LotPickArgs; using System; using System.Collections.Generic; using System.Data; namespace PickLotDemo { public class LotPickInventoryStockMatchFilter : AbstractLotPickPlugIn { private BOS.Core.ExtendedDataEntity[] _entitys; public override bool BeforePicking(BeforePickingArgs e) { _entitys = e.Entitys; return true; } public override void RegexUseableInvData(Dictionary<long, DataTable> dctinvDatas) { base.RegexUseableInvData(dctinvDatas); DynamicObject parEntity = _entitys[0].DataEntity.Parent as DynamicObject; DynamicObjectCollection dynObj = (DynamicObjectCollection)(parEntity["MulDonotPickInvStock"]); List<long> notPickStockIds = new List<long>(); // 不拣货仓库集合 foreach (DynamicObject item in dynObj) { notPickStockIds.Add(Convert.ToInt64(item["MulDonotPickInvStock_Id"])); } foreach (var item in dctinvDatas) { int count = item.Value.Rows.Count; var invTable = item.Value; List<int> removeRows = new List<int>(); for (var i = count - 1; i >= 0; i--) { DataRow row = invTable.Rows[i]; long stockId = Convert.ToInt64(row["FSTOCKID"]); if (notPickStockIds.Contains(stockId)) { removeRows.Add(i); } } foreach (var index in removeRows) { invTable.Rows.RemoveAt(index); } } } } }
服务注册插件:
即时库存数据:
调拨数量20
未限制拣货仓库,触发匹配库存出库,按照近效期先出规则,数量进行了拆分,匹配aa仓库的批号库存
限制拣货仓库,aa仓库不用于拣货,触发匹配库存出库,按照近效期先出规则,由于aa仓库不允许出库,匹配"允许负库存仓"仓库的批号库存
相关参考:
赞 5
5人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读