​金蝶云掌上报销二开案例汇总
金蝶云社区-张天龙
张天龙
9人赞赏了该文章 3515次浏览 未经作者许可,禁止转载编辑于2018年06月13日 11:29:09

案例一
差旅费报销单扩展了一个出差费用字段,例如“租车费用”。需要参与小计。
二开原因:因为字段是动态扩展的,因此表单上的数据不能通过值更新事件刷新重算。

业务背景:差旅费报销单扩展了一个出差费用字段,例如“租车费用”。需要参与小计。

对于PC端来说BOS IDE中扩展配置如下。

1、加字段

blob.png

2、修改汇总的实体服务规则

blob.png 

blob.png 

3、修改保存校验

blob.png 

 

PC端的扩展就做好了。

但是手机端的扩展应该如何实现呢?

首先分析下这里的3点改动:

1、 界面(行程编辑的界面)上增加可供录入和查看的字段。

解决方式:在“掌上报销自定义字段设置”中添加。

2、 参与费用金额小计的几个字段值更新时重新计算小计的费用金额。

解决方式:插件中重算(代码和步骤见后面)。

3、 保存时校验分项费用金额是否与小计的一致。

解决方式:由于手机端保存等操作与PC端执行的是同样的校验,因为不需要额外操作。

 

 

因此,步骤如下:

0、 放开掌上报销中对应字段显示

blob.png 

 

1、新建一个基于.Net Framework 4 的类库项目;

blob.png 

 

 

 

 

2、工程References右键,添加工程引用,所添加组件都来自Cloud网站的website\bin路径:

Kingdee.BOS.dll

Kingdee.BOS.Core.dll

Kingdee.BOS.Core.DataEntity.dll

Kingdee.BOS.Mobile.Model.dll

 

blob.png 

 

修改插件工程输出路径为Cloud网站路径website\bin:选中插件工程 → 右键 → Property(属性) → Build页签 → Output Path(输出路径)

blob.png 

 

2.1、

新建一个扩展类,继承 AbstractMobilePlugin

下面示例代码实现的是【新增了一个费用明细的金额字段,费用金额等于该字段与其他字段求和】的功能:(类似功能都可以在值更新事件里处理)

blob.png 

 

4、 插件拷贝到服务器端website\bin目录后,在服务器上打开BOS IDE(BOS集成开发平台),财务会计->费用报销->移动业务->移动表单,扩展“掌上报销V2_出行计划”:

blob.png 

 

3.1、往【表单插件】里面注册并启用我们扩展的插件:

blob.png 

 

点开表单插件属性,注册编译生成的插件工程组件,从website\bin路径下找到插件工程组件,选择插件工程组件下的插件类,一般在插件类上使用微软元数据描述,在注册插件时区分不同的类,选择注册插件后,注意勾选“启用”复选框:

 

 

 

4、保存成功后,就可以测试是否生效了。

blob.png 


示例源代码:

 

 

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个标签控件的标题。

blob.png3、修改2个按钮的宽高为0。
blob.png

效果如下
blob.png




案例三:

希望调整录入页面的元素顺序,比如将事由调整到下面掌上报销录入页面控件顺序调整教程

案例四:
希望调整申请单的借款方式,去掉部分选项(PC端还有使用,不反审核结算方式)

1.重写AfterBindDate,在这个事件里给FBORROWTYPE控件重新赋值,具体代码示例如下(无需借款和银行转账两种)

  1. List<EnumItem> lstEnumItem = new List<EnumItem>();

  2.             EnumItem item = new EnumItem();

  3.             item.Value = "0";

  4.             item.Caption = new LocaleValue("无需借款", this.Context.UserLocale.LCID);

  5.             lstEnumItem.Add(item);

  6.             this.View.GetControl("FBORROWTYPE").SetValue(null);

  7.             item = new EnumItem();

  8.             item.Value = "3";

  9.             item.Caption = new LocaleValue("银行转账", this.Context.UserLocale.LCID);

  10.             lstEnumItem.Add(item);      

  11.             this.View.GetFieldEditor<ComboFieldEditor>("FBORROWTYPE", -1).SetComboItems(lstEnumItem);

复制代码

         
2.具体的借款方式的id、name需要从数据库表T_BD_SETTLETYPE中查,把FID赋值给itme.Value  FNAME赋值给 item.Caption(上面示例是写死的,具体二开根据需求可以写死也可以从数据库中取)

 


赞 9