YonBuilder平台为开发者提供无代码和低代码的可视化开发能力,并结合开发资产复用,实现快速、简单 的应用构建。体检管理是应用构建的典型案例之一,接下来将用两篇文章来讲述此案例。

一.业务流程

在这里插入图片描述

二.功能概述

在这里插入图片描述

三. 使用能力介绍

在这里插入图片描述

四.实操教程

(一).体检套餐

1.业务对象

创建体检套餐业务对象,以下是业务对象下的实体为主子孙结构。

1.1 体检套餐

在这里插入图片描述

1.2 体检项目

在这里插入图片描述

1.3 检查耗用品

在这里插入图片描述

1.4 业务对象创建结果

在这里插入图片描述

2. 页面建模

1、创建主子孙页面

2、主表原价配置sum公式,实现子表原价合计

3、主表套餐价格配置sum公式,实现子表套餐价格合计

4、主表折扣配置公式,套餐价格/原价

5、设置主表折扣、套餐价格、原价不允许修改

6、子表体检项目配置参照带入,将体检项目的name字段带入项目名

7、子表体检项目配置参照过滤,只显示物料分类为体检项目的数据

8、设置子表体检项目、项目名、套餐价格、原价 必填

9、孙表物料配置参照带入,将参照的计量单位带入当前页面的计量单位,并配置参照过滤,只显示物料分类为体检耗用的数据。

3.实现效果

在这里插入图片描述
在这里插入图片描述

(二).体检预约

1.业务对象

创建体检预约业务对象,以下是业务对象下的实体为主子结构。

1.1 体检预约

在这里插入图片描述

1.2 检测项目

在这里插入图片描述

1.3 业务对象创建结果

在这里插入图片描述

2. 页面建模

(1)、 根据创建的业务对象创建一主多子页面,命名为体检预约

(2)、 设置必填项

体检中心、客户分类、手机号、姓名、身份证号、预约时间

(3)、 配置公式
身份证号带出年龄和性别

年龄公式:strToNum(dateFormat(sysdate(),"yyyy"))-strToNum(substring(identity,32,35))

性别公式: iif(contains("013579",substring(identity,42,42)),"1","2")

(4)、设置默认值
是否创建客户为否

(5)、设置主表字段不允许修改
价格、是否创建客户、客户

(6)、配置价格公式

        主表价格等于子表使用价格合计:          sum(pre_projectList,"pre_projectList.useprice")

(7)、设置所有子表字段不允许修改
体检项目、物料、所属套餐、原价、套餐价格、是否套餐、使用金额

(8)、增加预约日期函数校验,预约日期大于当前日期


//比较日期
const isBeforeDate = (dateA, dateB) => dateA < dateB;
//获取当前的年月日
const yyMMdd = ()=>{
  let date = new Date(); //获取当前日期
  let year = date.getFullYear();  //获取当前年
  let month = date.getMonth() + 1;  //获取当前月
  month = month.toString().length==1?"0"+month:month;//补0
  let strDate = date.getDate(); //获取当前日
  strDate = strDate.toString().length==1?"0"+strDate:strDate;//补0
  return year+"-"+month+"-"+strDate;
}
//体检日期校验
viewModel.get('date') && viewModel.get('date').on('beforeValueChange', function (data) {
  let date = yyMMdd();
  return data.value!=null?isBeforeDate(date, data.value):true;
});

(9)、增加交互,主表选择套餐后带出体检项目至子表

  增加API脚本根据体检套餐查询体检项目   

let AbstractAPIHandler = require('AbstractAPIHandler');
  class MyAPIHandler extends AbstractAPIHandler {
   execute(request){
    //循环请求参数取出套餐id
    let kitIds = "";
    request.data.forEach((kit)=>{
      let kitId
      if(kit.id!=undefined){
        kitId = "'"+kit.id+"',";
      }else{
        kitId = "'"+kit.examination_kit+"',";
      }
      kitIds+=kitId;
    })
    kitIds = "("+substring(kitIds, 0, kitIds.length-1)+")";
    let sql = "select id as project,name as project_name,price,price as useprice,des,original_price,examination_kit_id as examination_kit, examination_kit_id.name as examination_kit_name, "+
              " product as product_standard,product.name as product_standard_name"+
              " from AT1772AFF21C18000A.AT1772AFF21C18000A.project where examination_kit_id in "
              + kitIds +"order by examination_kit_id";
    var res = ObjectStore.queryByYonQL(sql);
   return {res};
 }
}
exports({"entryPoint":MyAPIHandler});

增加前端交互,选择套餐后事件发起调用API脚本请求并渲染页面


