首页 > 其他分享 >YonBuilder应用构建实战案例-体检管理(上)

YonBuilder应用构建实战案例-体检管理(上)

时间:2023-11-21 15:05:08浏览次数:27  
标签:实战 let kit examination 套餐 YonBuilder 体检 data

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

一.业务流程

YonBuilder应用构建实战案例-体检管理(上)_应用构建

二.功能概述

YonBuilder应用构建实战案例-体检管理(上)_应用构建_02

三. 使用能力介绍

YonBuilder应用构建实战案例-体检管理(上)_应用构建_03

四.实操教程

(一).体检套餐

1.业务对象

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

1.1 体检套餐

YonBuilder应用构建实战案例-体检管理(上)_应用构建_04

1.2 体检项目

YonBuilder应用构建实战案例-体检管理(上)_应用构建_05

1.3 检查耗用品

YonBuilder应用构建实战案例-体检管理(上)_应用构建_06

1.4 业务对象创建结果

YonBuilder应用构建实战案例-体检管理(上)_应用构建_07

2. 页面建模

1、创建主子孙页面

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

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

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

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

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

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

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

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

3.实现效果

YonBuilder应用构建实战案例-体检管理(上)_应用构建_08

YonBuilder应用构建实战案例-体检管理(上)_应用构建_09

(二).体检预约

1.业务对象

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

1.1 体检预约

YonBuilder应用构建实战案例-体检管理(上)_应用构建_10

1.2 检测项目

YonBuilder应用构建实战案例-体检管理(上)_应用构建_11

1.3 业务对象创建结果

YonBuilder应用构建实战案例-体检管理(上)_应用构建_12

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&¤tRow.examination_kit!=null&¤tRow.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});

增加日志业务对象用于记录异常日志

YonBuilder应用构建实战案例-体检管理(上)_应用构建_13

创建日志记录后端脚本

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授权添加接口授权

YonBuilder应用构建实战案例-体检管理(上)_应用构建_14

这篇文章就先介绍到这里,下篇将继续讲解体检管理实操案例。

标签:实战,let,kit,examination,套餐,YonBuilder,体检,data
From: https://blog.51cto.com/u_16344526/8502084

相关文章

  • YonBuilder应用构建实战案例-体检管理(下)
    紧接着上篇文章,我们将继续讲解体检管理案例操作。体检单一、业务对象创建体检单业务对象,以下是业务对象下的实体为主子孙结构1.体检单2.体检项目_体检单子表二、页面建模1、根据业务对象创建一主多子结构单据命名为体检单2、设置主表字段不允许修改组织、客户、累计出库年月、单据......
  • 2023版 STM32实战3 按键外部中断(电路与代码都讲解)
    常规电路(带上拉电阻)阻值可选3.3/4.7/5.1/10单位K  偷懒电路利用GPIO内部的上拉模式 代码(直接拷贝使用)这是一个外部中断控制变量a增加减少的demo为了新手方便我直接都写在了main.c文件 #include"stm32f10x.h"u8keyflag=0;u8a=0;voidKEY_Init(void){......
  • 决策树C4.5算法的技术深度剖析、实战解读
    在本篇深入探讨的文章中,我们全面分析了C4.5决策树算法,包括其核心原理、实现流程、实战案例,以及与其他流行决策树算法(如ID3、CART和RandomForests)的比较。文章不仅涵盖了丰富的理论细节和实际应用,还提出了独特的洞见,旨在帮助读者全面了解C4.5算法的优缺点和应用场景。关注Tech......
  • FlutterApp实战·第01天:Flutter安装和配置
    Flutter安装文档:官方文档:https://docs.flutter.dev/get-started/install中文文档:https://flutter.cn/docs/get-started/installDart升级Dart安装参考前面文章(Dart安装和初体验):https://ntopic.cn/p/2023092301后续学习我们采用最新Flutter版本,因此建议升级Dart最新版本(当前......
  • 探索人工智能的世界:构建智能问答系统之实战篇
    引言前面我们已经做好了必要的准备工作,包括对相关知识点的了解以及环境的安装。今天我们将重点关注代码方面的内容。如果你已经具备了Java编程基础,那么理解Python语法应该不会成为问题,毕竟只是语法的差异而已。随着时间的推移,你自然会逐渐熟悉和掌握这门语言。现在让我们开始吧!环......
  • 2023版 STM32实战1 LED灯驱动(电路与代码都讲解)
    电路图常规画法(带限流电阻计算公式)设LED电流为20mA(统一单位为0.02A)电压为3.3V限流电阻=(电源电压-负载正向工作电压)/工作电流限流电阻=(5V-3.3V)/0.02mA=1.7/V0.02A=85R省事画法(直接用IO输出)代码(直接拷贝使用)找对引脚!!!这是一个LED闪烁的demo为了新手方便我直接都写在了main.c......
  • Angular 应用实现 Lazy Load(懒加载)的项目实战经验分享
    笔者之前两篇掘金社区文章,分别介绍了企业级Angular应用开启PWA特性和服务器端渲染,从而提升用户体验的两种设计思路:Angular应用支持PWA(ProgressiveWebApplication)特性的开发步骤分享基于AngularUniversal引擎进行服务器端渲染的前端应用StateTransfer故障排查......
  • Angular 应用的搜索引擎优化(SEO)实战指南
    笔者之前在掘金社区发表了两篇关于Angular开发的文章,分别介绍了Angular支持服务器端渲染和PWA的技术细节:基于AngularUniversal引擎进行服务器端渲染的前端应用StateTransfer故障排查案例Angular应用支持PWA(ProgressiveWebApplication)特性的开发步骤分享本......
  • 2023版 STM32实战1 LED灯驱动(电路与代码都讲解)
    电路图常规画法(带限流电阻计算公式) 设LED电流为20mA(统一单位为0.02A)电压为3.3V限流电阻=(电源电压-负载正向工作电压)/工作电流限流电阻=(5V-3.3V)/0.02mA=1.7/V0.02A=85R省事画法(直接用IO输出)  代码(直接拷贝使用)找对引脚!!!这是一个LED闪烁的demo为了新手方便我......
  • Dapper NetCore 分区实战
    在上一篇中介绍了基于Dapper的NetCore分表,本篇旨在介绍基于Dapper的NetCore分区,废话不多说开搞吧!模拟业务场景:基于公司所在地区对表建立分区设计公司表结构,其中TableAttribute标识表名,PartitionAttribute标识当前表是分区结构,Property代表按照某个属性分区publicabstractc......