即时库存明细可用量排除弱预留计算二开案例

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

即时库存明细可用量排除弱预留计算二开案例

【即时库存明细】查询中,涉及到库存量、可用量、预留量,以及各种单位:基本单位、主单位(库存单位)、库存辅单位,与之对应的数量有:

  • 库存量(基本单位)、库存量(主单位)、库存量(库存辅单位)

  • 可用量(基本单位)、可用量(主单位)、可用量(库存辅单位)

  • 预留量(基本单位)、预留量(主单位)、可用量(库存辅单位)


数量&单位基本单位库存单位库存辅单位
库存量库存量(基本单位)库存量(库存单位)库存量(库存单位)
可用量可用量(基本单位)可用量(库存单位)可用量(库存单位)
预留量预留量(基本单位)预留量(库存单位)预留量(库存单位)


结合即时库存表数据结构、插件处理逻辑以及单位和数量的一些关系需要理解:

1、即时库存表T_STK_INVENTORY,只有基本单位数量以及辅单位数量是能直接使用,其他单位数量以及可用量情况都需要经过单位换算、计算才能得到

2、即时库存中的预留量的计算,取数来源于预留表T_PLN_RESERVELINK、T_PLN_RESERVELINKENTRY,目前展示数据并未区分强预留和弱预留,即:可用量 = 库存量-强预留-弱预留

3、预留关系表头:T_PLN_RESERVELINK,字段FRESERVETYPE:1:弱预留 3:强预留

   预留关系表体:T_PLN_RESERVELINKENTRY, 字段FSUPPLYFORMID: 供给类型

image.webp

4、即时库存明细列表插件中,各单位数据的换算核心逻辑在BeforeGetDataForTempTableAccess方法,该方法中返回一个临时表,该表包含本次查询满足条件的

即时库存数据,以基本单位数量为基础,更新及换算该表的其他数量,最终展示到页面


当前的一个需求:即时库存明细中的可用量是否可以设置为 "库存量-强预留", 而不是"库存量-强预留-弱预留"? 

通过对上述逻辑的理解,通过二开插件,重写取数和换算逻辑即可。


一、反编译标准插件的处理:

image.webp

image.webp


二、二开插件,核心逻辑

sql = '''MERGE INTO {0} IT
USING(SELECT T2.FID,SUM(ISNULL(TKE.FBASEQTY,0)) AS FBASELOCKQTY,SUM(ISNULL(TKE.FSECQTY,0)) AS FSECLOCKQTY 
      FROM T_PLN_RESERVELINKENTRY TKE INNER JOIN T_PLN_RESERVELINK TLKH ON TKE.FID = TLKH.FID RIGHT JOIN {0} T2 
        ON TKE.FSUPPLYINTERID = T2.FID AND TKE.FSUPPLYFORMID = 'STK_Inventory' AND TLKH.FRESERVETYPE = '3'  AND TKE.FBASEQTY > 0  
     GROUP BY T2.FID) IT2
ON (IT.FID = IT2.FID)
WHEN MATCHED THEN 
UPDATE SET 
IT.FBASELOCKQTY = IT2.FBASELOCKQTY;'''.format(str(e.TableName))
    DBUtils.Execute(this.View.Context, sql)
    
    sql = '''UPDATE {0} SET FBASEAVBQTY = FBASEQTY - FBASELOCKQTY'''.format(str(e.TableName))
    DBUtils.Execute(this.View.Context, sql)
    
    # <type 'List[ColumnField]'>
    selCols = this.ListModel.FilterParameter.ColumnInfo
    secQty = selCols.Exists(lambda p: p.Key == "FSecQty") or selCols.Exists(lambda p: p.Key == "FSecLockQty") or selCols.Exists(lambda p: p.Key == "FSecAVBQty")
    if secQty == True:
        sql = '''UPDATE {0} SET FSECAVBQTY = FSECQTY - FSECLOCKQTY'''.format(str(e.TableName))
        DBUtils.Execute(this.View.Context, sql)
        
    sql = '''MERGE INTO {0} IT USING(SELECT To_decimal(CASE
                           WHEN T2.FSTOREURNOM = 0
                                 OR T2.FSTOREURNUM = 0 THEN T1.FBASEQTY
                           ELSE To_decimal(T1.FBASEQTY * T2.FSTOREURNOM, 23, 10) / T2.FSTOREURNUM
                         END, 23, 10) FQTY,
              To_decimal(CASE
                           WHEN T2.FSTOREURNOM = 0
                                 OR T2.FSTOREURNUM = 0 THEN T1.FBASEAVBQTY
                           ELSE To_decimal(T1.FBASEAVBQTY * T2.FSTOREURNOM, 23, 10) / T2.FSTOREURNUM
                         END, 23, 10) FAVBQTY,
              T1.FID
       FROM   {0} T1
              INNER JOIN T_BD_MATERIALSTOCK T2
                      ON T1.FMATERIALID_ID = T2.FMATERIALID) IT2
ON(IT.FID = IT2.FID)
WHEN MATCHED THEN
  UPDATE SET IT.FQTY = IT2.FQTY,
             IT.FAVBQTY = IT2.FAVBQTY;'''.format(str(e.TableName))
    DBUtils.Execute(this.View.Context, sql);


image.webp


三、结果

1、物料由"MRP运算产生",确认该条锁库数据为弱预留

image.webp

2、查询即时库存,可用量 = 库存量-强预留,排除弱预留数据

image.webp


说明:

1、该二开只适用于即时库存明细,即时库存的处理逻辑完全不同,不可通用

2、该方案的各数量的准确性需要结合具体账套业务数据验证,确认无误再使用

3、插件可随时取消,还原到系统标准的处理方式


参考:

1、【即时库存二开字段方案整理

2、【即时库存查询WebApi接口(使用自定义接口封装)调用示例

3、【客户需求】锁库- 二开如何调用锁库的函数

即时库存明细可用量预留.rar


即时库存明细可用量排除弱预留计算二开案例

在【即时库存明细】查询中,涉及到库存量、可用量、预留量,以及各种单位:基本单位、主单位(库存单位)、库存辅单位,与之对应的数量有:库...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息