TreeviewCopyright © aleen42 all right reserved, powered by aleen42
体检预约
一、业务对象
创建体检预约业务对象,以下是业务对象下的实体为主子结构
1.1、体检预约
操作 | 描述 | |||||
---|---|---|---|---|---|---|
名称 | 体检预约 | |||||
编码 | pay | |||||
父实体 | ||||||
引用接口 | 业务流 | 自动编码 | 主组织 | |||
属性 | 编码 | 名称 | 类型 | 引用 | ||
mobile | 手机号 | 文本 | ||||
name | 姓名 | 文本 | ||||
identity | 身份证号 | 证件号 | ||||
price | 价格 | 数值 | ||||
examination_kit | 体检套餐 | 多选引用 | 体检套餐 | |||
date | 预约日期 | 日期 | ||||
gender | 性别 | 单选 | 需自建枚举,1:男,2:女 | |||
age | 年龄 | 整数 | ||||
custCategory | 客户分类 | 单选引用 | aa.custcategory.CustCategory | |||
is_creater_cus | 是否创建客户 | 单选 | 需自建枚举,1:是,2:否 | |||
customer | 客户 | 单选引用 | aa.merchant.Merchant |
1.2、检测项目
操作 | 描述 | |||||
---|---|---|---|---|---|---|
名称 | 检测项目 | |||||
编码 | pre_project | |||||
父实体 | 体检预约 | |||||
引用接口 | 业务流 | |||||
属性 | 编码 | 名称 | 类型 | 引用 | ||
project | 体检项目 | 单选引用 | 体检项目 | |||
examination_kit | 所属套餐 | 单选引用 | 体检套餐 | |||
original_price | 原价 | 数值 | ||||
price | 套餐价格 | 数值 | ||||
is_kit | 是否套餐 | 单选 | 自建枚举,1:是,2:否 | |||
useprice | 使用金额 | 数值 | ||||
product_standard | 物料 | 单选引用 | pc.product.Product |
1.3、业务对象创建结果
二、页面建模
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);
}
- 9、增加交互,点击增行按钮弹出体检项目选择后带入父页面
1)、体检项目创建列表页面命名为体检项目弹框
2)、添加页面数据调整为模态框,"templateType": "modal", 并更改弹框宽度为1000
3)、增加底部栏按钮,命名为确定、取消
4)、确定按钮绑定函数
viewModel.get('button2ai') && viewModel.get('button2ai').on('click', function (data) {
// 确定--单击
let selectedRows = viewModel.getGridModel().getSelectedRows();
if(selectedRows.length==0){
cb.utils.alert("请选择数据");
return false;
}
var parentViewModel = viewModel.getCache('parentViewModel'); //模态框中获取父页面
var gridModel = parentViewModel.getGridModel();
selectedRows.forEach((row)=>{
row.is_kit="2";
row.project_name = row.name;
row.project = row.id;
row.product_standard = row.product;
row.product_standard_name = row.product_name;
gridModel.appendRow(row);
})
//关闭模态框
viewModel.communication({type:'modal',payload:{data:false}});
});
5)、取消按钮绑定动作取消
6)、回到体检预约详情页面,点击增行,添加函数
// 增行--单击,弹出模态框
viewModel.get('btnAddRowpre_project') && viewModel.get('btnAddRowpre_project').on('click', function (params) {
let data = {
billtype: 'VoucherList',// 单据类型
billno: 'examination_kit_project'// 单据号
};
//打开一个单据,并在当前页面显示
cb.loader.runCommandLine('bill', data, viewModel);
});
- 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);
}
})
});
- 11、保存按钮增加规则,新增后端脚本调用开放平台接口插入预约人信息客户档案
1)、增加后端脚本配置文件
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});
2)、增加日志业务对象用于记录异常日志
操作 | 描述 | |||||
---|---|---|---|---|---|---|
名称 | 异常日志 | |||||
编码 | errlog | |||||
父实体 | ||||||
引用接口 | ||||||
属性 | 编码 | 名称 | 类型 | 引用 | ||
reqparams | 请求参数 | 大文本 | ||||
response | 响应参数 | 大文本 | ||||
action | 动作 | 文本 | ||||
billnum | 单据 | 文本 | ||||
http_state | HTTP状态码 | 文本 | ||||
current_state | 当前状态 | 文本 | ||||
excute_date | 执行日期 | 日期 |
根据业务对象创建列表页面,用于查看日志信息
3)、创建日志记录后端脚本
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});
4)、将日子脚本发布为开放平台接口
5)、集成配置API授权添加接口授权
4)、调用客户档案接口
let AbstractTrigger = require('AbstractTrigger');
class MyTrigger extends AbstractTrigger {
execute(context,param){
//现在只处理新增客户的情况,还有更新客户的情况暂不考虑
let reqParams = param.data[0];
//如果已经生成客户直接返回
if(reqParams.is_creater_cus=="1")return;
//如果是更新操作拦截直接返回
let pageRequestData = JSON.parse(param.requestData);
if(pageRequestData["_status"]==null||pageRequestData["_status"]=="Update")return ;
//默认的客户保存JSON传参
let body = {"data":{"name":{"zh_CN":"vvvvb345567678999"},"createOrg":"2257324212162816","customerClass":"2264313873323776","_status":"Insert","retailInvestors":false,"enterpriseNature":"0","businessRole":"1","taxPayingCategories":0,"enable":"1","merchantApplyRanges":[{"hasDefaultInit":true,"isApplied":true,"rangeType":1,"_status":"Insert","isCreator":true,"orgId":"2257324212162816"}],"merchantAppliedDetail":{"payway":99},"merchantRole":{"cardType":"0","businessRole":"1","toBImmigrationMode":"0","settlementMethod":"0","_status":"Insert"},"isApplied":true,"autoGenerateRangeData_":true,"isCreator":true}};
//替换字段值
body.data.code = new Date().getTime()+S4();
body.data.name.zh_CN = reqParams.name;
body.data.createOrg = reqParams.org_id;
body.data.merchantApplyRanges[0].orgId = reqParams.org_id;
body.data.customerClass = reqParams.custCategory;
//获取接口请求地址信息
let apiAction = "customer";
let configFun = extrequire("AT1772AFF21C18000A.backend.config");
let configRes = configFun.execute(null);
let reqType = "POST";
var apiResponse = "";
try{
apiResponse = openLinker(reqType, configRes.apiurl[apiAction], configRes.appcode, JSON.stringify(body));
let apiResponseData = JSON.parse(apiResponse);
if(apiResponseData.code!=200){
throw new Error("日志处理");
}else{
//更新是否创建用户为是
var updateIsCreater = {id:reqParams.id,is_creater_cus:"1",customer:apiResponseData.data.id};
ObjectStore.updateById("AT1772AFF21C18000A.AT1772AFF21C18000A.pay",updateIsCreater,"pay");
}
}catch(e){
//处理日志,调用接口是避免回滚
var error = {body:JSON.stringify(body),apiResponse:apiResponse,apiAction:apiAction,billnum:"examination_kit",createTime:reqParams.createTime};
openLinker(reqType, configRes.apiurl["apilog"], configRes.appcode, JSON.stringify(error));
throw new Error("生成客户失败,请检查");
}
return {};
}
}
exports({"entryPoint":MyTrigger});