批号拣货按库存状态设置拣货原创
29人赞赏了该文章
1,670次浏览
编辑于2022年04月27日 21:40:04
一、【业务需求】
拣货场景:一个仓库下的物料库存状态涉及"可用"、"不良"、"废品"、"冻结"等, 拣货只按照物料+库存状态拣货,仓库不管,目的是要拣出"可用"库存状态的物料,想要在库存状态上有类似仓库"参与拣货"的控制,拣货服务再配置勾选"只考虑参与拣货的库存状态" |
二、【功能分析】
当前系统的拣货服务功能只支持到仓库级的配置,控制仓库拣货或者拣货,对于仓库里面又区分个别库存状态不参与拣货,目前没有实现,只能通过二开拣货插件的方式处理。
二开拣货插件相关文章参考:
1、批号拣货插件
二次开发步骤:
1、库存状态扩展字段"参与拣货",用于对拣货库存数据的过滤
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
29人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读