功能背景
流程或info表单编辑界面,默认带出当前登录人信息、某一字段的调整触发另一字段或一组字段的更新等。例如:流程表单起草界面,默认带出起草人、起草人所在单位、部门、任职岗位等;员工转正流程,选择转正人员,自动带出转正人员所在单位、部门、任职岗位等。
这种场景下就需要用到form_relations。它主要是用来处理 表单字段值联动以及字段默认值
form_relations下属性简单介绍
form_relations配置在info层,结构如下所示:
"form_relations":[ { "key":"字段1", "default":{ "expression":"表达式1" }, "value_onchange":[ { "key":"字段2", "force_change":true, "expression":"表达式2" }, { "key":"字段3", "expression":"表达式3" }, { "key":"字段n", "expression":"表达式4" } ] } ]
上述结构解释:info表单(新增/初始化时),字段1通过表达式1赋默认值,同时字段1的更改联动字段2、字段3、字段n的值进行更改。
- default属性:初始化表单时能自动赋值
- value_onchange属性:根据一个字段值的变化触发另外一些字段值的变化
- force_change属性:以上述结构为例,无论字段1是否变化,字段2都进行触发。应用场景:如家庭信息中的亲属年龄根据出生日期进行计算,出生日期不变,每次打开info界面时,年龄都要强制触发一次计算,就可以将年龄字段的"force_change"属性设置为true
- expression属性:字段赋值表达式,包括执行一些预制好公式、字符、数值等。
示例:流程表单中有离职人员(employee_id)、岗位(position_id)、部门(department_id)、工号(number)四个字段,新增单据时默认带出流程提交人,获取他的工号、部门、岗位。
{ "form_relations": [ { "key": "employee_id", "default": { "expression": "EMP().get('id')" // 获取流程发起人的id }, "value_onchange": [ { "expression": "EMP(employee_id=employee_id)", // 根据人员id获取人员基本信息集 "key": "emp_data" }, { "expression": "emp_data.get('number')", // 根据人员基本信息集获取工号 "key": "number" }, { "expression": "EMPPRIMARYJOB(employee_id=employee_id)", // 根据人员id获取主任职信息集 "key": "cur_job" }, { "expression": "cur_job.get('position_id')", // 根据主任职信息集获取岗位id "key": "position_id" }, { "expression": "cur_job.get('department_id')", // 根据岗位id获取所在部门id "key": "department_id" } ] } ] }
流程其他常见配置套用
1. 最常见根据人的id带出人的任职,最高教育经历,(聘任为是)专业技术职务信息
{"form_relations": [{ "default": { "expression": "EMP()['id']" }, "value_onchange": [ { "expression": "EMP(employee_id=employee_id)", "key": "emp_data" }, { "expression": "emp_data.get('number')", "key": "number" }, { "expression": "EMPPRIMARYJOB(employee_id=employee_id)", "key": "cur_job" }, { "expression": "cur_job['position_id']", "key": "position_id" }, { "expression": "cur_job['department_id']", "key": "department_id" }, { "expression": "cur_job['unit_id']", "key": "unit_id" }, { "expression": "cur_job['job_grade_id']", "key": "job_grade_id" }, { "expression": "cur_job['job_step_id']", "key": "job_step_id" }, { "expression": "TODAY()", "key": "date" }, { "expression": "HIGEDU(employee_id).get('education')", "key": "education" }, { "expression": "MODELGET('TechnicalSkills',is_recruit=True,employee_id=employee_id).technical_skills_name", "key": "technical_skills_name" }], "key": "employee_id" }]}
其中:employee_id是人id的key,默认当前登入人,它的变化会掉value_change事件,会带出基本信息(人员编码number)
任职信息cur_job (unit_id单位,departmen_id部门,position_id岗位,job_grade_id职等,job_step_id职级),
同时带出填报的时间字段date,最高教育经历,技术职务等于是的聘任信息
需要注意:cur_job,emp_data为中间变量,赋值情况过多,需要找中间变量过渡存储下
2.根据岗位带出部门,单位
其中: position_id是岗位id变化会引起部门单位变化
{"form_relations": [{ "value_onchange": [{ "expression": "POSITION(position_id).get('parent_id')", "key": "department_id" }, { "expression": "POSITION(department_id).get('subordinate_unit_id')", "key": "unit_id" }], "key": "position_id" }]}
3. 调云函数
{ "expression": "PLUGIN('云函数名称XXXX',{})", "key": "form_default_value" }
form_default_value为云函数返回值
示例:
4. 调API
{ "expression": "API('云函数名称',{'model':'EmployeeAction'参数XXXX等等})", "key": "form_default_value" }
示例:
5.如果获取的时候不存在然后想继续获取可以用python写法 A.get(xxxx) if A else None
{
"expression": "MODELINFO('EmployeeEducation',is_first='1',employee_id=employee_id)[0].get('education') if MODELINFO('EmployeeEducation',is_first='1',employee_id=employee_id) else None",
"key": "education"
}
简单写法:
MODELGET('EmployeeEducation',is_first='1',employee_id=employee_id).get('education')
or
MODELGET('EmployeeEducation',is_first='1',employee_id=employee_id).education
此时假如没有对应的信息 直接会返回None,系统会处理空值
推荐使用 MODELGET来获取单个对象值,需要获取列表使用MODELINFO
6. 字段属性控制
流程中想配置当job_name字段有值时job_category必填,需要在info层job_category字段的options里配置required
示例: "required": "=function(){return FORM().data.job_name?true:false}"
其中想在流程子表中拿到主表的配置是:BASE_FORM().data.对应的key
7. 测试公式是否正确
api: execute.formula.preview
参数 : {"formula":"EMP()"}
示例:可根据这个API查看form_relations常用的方法输出结果,如EMPPRIMARYJOB(employee_id=XXXXX)
8. 补充带出常见的带出一级,二级三级部门公式
{"form_relations": [{ "value_onchange": [{ "expression": "DepartFind(department_id).get(1,{}).get('id')", "key": "first_depart_id" } ,{ "expression": "DepartFind(department_id).get(1,{}).get('name')", "key": "first_depart_name" } ], "key": "department_id" }]}
用到的公式为DepartFind
调用公式截图为:假设获取一级部门的id及name,则配置方法为: