有源单批号拣货根据上游单据头特定字段过滤拣货数据原创
18人赞赏了该文章
923次浏览
编辑于2022年11月25日 17:08:58
一、【业务需求】
源单上都扩展事业部字段,并且每个仓库都会加上“所属事业部”字段并维护好,在单据下推领料单时,根据事业部的仓库进行先进先出例如:
原料仓 A 物料 100个 入库时间 2022-01-01 A事业部,
回收仓 A物料 50 个 入库时间 2022-01-05 B事业部,
待利用仓 A 物料 20 个 入库时间 2022-01-15 A事业部
如果源单是A事业部,需要120个A物料,下推单据时,就会自动带出原料仓 A 物料 100个,待利用仓 A物料 20个,回收仓由于属于B事业部,所以不满足拣货仓库条件
这种如何修改批号拣货服务的插件以实现这个需求?
二、【功能分析】
1、拣货相关文章参考
2、二开插件思路
批号捡货插件抽象类:AbstractLotPickPlugIn,重写方法BeforePicking(e)、RegexUseableInvData(e)
在RegexUseableInvData(e)方法中获取FEntity_Link,得到上游单据内码集合,再根据内码获取上游单据的数据,再获取指定字段的值
根据指定字段值结合仓库资料设置,过滤出符合要求的仓库
根据满足拣货条件的仓库集合,筛选待拣货的库存数据
三、【核心代码】
using Kingdee.BOS.App.Core.Query; using Kingdee.BOS.Core; using Kingdee.BOS.Core.Metadata; using Kingdee.BOS.Core.SqlBuilder; using Kingdee.BOS.Orm.DataEntity; using Kingdee.K3.Core.SCM.STK; 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 LotPickDemo { public class LotPickTestFilter : 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); List<object> lstBillId = new List<object>(); foreach (ExtendedDataEntity entry in _entitys) { var link = entry["FEntity_Link"] as DynamicObjectCollection; foreach(var linkItem in link) { //循环关联数据包,得到上游单据内码集合 var sBillId = Convert.ToInt64(linkItem["SBillId"]); lstBillId.Add(sBillId); } } // 得到上游单据元数据 FormMetadata sourcMetaData = BOS.ServiceHelper.MetaDataServiceHelper.Load(this.Ctx, "上游单据FormId") as FormMetadata; var sourceBInfo = sourcMetaData.BusinessInfo; string fid = sourceBInfo.GetForm().PkFieldName; var filter = string.Format(" {0} in ({1})", fid, string.Join(",", lstBillId.ToArray())); //构建查询参数 var queryParam = new QueryBuilderParemeter(); queryParam.FormId = sourceBInfo.GetForm().Id; queryParam.FilterClauseWihtKey = filter; queryParam.SelectItems.Add(new SelectorItemInfo("事业部字段")); //从数据库中得到查询结果 QueryService queryService = new QueryService(); var dynObjFormDb = queryService.GetDynamicObjectCollection(this.Ctx, queryParam); // TODO: // 1、从dynObjFormDb数据集合中获取到"事业部"字段 // 2、根据事业部筛选出对应的仓库集合 // 3、根据仓库集合筛选拣货数据:有源单批号拣货仓库过滤 https://vip.kingdee.com/article/256794181170277632 } } }
赞 18
18人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读