You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

85 lines
3.2 KiB

# 第一版排序
## 操作机构排序
![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 -- 无效字段
```