8. 组织机构重构

组织机构的高级使用。

1.需求概要

当一个集团,有多个子公司,各个子公司各有项目,每个项目设有多个业务科室(下图右侧为组织机构设置),用户可能在多个机构兼职(下图左侧为用户所在的部门岗位)。
当用户登录时,需要登记某个机构的数据。如果登录用户代表公司(或分子公司)、项目部时,登记部门为当前部门,如果并不代表公司或者项目部,此时需要找当前部门的上级节点,直到找到项目(或公司或分子公司)为止(下图中红色方框中的4条记录);平台提供的组织机构信息有机构、部门、分支机构  (下图所有数据),如何获取红色部分的数据 ——公司或者未结束的项目信息呢?
应用场景:
场景1:审批流程的判断,要找到当前部门的上一级机构=公司或分公司或项目;
场景2:项目部的工程部人员甲登记项目进度数据时,如果甲只在一个项目部X有身份,则登记项目直接赋值项目部X,如果甲在多个项目部有身份,则选择其中一个项目部

2.解决方案

①增加模板《机构类型》,同步系统的组织机构,并扩展出机构类型属性(红色方框内容)
②通过该模板与用户模板的关联关系,查询当前登录用户机构的数据

3.详细步骤

①《机构类型》模板,基本信息为空,明细及数据项定义如下(数据项的名称采用英文,非标题名称),且“模板属性”中设置“只有一份表单”,打开模板时进入唯一的表单(如上图)。
类型(Kind)列就是用来定义机构类型的,可分为两类:公司、项目。基于其它的管理需求,也可以定义集团、集团分公司、集团项目、分公司、分公司项目、子公司、子公司项目等等 。
②同步组织机构,新建表单和打开表单时自动同步系统组织机构。
在填表公式的“新建打开表单后事件”同步组织机构,根据唯一的组织机构ID更新;
在填表公式的“修改打开表单后事件”同步组织机构,根据唯一的组织机构ID更新,公式相同;
③赋值机构顶级节点的ID全路径,当编码(code)不为空,且父机构ID(PID)=0 时执行
如果数据库库的机构ID使用UUID,则PID的判断应该为  本表单.明细.PID=常量.空 或者 本表单.明细.PID="" 
注意:ID全路径不能使用  .  \   / 这3种符号,避免与数据库语法冲突
④赋值子机构节点的ID全路径,当编码(code)不为空,且父机构ID(PID)<>0  和常量.空 时执行,设置数据源为“明细”,明细中有多少条记录,将执行多少次更新操作,给所有的机构子节点赋值ID全路径。
⑤设置数据接口,在模板中新建数据接口“查找登录人所在的公司或者项目(登录账号)”,该数据接口有一个参数“登录账号”。
设置数据源,有3个数据源,第1个数据源为本模板的明细,第2个数据源仍然为本模板的明细,并设置别名(Tborg2),第3个数据源为用户.部门列表。
设置数据源的关联:由于第1个数据源与第2个数据源为同一个数据源,无需设置,第2个数据源与第3个数据源通过组织ID(OrgID)关联。
设置数据源的过滤条件
选中第1个数据源,需要过滤 类型(Kind)为公司“Cop”或者 类型(kind)为项目“Pro”且项目没有结束的记录(如上图);
选中第3个数据源,用户的账号与自定义参数账号相同时;
设置数据列:添加模板明细的数据项,按照code升序,并勾选“重复数据只显示一次”;
  ★设置过滤条件,根据当前ID的组织机构ID全路径,查询符合的公司或者项目的机构,过滤掉不符合的数据。
数据接口查询结果,如下

4.扩展

如果要通过登录人所在的部门去找部门的上一级节点是特定的某一种类型时,可以适用此方法 把登录账号变量改为:登录人的部门编号,但是针对兼职时,只取主部门,比如 甲在集团任副总经理,还兼任下属子公司A的总经理时 这会导致甲填数据时,锁定的登记单位一定是集团 。
2022-09-23
40 39