//选择套餐后自动带出体检项目
viewModel.get("pay_examination_kitList").on("afterValueChange",function(data){
  //获取当前的表格模型
  let gridModel = viewModel.get("pre_projectList");
  //清楚子表是否套餐为是的行,后续再进行新增
  clearKitRow();
  //判断只有一个套餐还是删除的情况下对套餐字段进行清空
  if(data!=null&&data!=undefined&&data.valueState!=undefined&&data.valueState.length==1&&data.valueState[0]=="Delete"){
    viewModel.get("pay_examination_kitList").clear();
    return true;
  }
  //重新对套餐字段进行赋值操作
  viewModel.get("pay_examination_kitList").clear();
    let kits = [];
    data.value.forEach((kit,index)=>{
      //如果没有这两个属性,说明需要重新拼值
      if(!(kit.hasOwnProperty("examination_kit")&&kit.hasOwnProperty("pay_examination_kitList"))){
        kit.examination_kit = kit.id;
        kit.pay_examination_kitList = kit.name;
      }
      if(data.valueState!=undefined&&data.valueState[index]!=undefined&&data.valueState[index]!="Delete"){
        kits.push(kit);
      }
      if(data.valueState==undefined){
        kits.push(kit);
      }
  })
  viewModel.get("pay_examination_kitList").setData(kits);
  //如果套餐字段还有数据则调用接口获取项目后渲染页面
  if(data!=null&&data!=undefined&&data.value.length>0){
    let result = cb.rest.invokeFunction("AT1772AFF21C18000A.api.getProInfoById", {data:kits},
            function(err, res) {
              if(err!=undefined||err!=null){
                cb.utils.alert("获取套餐异常");
                return false;
              }
            },viewModel, {async:false});
    result.result.res.forEach((project)=>{
      project.is_kit=1;
      gridModel.appendRow(project);//插入行
    })
  }

})
//清楚所有套餐行
const clearKitRow = ()=>{
  let gridModel = viewModel.get("pre_projectList");
  let rows = gridModel.getRows();//获取表格所有的行
  let deleteRowIndexes = [];
  rows.forEach((row,index)=>{
    if(row.is_kit=="1"){
      deleteRowIndexes.push(index);
    }
  })
  gridModel.deleteRows(deleteRowIndexes);
}

(10)、增加交互,选择子表行,点击删行按钮删除子表数据,不符合套餐的情况跟新主表套餐


// 删行--单击
viewModel.get('btnBatchDeleteRowpre_project') && viewModel.get('btnBatchDeleteRowpre_project').on('click', function (data) {
  var belongKitId = [];
  var belongKitMap = [];
  var gridModel = viewModel.get("pre_projectList");
  var selectedRowIndexes = gridModel.getSelectedRowIndexes();//获取选中的行号
  if(selectedRowIndexes.length>0){
    //获取删除行所属套餐
    selectedRowIndexes.forEach((row)=>{
      let currentRow = gridModel.getRow(row);//获取指定行数据
      if(currentRow.examination_kit!=undefined&&currentRow.examination_kit!=null&&currentRow.is_kit=="1"){
        belongKitId.push(currentRow.examination_kit);
        belongKitMap[currentRow.examination_kit]=currentRow.is_kit;
      }
    })
  }else{
    cb.utils.alert("请选择数据");
    return false;
  }
  cb.utils.confirm("删除后不满足套餐的情况体检项将按照原价计算",function(){
    //先删除选中行
    gridModel.deleteRows(selectedRowIndexes);
    //获取表格信息,根据当前删除行的所属套餐改变是否套餐为否;
    gridModel.getRows().forEach((row,rowIndex)=>{
      if(belongKitMap.hasOwnProperty(row.examination_kit)){
        gridModel.setCellValue(rowIndex, "is_kit", "2",true);
      }
    })
    //删除主表字段中的套餐,
    var kits = viewModel.get("pay_examination_kitList").getValue();
    var newKit = [];
    kits.forEach((kit,index)=>{
      if(!(belongKitMap.hasOwnProperty(kit.examination_kit)&&belongKitMap[kit.examination_kit]=="1")){
        newKit.push(kit);
      }
    })
    viewModel.get("pay_examination_kitList").clear();
    if(newKit.length>0){
        //重新赋值
        viewModel.get("pay_examination_kitList").setData(newKit);  
    }
  })
});

增加后端脚本配置文件

在这里插入代码片
let AbstractTrigger = require('AbstractTrigger');
  class MyTrigger extends AbstractTrigger {
    execute(context,param){
      let data = {
        "appcode":"AT1772AFF21C18000A",
        "apiurl":{
            "customer":"https://dbox.yonyoucloud.com/iuap-api-gateway/yonbip/digitalModel/merchant/save",
            "apilog":"https://dbox.yonyoucloud.com/iuap-api-gateway/rybentc5/testapifun01/testapifun01p/apilog",
            "othoutrecord":"https://dbox.yonyoucloud.com/iuap-api-gateway/yonbip/scm/othoutrecord/single/save"
        }
      }
      let apiurl
      if(context==null){
        apiurl = data["apiurl"];
      }else{
        apiurl = data["apiurl"][context];
      }
      return {"appcode":data.appcode,"apiurl":apiurl};
    }
  }
  exports({"entryPoint":MyTrigger});

增加日志业务对象用于记录异常日志
在这里插入图片描述

创建日志记录后端脚本


let AbstractAPIHandler = require('AbstractAPIHandler');
  class MyAPIHandler extends AbstractAPIHandler {
   execute(request){
    var error = {reqparams:request.body,response:request.apiResponse,action:request.apiAction,billnum:request.billnum,excute_date:request.createTime};
    ObjectStore.insert("AT1772AFF21C18000A.AT1772AFF21C18000A.errlog",error,"errlog");
   return {};
 }
}
exports({"entryPoint":MyAPIHandler});

将日子脚本发布为开放平台接口
集成配置API授权添加接口授权
在这里插入图片描述
这篇文章就先介绍到这里,下篇将继续讲解体检管理实操案例。


想养狗_想养猫
1 声望0 粉丝