体检单
一、业务对象
创建体检单业务对象,以下是业务对象下的实体为主子孙结构
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);
});