TreeviewCopyright © aleen42 all right reserved, powered by aleen42

体检单

一、业务对象

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

1.1、体检单

操作 描述
名称 体检单
编码 examination_bill
父实体
引用接口 审批 业务流 主组织
属性 编码 名称 类型 引用
merchant 客户 单选引用 aa.merchant.Merchant
suggest 体检结论 大文本
doctor 责任医师 单选引用 bd.staff.StaffNew
yearmonth 累计出库年月 文本

1.2、体检项目_体检单子表

操作 描述
名称 体检项目_体检单子表
编码 examination_project
父实体 体检单
引用接口 业务流
属性 编码 名称 类型 引用
project 体检项目 单选引用 体检项目
num 二维码编号 文本
is_examination 是否检测 单选 自建枚举,1:是,2:否
result 检测结果 大文本
psn 检测人 单选引用 bd.staff.StaffNew
product_standard 物料 单选引用 pc.product.Product
price 金额 数值
yearmonth 使用月份 文本

二、页面建模

  • 1、根据业务对象创建一主多子结构单据命名为体检单

  • 2、设置主表字段不允许修改

组织、客户、累计出库年月、单据状态

  • 3、设置子表所有字段不允许修改

体检项目、物料、二维码编号、是否检测、检测结果、检测人

  • 4、删除子表的新增、删行按钮

  • 5、设置子表表格的编辑方式为侧滑弹框

  • 6、 体检单列表页面删除新增按钮

  • 7 、配置体检按审批流

  • 8、配置业务流

  • 9、体检预约下推体检单

防止重复下推: isNull(getValue("AT1772AFF21C18000A.AT1772AFF21C18000A.examination_bill","id","source_id",id))

错误提示语:下游数据已存在

触发设置:手工触发

生单方式:默认新增单据

转换规则配置如下图

  • 10、体检单下推销售订单

目标交易类型:体检

过滤设置增加防止重复下推:isNull(getValue("voucher.order.Order","id","srcBill",id))&&verifystate==2

错误提示语:下游单据已存在或单据未审核

触发设置:手工触发

生单默认: 默认新增单据,勾选转单画面

转换规则配置如下图:

使用到的公式:

税目税率id : getValue("bd.taxrate.TaxRateVO","id","code","VAT0")

本币pk :getValue("bd.currencytenant.CurrencyTenantVO","id","code","CNY")

汇率类型id: getValue("bd.exchangeRate.ExchangeRateTypeVO","id","code","01")

单据日期: dateFormat(sysdate(),"yyyy-MM-dd")

  • 11、体检单列表页面增加月底汇总出库按钮,点击汇总消耗品生成其他出库单

1)、创建业务对象月底汇总

操作 描述
名称 月底汇总
编码 monthtotal
父实体
引用接口
属性 编码 名称 类型 引用
org 组织 单选引用 org.func.BaseOrg
warehouse 仓库 单选引用 aa.warehouse.Warehouse
date 汇总月份 文本
use_version 版本 文本

2)、根据业务对象创建一个卡片页面,删除列表页面

3)、将卡片页面设置为模态框,具体操作省略

4)、保存按钮取消保存规则,然后增加保存函数

函数中调用了其他出库单接口,具体调用接口API脚本查看5


 viewModel.get('btnSave') && viewModel.get('btnSave').on('click', function (data) {
  // 确定--单击
  let date = viewModel.get("date").getValue();
  let org = viewModel.get("org").getValue();
  let warehouse = viewModel.get("warehouse").getValue();
  let use_version = viewModel.get("use_version").getValue();
  cb.rest.invokeFunction("AT1772AFF21C18000A.api.monthUsePro", {"date":date,"org":org,"warehouse":warehouse,"use_version":use_version},
  function(err, res) {
    if(err!=null){
      cb.utils.alert(err);
      return ;
    }else{
      cb.utils.alert("发起请求成功,请到其他出库节点查看");
      viewModel.communication({type:'modal',payload:{data:false}});
    }
  })
});

5)、调用出库单API脚本

获取日期函数


let AbstractTrigger = require('AbstractTrigger');
  class MyTrigger extends AbstractTrigger {
    execute(context,param){
      Date.prototype.format = function(fmt)
      { 
      var o = {
      "M+" : this.getMonth()+1, //月份
      "d+" : this.getDate(), //日
      "h+" : this.getHours()%12 == 0 ? 12 : this.getHours()%12, //小时
      "H+" : this.getHours(), //小时
      "m+" : this.getMinutes(), //分
      "s+" : this.getSeconds(), //秒
      "q+" : Math.floor((this.getMonth()+3)/3), //季度
      "S" : this.getMilliseconds() //毫秒
      };
    if(/(y+)/.test(fmt))
    fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
    for(var k in o)
    if(new RegExp("("+ k +")").test(fmt))
      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
    return fmt;
    } 
    let date = new Date().format(context);
    return {date};
    }
  }
  exports({"entryPoint":MyTrigger});

