# 低代码使用说明、经典案例及常见异常
# 七巧低代码低代码平台可使用低代码的地方及使用说明
# 1.流程:
# 连线判断脚本模式
流程节点连线判断,通过脚本可实现各种形式的校验来判断当前流程可否流转(该低代码需返回‘false’或'true',false表示不可流转,true表示可流转)
(function(){
var doc = $.context.getCurrentDocument();
var count = doc.getElementByName("数量").getIntValue();
return count<1000;
})()
# 人工任务路由脚本模式
流程人工任务审批人路由脚本模式指定审批人,获取表单人员单选控件对应用户作为节点审批人(该低代码需返回User对象或List
(function(){
//获取当前文档
var doc = $.context.getCurrentDocument();
//获取用户id
var userId = doc.getElementByName("项目队长").getValue();
//调用通讯录接口,通过userId获取对应User对象,并返回
return $.contact.getUserById(userId);
})()
# 系统任务
系统任务可执行用户自定义的任意行为,代码示例表示流程流转至该系统任务时发送站内信给用户(该低代码不需返回值)
(function(){
//获取当前文档
var doc = $.context.getCurrentDocument();
//获取用户id
var userId = doc.getElementByName("项目队长").getValue();
//自定义消息内容
var subject = "消息标题";
var context = "消息内容";
//发送七巧低代码站内信
$.message.sendGeneralStationMessage(subject,context,userId);
})()
# 按钮执行前后事件
流程按钮(办理,驳回,终止)提供执行前后事件,选择脚本模式时,用户可自定义行为;代码示例表示按钮执行前,修改表单值
(function(){
var doc = $.context.getCurrentDocument();
doc.addElement("姓名","steven");
doc.addElement("手机号码","138****0000");
})()
# 2.业务建模:
# 按钮执行前后事件
与流程按钮执行前后事件类似
(function(){
var doc = $.context.getCurrentDocument();
doc.addElement("姓名","steven");
doc.addElement("手机号码","138****0000");
})()
# 消息通知事件指定接收用户
触发事件消息通知事件,可通过低代码指定消息接收用户,该低代码需返回用户对象或用户集合对象(User/List
(function(){
//获取当前用户id
var userId = $.context.getCurrentUserId();
//调用通讯录接口,通过userId获取对应User对象,并返回
return $.contact.getUserById(userId);
})()
# 自定义按钮
与流程系统任务类似,无需返回值
(function(){
//获取当前文档
var doc = $.context.getCurrentDocument();
//获取用户id
var userId = doc.getElementByName("项目队长").getValue();
//自定义消息内容
var subject = "消息标题";
var context = "消息内容";
//发送七巧低代码站内信
$.message.sendGeneralStationMessage(subject,context,userId);
})()
# 自定义页面
自定义页面相关内容请查看“自定义页面使用指南”
# 经典案例
# 1. 生成入库单
# 需求场景和注意点:
添加采购订单后,需要对订单进行入库的操作。 目前入库的方式是选择采购订单,填写入库明细是需要手动选择采购明细,比较麻烦。所以需要用低代码,在采购单列表的操作栏增加一个添加按钮,按钮绑定采购入库表,点击按钮,自动获取这行采购单的数据,通过低代码把数据写进入库表相应的字段中,包括采购编号、供应商、入库明细等
# 代码示例:
(function(){
var appId= $.context.getCurrentApplicationId();
var originalDocument = $.context.getHttpRequest().getAttribute("document");
var purchaseNumber = originalDocument.getElementByName("采购编号").getValue();
var supplier = originalDocument.getElementByName("供应商名称").getValue();
var storageDoc = $.context.getCurrentDocument();
storageDoc.addElement("采购编号",originalDocument.getId());
storageDoc.addElement("供应商名称",supplier);
var storageDetailDocs = new Packages.java.util.ArrayList();
var subOriginalDocuments = $.form.getSubFormDocumentsByName(originalDocument.getId(),"采购编号","采购明细",appId);
for(var index=0;index<subOriginalDocuments.size();index++){
var subOriginalDocument = subOriginalDocuments.get(index);
var name = subOriginalDocument.getElementByName("产品名称").getValue();
var number = subOriginalDocument.getElementByName("采购编号").getValue();
var price = subOriginalDocument.getElementByName("采购单价").getValue();
var nonStorageNumber = subOriginalDocument.getElementByName("待入库数量").getValue();
var storageNumber = subOriginalDocument.getElementByName("采购数量").getValue();
var storageDetailDoc = $.form.createEmptyDocument(appId,"入库明细");
storageDetailDoc.addElement("产品名称",subOriginalDocument.getId());
storageDetailDoc.addElement("入库编号",storageDoc.getId());
storageDetailDoc.addElement("采购单价",price);
storageDetailDoc.addElement("待入库数量",nonStorageNumber);
storageDetailDoc.addElement("入库数量",nonStorageNumber);
storageDetailDocs.add(storageDetailDoc);
}
storageDoc.addElement("入库明细",storageDetailDocs);
})()
# 2. 添加子表数据时,获取主表ID填入子表外键
# 需求场景和注意点:
客户与跟进记录,在客户列表中添加一个【添加跟进】按钮,然后绑定跟进记录表单,希望添加的跟进记录自动关联到客户信息,可在添加按钮的执行后写入此代码
# 代码示例:
(function(){
var appId= $.context.getCurrentApplicationId();
var originalDocument = $.context.getHttpRequest().getAttribute("document");
var name = originalDocument.getElementByName("客户名称").getValue();
var storageDoc = $.context.getCurrentDocument();
storageDoc.addElement("所属客户",originalDocument.getId());
})()
# 3. 业务建模,表单提交时校验
# 需求场景和注意点:
添加报销单,获取报销总金额,小于100则不允许提交并提示“金额小于100,不允许提交;请累积金额达到100再提交”
# 代码示例:
(function(){
//获取提交表单
var doc = $.context.getCurrentDocument();
//获取总金额控件值
var count = doc.getElementByName("总金额").getIntValue();
if(count<100){
//创建校验消息对象
var message = $.validate.create();
message.addError("金额小于100,不允许提交;请累积金额达到100再提交");
return message;
}
})()
# 4. 获取表单各类型控件值
# 需求场景和注意点:
获取表单各类型控件值及返回数据类型说明(单行文本,数字控件,人员单选,人员多选,部门单选,部门多选,子表单)
# 代码示例:
(function(){
//获取当前文档
var doc = $.context.getCurrentDocument();
//获取单行文本控件值(返回类型:String)
var text = doc.getElementByName("姓名").getValue();
//获取数据控件控件值(返回类型:int)
var age = doc.getElementByName("年龄").getIntValue();
//获取子表单控件值(返回类型:List<Document>)
var subDocuments = doc.getElementByName("成绩单").getSubDocuments();
//获取人员单选控件值(返回类型:String)
var userId = doc.getElementByName("班主任").getValue();
//获取人员多选控件值(返回类型:JSONArray)
var userIds = doc.getElementByName("任课老师").getValue();
//获取部门单选控件值(返回类型:String)
var deptId = doc.getElementByName("部门单选").getValue();
//获取部门多选控件值(返回类型:JSONArray)
var deptIds = doc.getElementByName("部门多选").getValue();
})()
# 5. 发送站内信通知指定用户
# 需求场景和注意点:
提交项目申请表,并发消息通知【项目队长】人员单选控件指定用户
# 代码示例:
(function(){
//获取当前文档
var doc = $.context.getCurrentDocument();
//获取用户id
var userId = doc.getElementByName("项目队长").getValue();
//自定义消息内容
var subject = "消息标题";
var context = "消息内容";
//发送七巧低代码站内信
$.message.sendGeneralStationMessage(subject,context,userId);
})()
# 6. 创建空表单,复制,并保存表单
# 需求场景和注意点:
新建学生表,给姓名控件及年龄控件赋值,保存
# 代码示例:
(function(){
var appId =$.context.getCurrentApplicationId();
var doc = $.form.createEmptyDocument(appId,"学生表");
doc.addElement("姓名","steven");
doc.addElement("年龄",24);
$.form.saveFormDocument(doc,appId);
})()
# 7. 业务建模消息发送事件,通过低代码指定消息接收用户
# 需求场景和注意点:
该低代码需返回用户对象或用户集合对象(User/List
# 代码示例:
(function(){
//获取当前用户id
var userId = $.context.getCurrentUserId();
//调用通讯录接口,通过userId获取对应User对象,并返回
return $.contact.getUserById(userId);
})()
# 8. 修改或添加控件值,并保存(常用于按钮执行前事件或系统任务)
# 需求场景和注意点:
注意点:该类型低代码只需要修改表单控件值,不需保存表单,因为七巧低代码表单存在版本概念及服务器会自动保存表单,若低代码中保存会报错
# 代码示例:
(function(){
var doc = $.context.getCurrentDocument();
doc.addElement("姓名","steven");
doc.addElement("手机号码","138****0000");
})()
# 常见异常
# 1.常量未定义
代码示例:
(function(){
var context = "任务名称";
var receiveUserIds = $.context.getCurrentUserId();
$.message.sendGeneralStationMessage(subject, context, receiveUserIds);
})()
异常信息:
[org.mozilla.javascript.EcmaError: ReferenceError: "subject" is not defined. (12321312_5e1fde77fb38aca44a96b7c6#4)]
原因: 低代码未定义“subject”变量
# 2.使用未定义方法
代码示例:
(function(){
var doc = $.context.getCurrentDocument();
var userId = doc.getElementByName("人员单选1").getvalue();
})()
异常信息:
[org.mozilla.javascript.EcmaError: TypeError: Cannot find function getvalue in object cn.com.do1.do1cloud.bpms.form.document.model.StandardElement@a729d70d. (12321312_5e1fde77fb38aca44a96b7c6#3)]
原因: StandardElement中value对应的getter方法为getValue(),而不是getvalue()
# 3.空指针异常
代码示例:
(function(){
var appId = $.context.getCurrentApplicationId();
//构建控件值键对
var fieldMap = new Packages.java.util.HashMap();
//表单名称
var formName ="测试表单a";
//获取文档集合
var docs = $.form.getFormDocumentsByFieldNameAndValue(appId, formName, fieldMap);
for(i=0;i<docs.size();i++){
$.log.info("{}+{}={}",1,2,3);
}
})()
异常信息:
[org.mozilla.javascript.EcmaError: TypeError: Cannot call method "size" of null (12321312_5e2008b8fb38aca44a96b7cd#9)]
原因: 返回的docs对象为null,无法调用size(),调用对象方法前需判空,防止空指针异常