有源单批号拣货根据上游单据头特定字段过滤拣货数据原创
金蝶云社区-邱育华
邱育华
18人赞赏了该文章 806次浏览 未经作者许可,禁止转载编辑于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、二开插件思路

  1. 批号捡货插件抽象类:AbstractLotPickPlugIn,重写方法BeforePicking(e)、RegexUseableInvData(e)

  2. 在RegexUseableInvData(e)方法中获取FEntity_Link,得到上游单据内码集合,再根据内码获取上游单据的数据,再获取指定字段的值

  3. 根据指定字段值结合仓库资料设置,过滤出符合要求的仓库

  4. 根据满足拣货条件的仓库集合,筛选待拣货的库存数据


三、【核心代码】

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