体检预约

一、业务对象

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

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&&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);  
    }
  })
});
  • 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});
Copyright © 用友 -【生态技术部】 2022-2023 all right reserved,powered by Gitbook修订时间: 2023-10-07 15:51:00

results matching ""

    No results matching ""