Commit dd0aab32 authored by David Yang's avatar David Yang

feat: 廉洁党建建设管理

parent 06f0d7dd
...@@ -9,6 +9,7 @@ const ROUTE_PATHS = { ...@@ -9,6 +9,7 @@ const ROUTE_PATHS = {
login: '/login', login: '/login',
resourceStat: '/resource/stat', resourceStat: '/resource/stat',
resourceBooking: '/resource/booking', resourceBooking: '/resource/booking',
integrityParty: '/integrity-party',
} as const; } as const;
export default defineConfig({ export default defineConfig({
...@@ -47,6 +48,10 @@ export default defineConfig({ ...@@ -47,6 +48,10 @@ export default defineConfig({
path: ROUTE_PATHS.resourceBooking, path: ROUTE_PATHS.resourceBooking,
component: './project_manager_xy/resource-booking/index', component: './project_manager_xy/resource-booking/index',
}, },
{
path: ROUTE_PATHS.integrityParty,
component: './project_manager_xy/integrity-party/index',
},
], ],
}, },
], ],
......
...@@ -3,6 +3,7 @@ import { UserContext } from '@/wrapper/Auth'; ...@@ -3,6 +3,7 @@ import { UserContext } from '@/wrapper/Auth';
import { import {
ArchiveBoxIcon, ArchiveBoxIcon,
Bars3Icon, Bars3Icon,
ClipboardDocumentListIcon,
Squares2X2Icon, Squares2X2Icon,
XMarkIcon, XMarkIcon,
} from '@heroicons/react/24/outline'; } from '@heroicons/react/24/outline';
...@@ -26,6 +27,11 @@ const menuGroups = [ ...@@ -26,6 +27,11 @@ const menuGroups = [
path: '/resource/booking', path: '/resource/booking',
icon: ArchiveBoxIcon, icon: ArchiveBoxIcon,
}, },
{
name: '廉洁党建建设管理',
path: '/integrity-party',
icon: ClipboardDocumentListIcon,
},
], ],
}, },
]; ];
......
# 廉洁党建建设管理流程文档
## 1. 模块目标
本模块用于维护廉洁党建建设相关台账,覆盖培训、谈话、调研、专题会议、廉洁主题活动、节前廉洁提醒 6 类记录。
核心原则:
- 6 类台账分别使用独立 Subject
- 每条台账对应一条 `Record`
- 所有业务字段均写入 `metadata`
- 附件字段均按多附件数组保存,由系统内上传控件维护
- Excel 导入不处理附件,导出时输出已上传附件的文件名和 URL
## 2. 功能入口
- 左侧菜单:`驾驶舱`
- 页面内可切换 `案例库统计 / 廉洁党建统计`
- 廉洁党建统计展示台账总数、本年度记录、附件完整率、最近 30 天更新、台账分类分布、年度分布和最近更新台账
- 左侧菜单:`廉洁党建建设管理`
- 页面内通过 Tab 切换 `培训类 / 谈话类 / 调研类 / 专题会议类 / 廉洁主题活动 / 节前廉洁提醒`
- 每个 Tab 对应独立台账对象和独立 Excel 模板
## 3. 核心业务对象
| 台账分类 | Subject |
| --- | --- |
| 培训类 | `integrity_party_training` |
| 谈话类 | `integrity_party_talk` |
| 调研类 | `integrity_party_research` |
| 专题会议类 | `integrity_party_meeting` |
| 廉洁主题活动 | `integrity_party_activity` |
| 节前廉洁提醒 | `integrity_party_holiday_reminder` |
## 4. 业务流程
### 4.1 浏览与检索台账
1. 用户进入 `廉洁党建建设管理`
2. 通过顶部 Tab 选择台账分类
3. 页面展示该分类的表格台账
4. 筛选区统一包含关键词、年份和当前分类关键字段
5. 用户点击 `查询` 后,前端调用 `POST /record/query`
6. 列表按 `updated_at`、`created_at` 倒序展示
7. 表格仅展示核心字段、附件状态、更新时间和操作入口
8. 完整字段在编辑弹窗中维护
### 4.2 手动新建台账
1. 用户点击 `新建记录`
2. 前端根据当前 Tab 字段配置生成表单
3. 用户填写最小必填字段
4. 附件字段通过系统上传控件上传,一个字段可保存多个附件
5. 前端自动生成 `title`
6. 前端调用 `POST /record`
7. 保存成功后提示并刷新当前列表
最小必填字段:
- 培训类:培训类别、时间、授课主题
- 谈话类:年份、姓名
- 调研类:调研时间、调研单位
- 专题会议类:会议时间、会议议题
- 廉洁主题活动:开展年份、活动主题
- 节前廉洁提醒:年份、重大节假日
### 4.3 编辑台账
1. 用户在表格中点击 `编辑`
2. 页面打开详情弹窗,展示当前分类全部字段
3. 用户修改字段或上传、移除附件
4. 前端调用 `PUT /record/:name`
5. 保存成功后刷新当前列表
### 4.4 删除台账
1. 用户在编辑弹窗中点击删除,或在表格勾选后点击批量删除
2. 页面弹出二次确认
3. 前端调用 `DELETE /record/:name`
4. 删除后刷新当前列表
5. 删除默认走软删除
### 4.5 Excel 导入
1. 用户在当前 Tab 点击 `下载模板`
2. 前端导出当前分类的独立模板
3. 用户维护 Excel 后点击 `Excel 导入`
4. 前端读取首个工作表并按当前 Tab 字段映射解析
5. 附件字段不参与导入
6. 前端逐条调用 `POST /record`
7. 当前阶段不做重复判断、不自动覆盖,导入全部新增
8. 导入完成后提示成功条数和失败条数
### 4.6 Excel 导出
1. 用户点击 `Excel 导出`
2. 前端按当前筛选条件分页读取全部记录
3. 导出当前分类全部字段
4. 附件字段导出为文件名和 URL,多附件用换行分隔
5. 用户也可以先勾选记录,再点击 `导出勾选`
### 4.7 批量修改
1. 用户勾选一条或多条记录
2. 点击 `批量修改`
3. 弹窗只展示当前分类允许批量覆盖的简单字段
4. 未填写字段保持原值不变
5. 前端逐条调用 `PUT /record/:name`
6. 附件、长文本主要内容等字段一期不参与批量修改
## 5. 字段与数据规则
- 日期字段页面和 Excel 统一展示为 `YYYY-MM-DD`
- 保存时日期字段转换为 ISO 8601 字符串
- 布尔字段使用三态 UI:是、否、未填写,对应 `true / false / null`
- 培训类别固定为:廉政党课讲授、廉洁合规培训、专题廉洁合规教育培训、新员工廉洁教育培训
- 重大节假日固定为:元旦、春节、清明、五一、端午、中秋、国庆、其他
- 选择重大节假日 `其他` 时,可填写 `holiday_other`
- 人员、部门、岗位、单位等字段一期全部使用普通文本输入,不做系统引用
## 6. 异常处理与限制
- 保存失败时保留当前表单输入并提示用户
- Excel 解析失败时不发起创建请求
- Excel 批量导入单条失败不影响其它条目继续导入
- 批量删除和单条删除均需要二次确认
- 当前阶段不做导入重复校验,后续可根据 Subject 主键配置扩展覆盖或拦截逻辑
This diff is collapsed.
This diff is collapsed.
...@@ -244,3 +244,89 @@ ...@@ -244,3 +244,89 @@
- 案例业务字段全部放入 `metadata` - 案例业务字段全部放入 `metadata`
- `metadata.keyword` 为多值字符串数组;Excel 导入如读取到 `资金管理, 异常调账`,前端需拆分为 `["资金管理", "异常调账"]` 后保存 - `metadata.keyword` 为多值字符串数组;Excel 导入如读取到 `资金管理, 异常调账`,前端需拆分为 `["资金管理", "异常调账"]` 后保存
- Excel 导出时,`metadata.keyword` 数组需恢复为逗号拼接字符串写入 `关键字` 列 - Excel 导出时,`metadata.keyword` 数组需恢复为逗号拼接字符串写入 `关键字` 列
## 6. 廉洁党建建设管理接入模式
本模块继续复用统一 `Record` 接口,6 类台账分别使用独立 subject:
- `integrity_party_training`:廉洁党建培训记录
- `integrity_party_talk`:廉洁党建谈话记录
- `integrity_party_research`:廉洁党建调研记录
- `integrity_party_meeting`:廉洁党建专题会议记录
- `integrity_party_activity`:廉洁主题活动记录
- `integrity_party_holiday_reminder`:节前廉洁提醒记录
### 6.1 创建 / 更新建议
调用:
- `POST /record`
- `PUT /record/:name`
示例:
```json
{
"subject": "integrity_party_training",
"title": "廉洁合规培训 · 新员工廉洁合规入职培训 · 2026-06-08",
"content_type": "text",
"content": "廉洁合规培训 · 新员工廉洁合规入职培训 · 2026-06-08",
"metadata": {
"sequence_no": 1,
"training_category": "廉洁合规培训",
"training_date": "2026-06-08T00:00:00.000Z",
"training_target": "新员工",
"training_format": "现场培训",
"lead_department": "纪检办公室",
"lecturer": "张三",
"lecture_topic": "新员工廉洁合规入职培训",
"main_content": "围绕廉洁从业要求、合规底线和典型案例开展培训。",
"participant_count": 32,
"courseware_materials": [
{
"name": "培训课件.pptx",
"type": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
"size": 204800,
"url": "https://example.com/file.pptx"
}
],
"sign_in_sheets": []
}
}
```
### 6.2 查询建议
调用:
- `POST /record/query`
示例:
```json
{
"subject": "integrity_party_talk",
"page": 0,
"page_size": 20,
"filter": {
"$and": [
{ "metadata.year": 2026 },
{
"$or": [
{ "metadata.person_name": { "$regex": "张三", "$options": "i" } },
{ "metadata.primary_department": { "$regex": "张三", "$options": "i" } }
]
}
]
},
"sort": "-updated_at -created_at"
}
```
注意事项:
- 业务字段全部写入 `metadata`
- 文件字段统一保存为多附件数组 `{name,type,size,url}[]`
- 日期字段页面和 Excel 展示为 `YYYY-MM-DD`,保存为 ISO 8601 字符串
- Excel 导入不处理附件字段,附件仅通过系统上传控件维护
- 当前阶段导入不做重复判断、不覆盖已有记录,全部新增
...@@ -7,6 +7,12 @@ ...@@ -7,6 +7,12 @@
当前项目当前阶段以“风险案例库”为目标,核心业务对象如下: 当前项目当前阶段以“风险案例库”为目标,核心业务对象如下:
- `risk_case_library`:案例库单条案例 - `risk_case_library`:案例库单条案例
- `integrity_party_training`:廉洁党建培训记录
- `integrity_party_talk`:廉洁党建谈话记录
- `integrity_party_research`:廉洁党建调研记录
- `integrity_party_meeting`:廉洁党建专题会议记录
- `integrity_party_activity`:廉洁主题活动记录
- `integrity_party_holiday_reminder`:节前廉洁提醒记录
--- ---
...@@ -155,3 +161,115 @@ type Record = { ...@@ -155,3 +161,115 @@ type Record = {
"case_year": 2024 "case_year": 2024
} }
``` ```
## 3.2 廉洁党建建设管理
本模块使用 6 个独立 Subject 承载不同台账类型。每条台账记录对应一条 `Record`,业务字段全部写入 `metadata`,附件字段按多文件数组存储,结构为 `{ name, type, size, url }`。
统一约定:
- 日期字段页面和 Excel 展示为 `YYYY-MM-DD`,保存时前端转换为 ISO 8601 字符串
- Excel 导入不处理附件列,附件仅通过系统上传控件维护
- `title` 由前端按各对象核心字段自动生成,不提供单独标题字段
- `sequence_no` 仅用于台账顺序和历史 Excel 对照,不作为主键
- 当前阶段不做导入重复判断,Excel 导入全部新增
### 3.2.1 廉洁党建培训记录
- **subject**: `integrity_party_training`
- **title 生成**:`培训类别 + 授课主题 + 时间`
| 字段标签 | 字段别名 | 字段类型 | 默认值 | 是否主键 | 是否多值 | 是否必填 | 搜索 | 聚合 | 说明 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 序号 | `sequence_no` | `number` | `null` | 否 | 否 | 否 | 否 | 否 | 台账顺序号 |
| 培训类别 | `training_category` | `select` | `null` | 否 | 否 | 是 | 否 | 否 | 选项:廉政党课讲授、廉洁合规培训、专题廉洁合规教育培训、新员工廉洁教育培训 |
| 时间 | `training_date` | `date` | `null` | 否 | 否 | 是 | 否 | 否 | 培训日期 |
| 培训对象 | `training_target` | `text` | `null` | 否 | 否 | 否 | 否 | 否 | 培训覆盖对象 |
| 培训形式 | `training_format` | `text` | `null` | 否 | 否 | 否 | 否 | 否 | 培训方式 |
| 牵头部门 | `lead_department` | `text` | `null` | 否 | 否 | 否 | 否 | 否 | 牵头组织部门 |
| 授课人 | `lecturer` | `text` | `null` | 否 | 否 | 否 | 否 | 否 | 授课人员 |
| 授课主题 | `lecture_topic` | `text` | `null` | 否 | 否 | 是 | 否 | 否 | 培训主题 |
| 主要内容 | `main_content` | `long_text` | `null` | 否 | 否 | 否 | 否 | 否 | 培训主要内容 |
| 参加人数 | `participant_count` | `number` | `null` | 否 | 否 | 否 | 否 | 否 | 实际参加人数 |
| 课件材料 | `courseware_materials` | `file` | `[]` | 否 | 是 | 否 | 否 | 否 | 系统内上传的 PPT、PDF 等课件 |
| 签到表 | `sign_in_sheets` | `file` | `[]` | 否 | 是 | 否 | 否 | 否 | 系统内上传签到材料 |
### 3.2.2 廉洁党建谈话记录
- **subject**: `integrity_party_talk`
- **title 生成**:`姓名 + 年份 + 本年度计划谈话时间`
| 字段标签 | 字段别名 | 字段类型 | 默认值 | 是否主键 | 是否多值 | 是否必填 | 搜索 | 聚合 | 说明 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 序号 | `sequence_no` | `number` | `null` | 否 | 否 | 否 | 否 | 否 | 台账顺序号 |
| 年份 | `year` | `number` | `null` | 否 | 否 | 是 | 否 | 否 | 台账年份 |
| 姓名 | `person_name` | `text` | `null` | 否 | 否 | 是 | 否 | 否 | 谈话对象姓名 |
| 所属一级部门 | `primary_department` | `text` | `null` | 否 | 否 | 否 | 否 | 否 | 一级部门名称 |
| 岗位名称 | `position_name` | `text` | `null` | 否 | 否 | 否 | 否 | 否 | 岗位名称 |
| 岗位晋升时间 | `promotion_date` | `date` | `null` | 否 | 否 | 否 | 否 | 否 | 岗位晋升日期 |
| 是否党员 | `is_party_member` | `boolean` | `null` | 否 | 否 | 否 | 否 | 否 | 三态:是、否、未填写 |
| 是否领导干部 | `is_leader` | `boolean` | `null` | 否 | 否 | 否 | 否 | 否 | 三态:是、否、未填写 |
| 是否投资序列 | `is_investment_sequence` | `boolean` | `null` | 否 | 否 | 否 | 否 | 否 | 三态:是、否、未填写 |
| 最近一期谈话时间 | `latest_talk_date` | `date` | `null` | 否 | 否 | 否 | 否 | 否 | 最近一次谈话日期 |
| 本年度计划谈话时间 | `planned_talk_date` | `date` | `null` | 否 | 否 | 否 | 否 | 否 | 本年度计划谈话日期 |
| 是否应做任前谈话 | `should_pre_appointment_talk` | `boolean` | `null` | 否 | 否 | 否 | 否 | 否 | 以 OA 转岗流程或发文为准 |
| 是否已做任前谈话 | `has_pre_appointment_talk` | `boolean` | `null` | 否 | 否 | 否 | 否 | 否 | 三态:是、否、未填写 |
| 是否纪委书记主动约谈 | `is_discipline_secretary_interview` | `boolean` | `null` | 否 | 否 | 否 | 否 | 否 | 报送口径字段 |
| 本年度实际谈话时间 | `actual_talk_date` | `date` | `null` | 否 | 否 | 否 | 否 | 否 | 本年度实际谈话日期 |
| 谈话支持材料 | `talk_materials` | `file` | `[]` | 否 | 是 | 否 | 否 | 否 | 系统内上传谈话材料 |
### 3.2.3 廉洁党建调研记录
- **subject**: `integrity_party_research`
- **title 生成**:`调研单位 + 调研时间`
| 字段标签 | 字段别名 | 字段类型 | 默认值 | 是否主键 | 是否多值 | 是否必填 | 搜索 | 聚合 | 说明 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 序号 | `sequence_no` | `number` | `null` | 否 | 否 | 否 | 否 | 否 | 台账顺序号 |
| 调研时间 | `research_date` | `date` | `null` | 否 | 否 | 是 | 否 | 否 | 调研日期 |
| 调研人员及职务 | `research_staff_and_position` | `text` | `null` | 否 | 否 | 否 | 否 | 否 | 调研人员和职务描述 |
| 调研单位 | `research_unit` | `text` | `null` | 否 | 否 | 是 | 否 | 否 | 被调研单位 |
| 调研内容 | `research_content` | `long_text` | `null` | 否 | 否 | 否 | 否 | 否 | 调研主要内容 |
| 调研方案或调研报告 | `research_report_materials` | `file` | `[]` | 否 | 是 | 否 | 否 | 否 | 系统内上传调研方案或报告 |
| 备注 | `remarks` | `long_text` | `null` | 否 | 否 | 否 | 否 | 否 | 备注信息 |
### 3.2.4 廉洁党建专题会议记录
- **subject**: `integrity_party_meeting`
- **title 生成**:`会议议题 + 会议时间`
| 字段标签 | 字段别名 | 字段类型 | 默认值 | 是否主键 | 是否多值 | 是否必填 | 搜索 | 聚合 | 说明 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 序号 | `sequence_no` | `number` | `null` | 否 | 否 | 否 | 否 | 否 | 台账顺序号 |
| 会议时间 | `meeting_date` | `date` | `null` | 否 | 否 | 是 | 否 | 否 | 会议日期 |
| 会议议题 | `meeting_topic` | `text` | `null` | 否 | 否 | 是 | 否 | 否 | 会议议题 |
| 会议主要内容 | `main_content` | `long_text` | `null` | 否 | 否 | 否 | 否 | 否 | 会议主要内容 |
| 支持材料 | `supporting_materials` | `file` | `[]` | 否 | 是 | 否 | 否 | 否 | 系统内上传会议支持材料 |
### 3.2.5 廉洁主题活动记录
- **subject**: `integrity_party_activity`
- **title 生成**:`活动主题 + 开展年份`
| 字段标签 | 字段别名 | 字段类型 | 默认值 | 是否主键 | 是否多值 | 是否必填 | 搜索 | 聚合 | 说明 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 序号 | `sequence_no` | `number` | `null` | 否 | 否 | 否 | 否 | 否 | 台账顺序号 |
| 开展年份 | `year` | `number` | `null` | 否 | 否 | 是 | 否 | 否 | 活动开展年份 |
| 活动主题 | `activity_theme` | `text` | `null` | 否 | 否 | 是 | 否 | 否 | 活动主题 |
| 活动形式 | `activity_format` | `text` | `null` | 否 | 否 | 否 | 否 | 否 | 活动形式 |
| 活动成果 | `activity_result` | `long_text` | `null` | 否 | 否 | 否 | 否 | 否 | 活动成果描述 |
| 支持材料 | `supporting_materials` | `file` | `[]` | 否 | 是 | 否 | 否 | 否 | 系统内上传活动支持材料 |
### 3.2.6 节前廉洁提醒记录
- **subject**: `integrity_party_holiday_reminder`
- **title 生成**:`年份 + 重大节假日`
| 字段标签 | 字段别名 | 字段类型 | 默认值 | 是否主键 | 是否多值 | 是否必填 | 搜索 | 聚合 | 说明 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 年份 | `year` | `number` | `null` | 否 | 否 | 是 | 否 | 否 | 台账年份 |
| 重大节假日 | `holiday_name` | `select` | `null` | 否 | 否 | 是 | 否 | 否 | 选项:元旦、春节、清明、五一、端午、中秋、国庆、其他 |
| 其他节假日说明 | `holiday_other` | `text` | `null` | 否 | 否 | 否 | 否 | 否 | 选择其他时补充说明 |
| 廉洁谈话提纲上传 | `talk_outline_materials` | `file` | `[]` | 否 | 是 | 否 | 否 | 否 | 系统内上传谈话提纲 |
| 廉洁提醒支持材料上传 | `reminder_materials` | `file` | `[]` | 否 | 是 | 否 | 否 | 否 | 系统内上传提醒材料 |
| 其他活动举措 | `other_measures` | `long_text` | `null` | 否 | 否 | 否 | 否 | 否 | 其他举措说明 |
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