批号拣货尾数按最小包装发货的二开案例实现原创
金蝶云社区-邱育华
邱育华
13人赞赏了该文章 449次浏览 未经作者许可,禁止转载编辑于2022年10月28日 09:40:13

一、【业务需求】

单据转换批号拣货拆分尾数按最小包装发货。

举例:

1、订单A 150个, 物料B的最小包装为200, B即时库存有两批货:01批次有20, 02批次有800。先发01批次20个(拣货出来的第一个批号如果即时库存不满足应发数量则发即时库存的数量,如果满足则发应发数量,再发02批次的200(这里的两百是因为客户要求拣货最后的一个批号需要单独考虑最小包装量)

2、上述条件不变,物料B的即时库存有三个批号,01数量20,02数量40,03数量400。希望批号拣货第一行调拨数是20,批号01;第二行40,批号02;第三行数量200,批号03


二、【分析实现】

二开需求,针对批号拣货拆分后最后一行做处理

相关参考:【有源单批号拣货按最小包装量倍数拣货


using Kingdee.BOS.App.Data;
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.Data;

namespace TestPickDemo
{
    public class LotPickRegexPickInfoQtyFilter : AbstractLotPickPlugIn
    {
public override void RegexPickInfoQty(RegexEntityPickInvRowDataQtyArgs e)
        {
            var materialId = e.MatInfo.MaterialId;
            var curPickInfo = e.CurPickInfo;
            var invRowBaseQty = Convert.ToDecimal(e.CurInvDataRow["FBASEQTY"]); // 当前库存批次数量
            var needBaseQty = e.NeedBaseQty; // 当次捡货基本单位需求数量
            var pickedBaseQty = e.PickedBaseQty; // 当次捡货结果基本单位数量,标准拣货执行完,该值表示此行已拣货数量,用于回填单据分录
var reMainBaseQty = curPickInfo.ReMainBaseQty // 剩余基本单位数量,当前还需拣货数量
            
            // 当前批次不足,后续会继续做拆分,不做处理
            if (needBaseQty > pickedBaseQty) return;
            
            // curPickInfo.ReMainBaseQty > 0 表示当前批次拣货满足需求数量后还有剩余,理解为拣货拆分的最后一个批次
            if (reMainBaseQty > 0)
            {
                string stockSql = string.Format(@"SELECT FINCREASEQTY FROM t_BD_MaterialPlan WHERE FINCREASEQTY != 0 and FMATERIALID = {0}", materialId);
                using (IDataReader dataReader = DBUtils.ExecuteReader(this.Ctx, stockSql))
                {
while (dataReader.Read())
                    {
                        // 最小包装量
                        decimal increaseQty = Convert.ToDecimal(dataReader["FINCREASEQTY"]);
                        
                        // 当前库存批次数量 大于 基本单位需求数量,修改"基本单位拣货数量"结果
                        if (invRowBaseQty > needBaseQty)
                        {
                            // 当前库存批次数量 小于 最小包装量
                            if(invRowBaseQty < increaseQty)
                            {
                                e.PickedBaseQty = invRowBaseQty; // "基本单位拣货数量" 等于 当前库存批次数量
                            }
                            else
                            {
                                e.PickedBaseQty = increaseQty; // "基本单位拣货数量" 等于 最小包装量
                            }
                        }
                    }
                } 
            }
        }
}


image.png

image.png

image.png


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


赞 13