Commit 047c5da4 authored by drigle's avatar drigle

feat: archive department control item snapshots

parent 4c6749a4
......@@ -540,6 +540,23 @@ function normalizeDepartmentArchiveItem(item) {
};
}
function assertProcessArchiveDepartmentField(subject) {
const field = (subject?.fields || []).find(
(candidate) => candidate?.name === DEPARTMENT_CONTROL_ITEMS_FIELD,
);
const nestedSubject = field?.settings?.subject;
if (
field?.type !== 'subject'
|| field?.multiple !== true
|| nestedSubject !== INTEGRITY_RISK_SUBJECTS.departmentItem
) {
throw new Error(
'过程表归档对象的“部门填报明细”字段配置不正确,请确认 department_control_items '
+ '为多值 Subject,并指向 risk_prevention_control_measures_table_department_item。',
);
}
}
function showArchiveRecord(record) {
const metadata = record?.metadata || {};
return {
......@@ -592,9 +609,14 @@ async function createArchiveBatch({ records, historySubject, mapRecord, referenc
export async function archiveProcessRecords(records) {
const recordIds = normalizeIds(records);
const latestRecords = recordIds.length > 0
? await Promise.all(recordIds.map((id) => loadRecord(id)))
: [];
if (recordIds.length === 0) {
throw new Error('请先选择需要归档的记录。');
}
const [archiveSubject, latestRecords] = await Promise.all([
loadSubject(INTEGRITY_RISK_SUBJECTS.processArchive),
Promise.all(recordIds.map((id) => loadRecord(id))),
]);
assertProcessArchiveDepartmentField(archiveSubject);
return createArchiveBatch({
records: latestRecords,
historySubject: INTEGRITY_RISK_SUBJECTS.processArchive,
......
......@@ -61,8 +61,10 @@
公式结果时同样必须显式使用 `calculated=true`。
13. 措施库 `measure_description` 的真实定义已确认只包含 `description` 一个文本字段,
导入、导出、归档均以 `metadata.description` 作为措施正文。
14. 过程表归档对象 `risk_prevention_control_measures_table_archive` 的主对象快照定义已确认包含
22 个字段;归档业务在此基础上同时保留对应的 `department_control_items[]` 子对象快照。
14. 过程表归档对象 `risk_prevention_control_measures_table_archive` 已确认包含 23 个字段,
其中 `department_control_items` 是多值嵌套 Subject,指向
`risk_prevention_control_measures_table_department_item`;归档时同时保存主对象字段和
`department_control_items[]` 子对象快照。
主对象部分的多值字段在快照中保存为展示文本,制度引用和用户字段仍写 `_id[]`。
15. 展示表归档对象 `risk_prevention_control_measures_table_show_archive` 的真实定义已确认包含
18 个字段;制度名称、子公司制度、责任单位和涉及范围均保存展示文本,不写引用或用户 ID。
......@@ -186,7 +188,9 @@
过程表主对象当前业务数据,以及该记录当时的
`metadata.department_control_items[]` 子对象完整数据(包括各部门原始业务字段、人员、
权限范围、审批状态、流程主单/待办 ID 和时间字段)。归档只创建快照,不删除过程表原记录,
也不把主对象的人工修改反写到部门子项。
也不把主对象的人工修改反写到部门子项。部门明细作为嵌套值写入归档记录,不引用原过程表
或原部门子项;归档前会校验该字段为多值 Subject 且指向正确的部门明细 Subject,配置不符时
终止归档并显示错误,避免静默丢失部门快照。
## 4. 展示表操作
......
......@@ -108,7 +108,7 @@ type Record = {
| `risk_prevention_control_measures_table` | 廉洁风险防控过程表 | 普通业务字段写入 `metadata`;用户和引用字段只写 ID |
| `risk_prevention_control_measures_table_show` | 供汇总、展示和导出的展示表 | 由过程表 Excel 导入替换;字段仍写入 `metadata` |
| `measure_description` | 当前防控措施库 | `metadata.description` 保存措施文本 |
| `risk_prevention_control_measures_table_archive` | 过程表历史快照 | 引用/用户字段只写 ID,其他字段保存归档时值 |
| `risk_prevention_control_measures_table_archive` | 过程表历史快照 | 保存主对象字段和 `department_control_items[]` 嵌套快照;引用/用户字段只写 ID |
| `risk_prevention_control_measures_table_show_archive` | 展示表历史快照 | 保存展示表字段快照 |
| `measure_description_history` | 措施库历史快照 | `metadata.description` 保存措施文本 |
| `integrity_risk_control_archive` | 归档批次 | 通过引用 ID 数组关联三类历史快照 |
......@@ -193,11 +193,12 @@ type Record = {
### 3.1.3 `risk_prevention_control_measures_table_archive` 字段
本次提供的真实定义包含 22 个字段,所有字段 `required`、`primary`、`search.enabled`
本次提供的真实定义包含 23 个字段,所有字段 `required`、`primary`、`search.enabled`
和 `aggregation.enabled` 均为 `false`。字段值写入时均放入 `metadata`。
过程表归档对象保存归档时快照。与过程表相比,部分过程表多选展示字段在快照中为
`text` 单值字段;制度和用户字段仍保留为多值引用/用户字段。
`text` 单值字段;制度和用户字段仍保留为多值引用/用户字段。部门填报明细以嵌套
Subject 数组保存归档时的完整值,不引用原过程表记录。
| 字段标签 | 字段别名 | 字段类型 | 默认值 | 多值 | 设置/选项 |
| --- | --- | --- | --- | --- | --- |
......@@ -223,6 +224,7 @@ type Record = {
| 类别 | `type` | select | `null` | 否 | 选项:`鑫元基金`、`鑫沅资产` |
| 子公司制度 | `subsidiary_system` | reference | 空字符串 | 是 | 引用 Subject:`subsidiary_system` |
| 子公司制度(补充) | `subsidiary_system_add` | text | `null` | 否 | |
| 部门填报明细 | `department_control_items` | subject | `[]` | 是 | 子对象:`risk_prevention_control_measures_table_department_item` |
写入约束:
......@@ -230,6 +232,7 @@ type Record = {
`involving_positions_or_personnel` 和 `business_unit` 由原值转换为展示文本保存。
- `file_name_and_document_number` 和 `subsidiary_system` 只写引用记录 `_id[]`,不能写完整对象。
- `filled_by` 和 `approved_by` 只写用户 `_id[]`。
- `department_control_items` 保存完整嵌套快照;其中引用和用户字段归一化为 `_id`/`_id[]`,不保存对原过程表或原部门子项的引用。
- `risk_level` 是公式字段,由 `probability * hazard_degree` 计算,不应由前端手工写入。
- `approval_status` 线上定义未包含 `已驳回`,但一级审核驳回流程当前会写入该兼容值;后续应以后端 Subject 选项补齐为准。
......@@ -496,7 +499,7 @@ ID 数组。
### `risk_prevention_control_measures_table_archive`:廉洁风险防控过程表归档记录
- 类型:`normal`
- 字段数量:22
- 字段数量:23
| 字段标签 | 字段别名 | 字段类型 | 多值 | 必填 | 主键 | 关联/配置 |
| --- | --- | --- | --- | --- | --- | --- |
......@@ -522,6 +525,7 @@ ID 数组。
| 类别 | `type` | select | 否 | 否 | 否 | options: 鑫元基金, 鑫沅资产 |
| 子公司制度 | `subsidiary_system` | reference | 是 | 否 | 否 | Subject: subsidiary_system |
| 子公司制度(补充) | `subsidiary_system_add` | text | 否 | 否 | 否 | |
| 部门填报明细 | `department_control_items` | subject | 是 | 否 | 否 | Subject: risk_prevention_control_measures_table_department_item |
### `risk_prevention_control_measures_table_show`:廉洁风险防控措施表(展示)
......@@ -773,6 +777,7 @@ ID 数组。
- `risk_prevention_control_measures_table.file_name_and_document_number` -> `internal_regulation`
- `risk_prevention_control_measures_table.subsidiary_system` -> `subsidiary_system`
- `risk_prevention_control_measures_table.department_control_items` -> `risk_prevention_control_measures_table_department_item`
- `risk_prevention_control_measures_table_archive.department_control_items` -> `risk_prevention_control_measures_table_department_item`
- `risk_prevention_control_measures_table_department_item.file_name_and_document_number` -> `internal_regulation`
- `risk_prevention_control_measures_table_department_item.subsidiary_system` -> `subsidiary_system`
- `risk_prevention_control_measures_table_archive.file_name_and_document_number` -> `internal_regulation`
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment