匹配库存出库排除部分仓库不参与拣货实现案例原创
金蝶云社区-邱育华
邱育华
3人赞赏了该文章 1115次浏览 未经作者许可,禁止转载编辑于2022年12月07日 10:44:46

一、【业务需求】

单据执行匹配出库服务进行拣货的时候,限制不拣货某个仓库


二、【场景分析】

以直接调拨单为例,二次开发步骤:

1、扩展"多选基础资料"类型,绑定仓库基础资料,用于单据指定不参与拣货的仓库集合

image.png

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);
                }
            }
        }
    }
}


服务注册插件:

image.png


即时库存数据:
image.png


调拨数量20

  • 未限制拣货仓库,触发匹配库存出库,按照近效期先出规则,数量进行了拆分,匹配aa仓库的批号库存

image.png

  • 限制拣货仓库,aa仓库不用于拣货,触发匹配库存出库,按照近效期先出规则,由于aa仓库不允许出库,匹配"允许负库存仓"仓库的批号库存

image.png



相关参考:

赞 3