# 第一版排序 ## 操作机构排序 ![200.png](200.png){ thumbnail="true" style="block" } 在机构管理中,进行机构拖动,然后进行数据存储,存储时,按照同父节点进行顺序从(1到n进行顺序增加)。 ## 操作人员排序 ![201.png](201.png){ thumbnail="true" style="block" } 需要注意的是,不同的职务,如果职务属于不同的科室,则展示的排序顺序也会不一样。 每一个人在每一个有职务的机构的排序均不一样,当然在整体来看,人员的集体内排序号以“按照机构最高的职务,排序靠前的顺序”进行展示。 例如: ![202.png](202.png){ thumbnail="true" style="block" } 余某某,在“宁波市人民政府”和“宁波市教育局”两个单位任职,分别如下 | ---- | ---- | ---- | | 机构名 | 机构码 | 排序号 | | 宁波市人民政府 | 001.001.002 | 4 | | 宁波市教育局 | 001.001.002.004 | 1 | 这是这个人员,由于在“宁波市人民政府”任职,编码或者层次深度更小,则最终人员的集体内排序应为 `TORGID` = `001.001.002` 和 `SORTID` = `4` 其实主要是针对“机构码”的计算,寻找深度小的任职单位。 那么同样任职深度的单位,如何进行计算操作呢!这是一个比较复杂的问题。按照原则,如果相同深度机构, 应该在比较是否同父节点,同父节点,按照机构排序码进行比较,不是同父父节点,按照上级节点谁靠前,先排谁。 ## 操作人员算法 > 这里简化了后面比较复杂的情况。以 SQL 函数的方式进行数据比较查询性能上可能存在局限。 * 数据更新 ```sql -- 定义函数 create function get_torgid(V0000 varchar(120)) returns varchar(199) begin DECLARE FunctionResult VARCHAR(199); select min(a0201b) into FunctionResult from (select a02.A0201B from a02, b01 where a02.a0000 = V0000 and b01.b0111 = a02.a0201b and a02.a0281 = 'true' and a0201b <> '-1' order by b01.sortid) a02 LIMIT 1; return FunctionResult; end; -- 在基本数据发生保存时,即人员集体内排序或人员职务信息发生保存时。 -- 更新人员整体的集体内排序标识 update a01 set a01.torgid= get_torgid(a0000) where a0000 = '${a0000}'; update a01 set a01.torder= lpad( ifnull( (select max(a0225) from a02 where a01.a0000 = a02.a0000 and a02.a0281 = 'true' and a01.torgid=a02.a0201b) ,'1') ,5,'0') where a01.a0000 = '${a0000}'; ``` * 数据查询 ![204.png](204.png) { thumbnail="true" style="block" } > 这里虽然能部分解决机构排序号的问题,但是上级单位的排序号还是会影响整体排序。 在手动排序功能下,默也是认排序方式, ```sql select a01.a0000, 'xxx' sessionid from A01 a01 order by length(torgid), -- 为了描述深度 (select concat(LPAD(SORTID, 6, 0), torgid) from b01 where B0111=torgid) asc, -- 为了拼接机构排序码 torder asc, -- 人员排序号 a0000 asc -- 无效字段 ```