# 业务扩展开发

二次开发灵活可配

百序支持线上业务扩展开发,开发后可实时生效,无需部署。

# 在线开发

百序后端可支持在线开发,通过配置拦截器,并编写在线代码的形式实现

  • 菜单路径-【模型管理】-【对象管理】

# 配置拦截器

  • 找到之前创建的元对象:t_bs_offer
  • 点击‘编辑’按钮
  • 配置“业务拦截器”为:com.baixu.onmeta.TbsOfferTriggerEx
  • 点击‘确定’按钮保存

image-20230318162233406

image-20230318162301031

# 在线代码

在线代码可通过拦截器形式,针对需要处理的业务进行拦截处理。

示例代码说明:

针对t_bs_offer表单的数据,在新增时通过addBefore方法,和修改时通过updateBefore方法,会对数据进行模拟业务逻辑处理,业务逻辑为:报销金额必须大于等于100元。

其中changeProofToOne方法,是文档中【在线按钮】章节会涉及到的方法,方法会将数据的报销凭证改为“纸质发票”。

  • 点击‘在线开发’开发按钮,进入界面

  • 将以下的示例代码粘贴

  • 点击‘验证’按钮

  • 点击‘保存’按钮

  • 示例代码如下:

 package com.baixu.onmeta;
 
 import java.math.BigDecimal;
 import com.baixu.base.aop.BaixuAop;
 import com.baixu.base.util.BxUtil;
 import com.baixu.base.aop.MetaTrigger;
 import com.baixu.db.base.Bx;
 import com.jfinal.plugin.activerecord.*;
 import cn.hutool.core.util.*;
 import com.baixu.db.json.Json;
 import java.util.*;
 import com.baixu.base.dto.Res;
 
 /**
  * 报销申请单(t_bs_offer)测试业务开发
  */
 public class TbsOfferTriggerEx extends MetaTrigger {
 
     /**
      * 新增前处理
      * 报销金额必须大于等于100元
      */
     @Override
     public String addBefore(BaixuAop ac) throws Exception {
         // 如果父类处理失败,直接返回
         String res = super.updateBefore(ac);
         if (!StrUtil.isBlank(res)) {
             return res;
         }
 
         String check = check(ac.record);
         if(StrUtil.isNotBlank(check)) {
 
             return check;
         }
 
         //如果没有任何意外,返回空值
         return "";
     }
 
     /**
      * 更新前处理
      * 报销金额必须大于等于100元     
      */
     @Override
     public String updateBefore(BaixuAop ac) throws Exception {
         // 如果父类处理失败,直接返回
         String res = super.updateBefore(ac);
         if (!StrUtil.isBlank(res)) {
             return res;
         }
 
         String check = check(ac.record);
         if(StrUtil.isNotBlank(check)) {
 
             return check;
         }
 
         //如果没有任何意外,返回空值
         return "";
     }
 
 
     /**
      * 在线按钮时,调用方法
      * 将报销凭证改为纸质发票
      */
     public void changeProofToOne(BaixuAop ac, Map<String, Object> req) throws Exception {
 
 
         Integer id = Integer.valueOf(req.get("id").toString());
 
         String sql = "update t_bs_offer set proof = ? where id = ?";
         Bx.update(sql,"1",id);
         ac.res = Res.success("已改为纸质发票");
     }
 
     //测试业务在线开发-校验
     private String check(Record form){
 
         BigDecimal value = form.getBigDecimal("value");
         if(value.compareTo(new BigDecimal(100)) < 0) {
 
             return "报销金额必须大于等于100元。";
         }
         return "";
     }
 
 }

image-20230318162401799

image-20230318163343318

image-20230318163358115

# 验证

  • 点击系统右上角用户名称左侧的“应用“图标,切换到业务视图
  • 菜单路径-【财务信息】-【报销信息】
  • 点击‘新增’或‘编辑’按钮
  • 输入如下信息后,发现当报销金额小于100时,业务逻辑会进行拦截
  • 当报销金额大于等于100时,业务逻辑则会通过
  • 验证通过

image-20230308113514175

image-20230318163841840

image-20230318164111026

# 在线按钮

菜单中可以创建一个自定义按钮,接着编写脚本,可以通过按钮进行业务修改等操作,无需部署,即使生效。

  • 菜单路径-【系统配置】-【菜单管理】

# 添加按钮

  • 找到我们之前创建的菜单-【财务信息】-【报销信息】
  • 在其右侧点击‘新增’按钮
  • 输入如下信息后点击‘确定’按钮
  • 此时菜单中会出现我们创建的“改为纸质发票”按钮

image-20230318164241747

image-20230318164345992

# 在线脚本

在线脚本,会调用我们之前在后端在线代码中,所创建的changeProofToOne方法,该方法会将数据的报销凭证改为“纸质发票”。

  • 点击‘业务开发’开发按钮,进入界面
  • 将以下的示例代码粘贴
  • 点击‘保存’按钮
  • 示例代码如下:

image-20230318164426191

image-20230318164757516

# 验证

  • 点击系统右上角用户名称左侧的“应用“图标,切换到业务视图
  • 菜单路径-【财务信息】-【报销信息】
  • 会出现我们刚才创建的【改为纸质发票】按钮
  • 此时选中刚才我们创建的记录
  • 点击‘改为纸质发票’按钮
  • 会发现所选数据的“报销凭证”已经变为了“纸质发票”
  • 验证通过

image-20230308113514175

image-20230318192832423

image-20230318192806836