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&¤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});
增加日志业务对象用于记录异常日志
创建日志记录后端脚本
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授权添加接口授权
这篇文章就先介绍到这里,下篇将继续讲解体检管理实操案例。