批号拣货按库存状态设置拣货原创
金蝶云社区-邱育华
邱育华
29人赞赏了该文章 1,492次浏览 未经作者许可,禁止转载编辑于2022年04月27日 21:40:04

一、【业务需求】

拣货场景:一个仓库下的物料库存状态涉及"可用"、"不良"、"废品"、"冻结"等, 拣货只按照物料+库存状态拣货,仓库不管,目的是要拣出"可用"库存状态的物料,想要在库存状态上有类似仓库"参与拣货"的控制,拣货服务再配置勾选"只考虑参与拣货的库存状态"


二、【功能分析】

当前系统的拣货服务功能只支持到仓库级的配置,控制仓库拣货或者拣货,对于仓库里面又区分个别库存状态不参与拣货,目前没有实现,只能通过二开拣货插件的方式处理。


二开拣货插件相关文章参考:

1、批号拣货插件 

2、批号捡货二次开发插件示例 

3、有源单批号拣货仓库过滤

4、有源单批号拣货按最小包装量倍数拣货


二次开发步骤:

 1、库存状态扩展字段"参与拣货",用于对拣货库存数据的过滤

image.png

2、编写插件继承批号拣货插件基类;

3、根据业务需要重载对应事件RegexUseableInvData,该事件用于处理拣货前处理获取的即时库存数据, 获取到可用于拣货的库存状态设置,添加过滤到拣货的即时库存数据。


using Kingdee.BOS.App.Data;
using Kingdee.K3.SCM.App.Core.ConvertBusinessService;
using System;
using System.Collections.Generic;
using System.Data;

namespace Kingdee.K3.SCM.App.Stock.CustomizePlugIn
{
    public class LotStockStatusFilter : AbstractLotPickPlugIn
    {
        public override void RegexUseableInvData(Dictionary<long, DataTable> dctinvDatas)
        {
            base.RegexUseableInvData(dctinvDatas);

            List<long> dataRuleStockStatusIds = new List<long>();

            string stockSql = string.Format(@"SELECT FSTOCKSTATUSID from T_BD_STOCKSTATUS WHERE FAVAILABLEPICKING = 1");
            using (IDataReader dataReader = DBUtils.ExecuteReader(this.Ctx, stockSql))
            {
                while (dataReader.Read())
                {
                    dataRuleStockStatusIds.Add(Convert.ToInt64(dataReader["FSTOCKSTATUSID"]));
                }
                dataReader.Close();
            }

            // 根据库存状态数据权限,从获取的即时库存中移除无权限的仓库库存状态明细
            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 stockStatusId = Convert.ToInt64(row["FSTOCKSTATUSID"]);
                    if (!dataRuleStockStatusIds.Contains(stockStatusId))
                    {
                        removeRows.Add(i);
                    }
                }

                foreach (var index in removeRows)
                {
                    invTable.Rows.RemoveAt(index);
                }
            }
        }
    }
}


3.注册插件至对应服务配置界面。



以上二开仅供参考,是否能够达到业务要求有待实际账套业务数据验证! 


赞 29