通过插件重算差旅费报销单(新政)行程中的天数原创
金蝶云社区-俊宏
俊宏
4人赞赏了该文章 940次浏览 未经作者许可,禁止转载编辑于2022年09月29日 10:21:48


1.     前序

本教程需求您有基础的Python插件或C#插件的开发能力。

2.     背景

目前在差旅费报销单(新政)(后面简称新政报销单)中,行程信息的天数是由插件进行计算的。天数为(结束日期-开始日期)+1天。 但是不同的公司,对于行程天数的计算是不尽相同的。因此,标准产品的天数计算不能满足所有公司需求,这时便需要插件进行天数的重算。

3.     实现思想

我们通过在值更新事件DataChanged(e)里面对天数进行重算,从而实现我们天数计算的调整。我们以计算规则

天数=结束日期-开始日期(当结束日期=开始日期时,天数=1

为例,通过Python插件和C#插件分别讲解如何实现。特别地,Python插件适用于公有云和私有云客户,而C#插件仅适合私有云客户。

4.     实现步骤

4.1.    Python实现

(1)打开BOS设计器,找到差旅费报销单并点击拓展,在表单插件中点击“注册Python插件”。

image.png

注册Python插件



(2)在标题写入“天数计算”。并在标题下方写入示例的Python脚本。在这段代码中days=(endDate-startDate).Days是计算天数的公式,并通过判断条件(days==0)进行判断,若等于0则算1天,若不等于0则按实际计算天数。最后通过this.View.Model.SetValue("FTravelDays", 1, e.Row)将天数写入字段中,而e.Row表示发生日期更新的具体行号。

import clr
clr.AddReference('mscorlib')
clr.AddReference('Kingdee.BOS.Core')
from System import *
from Kingdee.BOS.Core.Bill.PlugIn import *
 
def DataChanged(e):
    if (e.Field.Key=='FStartDate' or e.Field.Key=='FFinishDate'):
        startDate = Convert.ToDateTime(this.Model.GetValue("FStartDate", e.Row))
        endDate = Convert.ToDateTime(this.Model.GetValue("FFinishDate", e.Row))
        days=(endDate-startDate).Days
        if(days==0):
            this.Model.SetValue("FTravelDays", 1, e.Row)  
        else:          
            this.Model.SetValue("FTravelDays", days, e.Row)

 Python示例脚本

(3)        点击保存。注意,若在新政报销单中发现这个脚本没有生效,则需要从星空注销用户并清空缓存。

4.2.    C#实现

(1)新建.Net Framework 类库项目,并引用Kingdee.BOS.Core.dll和Kingdee.BOS.DataEntity.dll两个动态库

(2)在项目中新建类,我们先命名该类为“TravelDateCalculate”。并将该类继承AbstractBillPlugIn。

(3)重写值更新事件DataChanged(DataChangedEventArgs e)。结果请参考C#代码示例

using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using System;
using System.ComponentModel;

namespace MyCalculate
{
    [Description("新政报销单天数计算表单插件")]
    public class TravelDateCalculate : AbstractBillPlugIn
    {
        public override void DataChanged(DataChangedEventArgs e)
        {
            base.DataChanged(e);
            if (e.Field.Key == "FStartDate" || e.Field.Key == "FFinishDate")
            {
                DateTime startDate = Convert.ToDateTime(this.Model.GetValue("FStartDate", e.Row));
                DateTime endDate = Convert.ToDateTime(this.Model.GetValue("FFinishDate", e.Row));
                int days = (endDate - startDate).Days;
                if (days == 0)
                {
                    this.Model.SetValue("FTravelDays", 1, e.Row);
                }

                else
                {
                    this.Model.SetValue("FTravelDays", days, e.Row);
                }
            }
        }
    }
}

 C#示例代码

(4)在星空安装的服务中打开BOS设计器,找到差旅费报销单并点击拓展,在表单插件中点击“注册”。选取到我们制作的组件文件(.dll)并确定即可。

image.png

 注册C#插件

5.     结语

这样我们就实现了新政报销单行程天数的重新计算。您可以在此基础上尝试较为复杂的天数计算规则。感想您看到最后,更多内容请浏览金蝶云社区。


赞 4