功能背景

流程或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,则配置方法为:

  • 无标签