本文提供了四个案例,描述了如何在企业资源规划(ERP)系统中对差旅费报销单及相关表单进行二次开发(二开)和功能调整。案例一介绍了在PC端和手机端扩展差旅费报销单字段的方法,包括如何在界面上增加字段、修改汇总逻辑以及保存校验;案例二说明了如何限制员工仅通过申请单报销,不允许手工新增费用报销单;案例三展示了如何调整录入页面元素顺序;案例四则是关于如何调整申请单的借款方式,去除不必要的选项,并给出了代码示例。
案例一:
差旅费报销单扩展了一个出差费用字段,例如“租车费用”。需要参与小计。
二开原因:因为字段是动态扩展的,因此表单上的数据不能通过值更新事件刷新重算。
业务背景:差旅费报销单扩展了一个出差费用字段,例如“租车费用”。需要参与小计。
对于PC端来说BOS IDE中扩展配置如下。
1、加字段
2、修改汇总的实体服务规则
3、修改保存校验
PC端的扩展就做好了。
但是手机端的扩展应该如何实现呢?
首先分析下这里的3点改动:
1、 界面(行程编辑的界面)上增加可供录入和查看的字段。
解决方式:在“掌上报销自定义字段设置”中添加。
2、 参与费用金额小计的几个字段值更新时重新计算小计的费用金额。
解决方式:插件中重算(代码和步骤见后面)。
3、 保存时校验分项费用金额是否与小计的一致。
解决方式:由于手机端保存等操作与PC端执行的是同样的校验,因为不需要额外操作。
因此,步骤如下:
0、 放开掌上报销中对应字段显示
1、新建一个基于.Net Framework 4 的类库项目;
2、工程References右键,添加工程引用,所添加组件都来自Cloud网站的website\bin路径:
Kingdee.BOS.dll
Kingdee.BOS.Core.dll
Kingdee.BOS.Core.DataEntity.dll
Kingdee.BOS.Mobile.Model.dll
修改插件工程输出路径为Cloud网站路径website\bin:选中插件工程 → 右键 → Property(属性) → Build页签 → Output Path(输出路径)
2.1、
新建一个扩展类,继承 AbstractMobilePlugin
下面示例代码实现的是【新增了一个费用明细的金额字段,费用金额等于该字段与其他字段求和】的功能:(类似功能都可以在值更新事件里处理)
4、 插件拷贝到服务器端website\bin目录后,在服务器上打开BOS IDE(BOS集成开发平台),财务会计->费用报销->移动业务->移动表单,扩展“掌上报销V2_出行计划”:
3.1、往【表单插件】里面注册并启用我们扩展的插件:
点开表单插件属性,注册编译生成的插件工程组件,从website\bin路径下找到插件工程组件,选择插件工程组件下的插件类,一般在插件类上使用微软元数据描述,在注册插件时区分不同的类,选择注册插件后,注意勾选“启用”复选框:
4、保存成功后,就可以测试是否生效了。
示例源代码:
using System;
using System.ComponentModel;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Mobile.PlugIn;
using Kingdee.BOS.Util;
namespace Kingdee.ExtDevDemo
{
/// <summary>
/// 二开示例-差旅报销单
/// </summary>
[Description("二开示例_差旅报销单")]
public class ExpReimbTravelExtPlugin : AbstractMobilePlugin
{
/// <summary>
/// 处理值更新事件
/// </summary>
/// <param name="e"></param>
public override void DataChanged(DataChangedEventArgs e)
{
base.DataChanged(e);
if (Convert.ToString(this.View.OpenParameter.GetCustomParameter("SrcFormId")) != "ER_ExpReimbursement_Travel")
{//源单不是差旅报销单,不处理;(根据实际业务)
return;
}
string key = e.Field.Key.ToUpperInvariant();
switch (key)
{
case "FFLYAMOUNT"://机票
case "FCITYTRAFFICFEE"://市内交通费
case "FLODGINGFEE"://住宿费
case "FOTHERTRAAMOUNT"://其他长途交通费
case "FTRAVELSUBSIDY"://出差补助
case "FOTHEREXPENSE"://其他费用
case "F_PAEZ_DECIMAL"://二开扩展字段
decimal dclFFlyAmount = TryGetFieldValue("FFlyAmount", "FlyAmount");//机票
decimal dclFCityTrafficFee = TryGetFieldValue("FCityTrafficFee", "CityTrafficFee");//市内交通费
decimal dclFLodgingFee = TryGetFieldValue("FLodgingFee", "LodgingFee");//住宿费
decimal dclFOtherTraAmount = TryGetFieldValue("FOtherTraAmount", "OtherTraAmount");//其他长途交通费
decimal dclFTravelSubsidy = TryGetFieldValue("FTravelSubsidy", "TravelSubsidy");//出差补助
decimal dclFOtherExpense = TryGetFieldValue("FOtherExpense", "OtherExpense");//其他费用
//decimal dclTotal = dclFFlyAmount + dclFCityTrafficFee + dclFLodgingFee + dclFOtherTraAmount + dclFTravelSubsidy + dclFOtherExpense;
//二开扩展字段
decimal dclExt = TryGetFieldValue("F_PAEZ_Decimal", "F_PAEZ_Decimal");
//上面各金额求和=费用金额
decimal dclTotal = dclFFlyAmount + dclFCityTrafficFee + dclFLodgingFee + dclFOtherTraAmount + dclFTravelSubsidy + dclFOtherExpense + dclExt;
this.View.Model.SetValue("FORGAMOUNT", dclTotal);
break;
default:
break;
}
}
/// <summary>
/// 尝试获取decimal字段的值
/// </summary>
/// <param name="key">标识</param>
/// <param name="ormKey">绑定实体属性</param>
/// <returns>decimal</returns>
private decimal TryGetFieldValue(string key, string ormKey)
{
decimal dcl = this.View.Model.DataObject.Contains(ormKey) ? Convert.ToDecimal(this.View.Model.GetValue(key)) : 0;
return dcl;
}
}
}
案例二:
客户希望员工只通过申请单报销,不允许手工新增费用报销单和差旅费报销单。
步骤:
1、打开BOSIDE。找到移动表单“掌上报销V2_首页”
2、删除2个标签控件的标题。
3、修改2个按钮的宽高为0。
效果如下
案例三:
希望调整录入页面的元素顺序,比如将事由调整到下面掌上报销录入页面控件顺序调整教程
案例四:
希望调整申请单的借款方式,去掉部分选项(PC端还有使用,不反审核结算方式)
1.重写AfterBindDate,在这个事件里给FBORROWTYPE控件重新赋值,具体代码示例如下(无需借款和银行转账两种)
List<EnumItem> lstEnumItem = new List<EnumItem>();
EnumItem item = new EnumItem();
item.Value = "0";
item.Caption = new LocaleValue("无需借款", this.Context.UserLocale.LCID);
lstEnumItem.Add(item);
this.View.GetControl("FBORROWTYPE").SetValue(null);
item = new EnumItem();
item.Value = "3";
item.Caption = new LocaleValue("银行转账", this.Context.UserLocale.LCID);
lstEnumItem.Add(item);
this.View.GetFieldEditor<ComboFieldEditor>("FBORROWTYPE", -1).SetComboItems(lstEnumItem);
复制代码
2.具体的借款方式的id、name需要从数据库表T_BD_SETTLETYPE中查,把FID赋值给itme.Value FNAME赋值给 item.Caption(上面示例是写死的,具体二开根据需求可以写死也可以从数据库中取)
推荐阅读