汇总统计耗材


let AbstractAPIHandler = require('AbstractAPIHandler');
  class MyAPIHandler extends AbstractAPIHandler {
   execute(request){
      let date = request.date; //获取日期
      let org = request.org;//组织
      let warehouse = request.warehouse; //仓库
      let use_version = request.use_version //版本
      // 因为两张表没有直接的关联关系,所以不能联查
      let sql = "select project as projectId,count(id) as num from AT1772AFF21C18000A.AT1772AFF21C18000A.examination_project "+
                " where yearmonth = '"+date+"' group by project";
      let projectNum = ObjectStore.queryByYonQL(sql);
      if(projectNum.length==0){
        throw new Error("为查找到数据");
      }
      //筛选出体检项
      var sqlConditionParamsStr = "";
      var projectMap = {}; //存储每个耗材使用了几份
      projectNum.forEach((project)=>{
        let kitId = "'"+project.projectId+"',";
        sqlConditionParamsStr+=kitId;
        projectMap[project.projectId]=project.num;
      })
      sqlConditionParamsStr = "("+substring(sqlConditionParamsStr, 0, sqlConditionParamsStr.length-1)+")";
      //根据查询条件查出耗材
      let consumptionSql = "select product,unit as stockUnitId,num,project_id from AT1772AFF21C18000A.AT1772AFF21C18000A.consumption "+
                " where project_id in "+sqlConditionParamsStr;
      let consumptionData = ObjectStore.queryByYonQL(consumptionSql);
      //循环重新赋值计算,将耗材数量统计
      consumptionData.forEach((data)=>{
        let totalConsumptionNum = projectMap[data.project_id]*data.num;
        data.qty = totalConsumptionNum;
        data.subQty = totalConsumptionNum;
        data._status = "Insert";
        data.othOutRecordsDefineCharacter = {"item02":data.project_id}
      })
      //拼装请求参数
      let othoutrecordParams = {};
      othoutrecordParams["org"] = org;
      othoutrecordParams["accountOrg"] = org;
      othoutrecordParams["bustype"] = "A10001";
      othoutrecordParams["_status"] = "Insert";
      othoutrecordParams["warehouse"] = warehouse;//仓库     
      othoutrecordParams["othOutRecords"] = consumptionData;
      othoutrecordParams["resubmitCheckKey"] = MD5Encode(JSON.stringify(othoutrecordParams)+use_version);
      let othoutrecordFun = extrequire("AT1772AFF21C18000A.backend.othoutrecord");
      othoutrecordFun.execute(othoutrecordParams);
   return {};
 }
}
exports({"entryPoint":MyAPIHandler});

其他出库单保存接口



let AbstractTrigger = require('AbstractTrigger');
  class MyTrigger extends AbstractTrigger {
    execute(context,param){
      //取得日期格式
      let date = extrequire("AT1772AFF21C18000A.backend.getDate");
      let dateFormat = date.execute("yyyy-MM-dd");
      context.vouchdate = dateFormat.date; //给单据日期赋值
      //调用接口
      let apiAction = "othoutrecord";
      let configFun = extrequire("AT1772AFF21C18000A.backend.config");
      let configRes = configFun.execute(null);
      let reqType = "POST";
      let body = {"data":context};
      let 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("日志处理");
        }
      }catch(e){
        //处理日志,调用接口是避免回滚
        //取得日期格式
        let dateLog = extrequire("AT1772AFF21C18000A.backend.getDate");
        let dateFormatLog = dateLog.execute("yyyy-MM-dd HH:mm:ss");
        var error = {body:JSON.stringify(body),apiResponse:apiResponse,apiAction:apiAction,billnum:"examination_kit",createTime:dateFormatLog.date};
        openLinker(reqType, configRes.apiurl["apilog"], configRes.appcode, JSON.stringify(error));
        throw new Error("生成其他出库失败,请检查");
      }
     return {};
    }
  }
  exports({"entryPoint":MyTrigger});

体检单增加汇总耗材按钮,并增加点击事件打开创建的弹框


viewModel.get('button22rk') && viewModel.get('button22rk').on('click', function (params) {
  // 月终汇总出库--单击
  let data = {
    //TODO:填写单据类型及单据号
    billtype: 'Voucher',// 单据类型
    billno: 'monthtotal',// 单据号
    params: {
      mode: 'add',
    },
  };
  //打开一个单据,并在当前页面显示
  cb.loader.runCommandLine('bill', data, viewModel);
});
Copyright © 用友 -【生态技术部】 2022-2023 all right reserved,powered by Gitbook修订时间: 2023-04-08 18:23:21

results matching ""

    No results matching ""