即时库存明细显示到期天数并做颜色标记原创
金蝶云社区-邱育华
邱育华
26人赞赏了该文章 1,695次浏览 未经作者许可,禁止转载编辑于2022年05月26日 15:39:55

一、【需求问题】

1、想要实现即时库存明细中显示到期天数字段的值。将该字段在BOS中放出可见性,同时设置字段名后,在即时库存明细中该字段值依然为空

2、到期天数的计算同保质期预警报表的计算逻辑,到期天数 =  有效期至 - 当前日期的天数差


二、【功能分析】

1、即时库存明细中"到期天数"目前未设置实体字段名,为虚拟字段,虚拟字段即时修改了可见性页面业务不会进行显示

2、即时库存明细列表返回数据并未针对该字段做赋值处理,所以映射实体字段名后,字段显示值为空

3、需要二开列表插件,在列表显示时进行时动态计算,格式化处理


【实现】

1、"到期天数"映射实体字段名FExpiryDays, 设置列表可见性

2、列表插件重写格式化方法FormatCellValue,动态计算到期天数

3、重写OnFormatRowCondition方法,颜色格式化


import clr
clr.AddReference("System")
clr.AddReference("System.Core")
clr.AddReference("Kingdee.BOS")
clr.AddReference("Kingdee.BOS.Core")
clr.AddReference("Kingdee.BOS.DataEntity")、

from System import *
from System import StringComparison
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.Metadata import *
from Kingdee.BOS.Orm.DataEntity import *
from Kingdee.BOS.Core.List.PlugIn import *
from Kingdee.BOS.Core.List.PlugIn.Args import *

def FormatCellValue(e):
    if e.Header.Key.Equals("FExpiryDays", StringComparison.OrdinalIgnoreCase):
        expiryDate = Convert.ToDateTime(e.DataRow["FExpiryDate"])
        if Convert.ToString(expiryDate) != "0001-01-01 00:00:00":
            systemDate = DateTime.Now
            e.FormateValue = Convert.ToString((expiryDate - systemDate).Days + 1)
            
def OnFormatRowConditions(args):    
    if args.DataRow.DynamicObject.DynamicObjectType.Properties.ContainsKey("FExpiryDays") == False:
        return
    if args.DataRow.DynamicObject.DynamicObjectType.Properties.ContainsKey("FExpiryDate") == False:
        return
     
    expiryDate = Convert.ToDateTime(args.DataRow["FExpiryDate"])
    if Convert.ToString(expiryDate) == "0001-01-01 00:00:00":
        return
    
    systemDate = DateTime.Now
    day = Convert.ToInt64((expiryDate - systemDate).Days + 1)
    if day >= 0 and day < 5:
        fc = FormatCondition()
        fc.Key = "FExpiryDays"
        fc.ForeColor = "#FF0000" # 前景色
        fc.BackColor = "#FFFF00" # 背景色
        fc.ApplayRow = False # 格式化整行
        args.FormatConditions.Add(fc)
    if day >= 5 and day < 9:
        fc = FormatCondition()
        fc.Key = "FExpiryDays"
        fc.ForeColor = "#FFB6C1" # 前景色
        fc.BackColor = "#FFFF00" # 背景色
        fc.ApplayRow = True # 格式化整行
        args.FormatConditions.Add(fc)
    if day >= 9:
        fc = FormatCondition()
        fc.Key = "FExpiryDays"
        fc.ForeColor = "#00FFFF" # 前景色
        fc.BackColor = "#FFFF00" # 背景色
        fc.ApplayRow = False # 格式化整行
        args.FormatConditions.Add(fc)


实现效果:

image.png


image.png



参考:

二开案例.列表插件.列表条件格式化

列表插件,单据列表颜色,OnFormatRowConditions

二开案例.列表插件.列表条件格式化之按日期进行格式化

赞 26