铜陵经侦
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.

497 lines
24 KiB

1 month ago
# 经侦案件智慧管理系统 — 迁移至框架方案文档
> **源项目**: `jingzhen-case-mgmt/frontend`(Vue3 + Element Plus,独立开发)
> **目标前端**: `economic-crime-web`(Vue3 + Ant Design Vue 4 + Vite5,1024框架)
> **目标后端**: `economic-crime-api`(Spring Boot 3 + MyBatis-Plus + Sa-Token)
>
> **原则**: 样式参考 jingzhen-case-mgmt 设计风格,开发规范遵循 economic-crime 框架,使用多态/字典/枚举不硬编码
---
## 一、技术栈对比与迁移要点
| 维度 | jingzhen-case-mgmt(源) | economic-crime-web(目标框架) | 迁移动作 |
|------|--------------------------|-------------------------------|---------|
| 构建工具 | Vue CLI 5 | **Vite 5** | 重写构建配置 |
| UI组件库 | **Element Plus 2.4** | **Ant Design Vue 4.2** | 全部组件替换 |
| CSS方案 | scoped CSS | **Less** + 主题变量 | 样式重写为Less |
| 状态管理 | 无(reactive局部) | **Pinia** | 需按需建立store |
| 路由 | 静态定义 index.js | **后端菜单动态生成** `buildRoutes()` | 不需要手写路由,通过后台配置菜单 |
| HTTP封装 | 自定义axios.js | **smartAxios**(getRequest/postRequest) | 替换API调用方式 |
| 权限控制 | 无 | **v-privilege指令** + Sa-Token | 按权限码控制按钮显隐 |
| 字典/枚举 | 硬编码switch/case | **DictSelect / SmartEnumSelect 组件** | 改用字典枚举系统 |
| 表格 | el-table | **a-table** + smart-table-column | 框架标准表格模式 |
| 表单弹窗 | el-dialog | **a-modal / a-drawer** | 框架标准表单弹窗模式 |
| 文件上传 | el-upload | **FileUpload 组件**(已封装) | 复用框架组件 |
### 关键差异说明
1. **UI组件完全不同**: Element Plus → Ant Design Vue,所有 `<el-*>` 标签需改为 `<a-*>`
2. **路由机制不同**: 框架通过后端 `t_menu` 表动态生成路由,页面放在 `views/` 对应路径即可
3. **API调用规范**: 框架统一使用 `postRequest(url, data)` / `getRequest(url, params)` ,返回 `{code:1, data, msg}`
4. **数据字典**: 框架有完整的字典服务,前端用 `DictSelect` 组件绑定 `dict-code`
---
## 二、数据库建表清单(需要用户执行)
以下所有表使用框架统一的字段约定:
- `id` BIGINT AUTO_INCREMENT PRIMARY KEY
- `create_user_id` BIGINT 创建人
- `create_time` DATETIME 创建时间
- `update_user_id` BIGINT 更新人
- `update_time` DATETIME 更新时间
- `deleted_flag` TINYINT(1) DEFAULT 0 逻辑删除(0=正常,1=删除)
### 2.1 警情主表 `t_alarm_report`
```sql
CREATE TABLE t_alarm_report (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
report_no VARCHAR(32) NOT NULL COMMENT '警情编号(JJ+年月日+9位序号)',
alarm_time DATETIME NOT NULL COMMENT '报警时间',
receiver VARCHAR(50) DEFAULT NULL COMMENT '接警员',
alarm_source VARCHAR(20) NOT NULL COMMENT '警情来源(self=自接警,110=110接警,on-site=现场报案,transfer=移送案件,letter=信访转办,superior=上级交办,other=其他)',
case_type_code VARCHAR(10) DEFAULT NULL COMMENT '经侦77类案件类型编码(01~77)',
alarm_level VARCHAR(20) DEFAULT NULL COMMENT '警情级别(general/important/urgent/major/serious)',
incident_address VARCHAR(500) NOT NULL COMMENT '事发地址',
jurisdiction_unit VARCHAR(100)DEFAULT NULL COMMENT '管辖单位',
push_unit VARCHAR(200) DEFAULT NULL COMMENT '推送单位(三案合一)',
main_content TEXT DEFAULT NULL COMMENT '主要情节',
bottom_remark TEXT DEFAULT NULL COMMENT '附带备注情况',
is_first_alarm TINYINT(1) DEFAULT 0 COMMENT '是否首次报警(0=否,1=是)',
original_alarm_id BIGINT DEFAULT NULL COMMENT '首次报警关联的原警情ID',
status VARCHAR(20) DEFAULT 'pending' COMMENT '状态(pending待审核/reviewing审核中/approved已通过/rejected已退回/transferred已流转)',
source_system VARCHAR(30) DEFAULT NULL COMMENT '来源系统(110抽取警情等)',
alarm_no_110 VARCHAR(32) DEFAULT NULL COMMENT '110接警号(110抽取时填写)',
-- 报案人信息
reporter_name VARCHAR(50) DEFAULT NULL COMMENT '报案人姓名',
reporter_gender CHAR(1) DEFAULT NULL COMMENT '性别(M/F)',
reporter_id_card VARCHAR(18) DEFAULT NULL COMMENT '证件号码',
reporter_phone VARCHAR(20) DEFAULT NULL COMMENT '联系电话',
reporter_address VARCHAR(500) DEFAULT NULL COMMENT '联系地址',
is_enterprise TINYINT(1) DEFAULT 0 COMMENT '是否涉企(0=否,1=是)',
enterprise_name VARCHAR(200) DEFAULT NULL COMMENT '报案单位(涉企时)',
enterprise_reg_addr VARCHAR(500) DEFAULT NULL COMMENT '企业注册地',
enterprise_biz_addr VARCHAR(500) DEFAULT NULL COMMENT '企业实际经营地',
-- 受理意见
evidence_complete TINYINT(1) DEFAULT 0 COMMENT '证据材料是否齐全(0=否,1=是)',
preliminary_opinion TEXT DEFAULT NULL COMMENT '初步意见',
create_user_id BIGINT DEFAULT NULL,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_user_id BIGINT DEFAULT NULL,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_flag TINYINT(1) DEFAULT 0,
PRIMARY KEY (id),
UNIQUE KEY uk_report_no (report_no),
KEY idx_status (status),
KEY idx_case_type (case_type_code),
KEY idx_reporter_idcard (reporter_id_card),
KEY idx_alarm_time (alarm_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='警情登记主表';
```
### 2.2 被控告/举报人表 `t_alarm_suspect`
```sql
CREATE TABLE t_alarm_suspect (
id BIGINT NOT NULL AUTO_INCREMENT,
alarm_id BIGINT NOT NULL COMMENT '关联警情ID(t_alarm_report.id)',
name VARCHAR(50) NOT NULL COMMENT '姓名',
id_card VARCHAR(18) DEFAULT NULL COMMENT '证件号码',
phone VARCHAR(20) DEFAULT NULL COMMENT '电话号码',
company VARCHAR(200) DEFAULT NULL COMMENT '单位名称',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_flag TINYINT(1) DEFAULT 0,
PRIMARY KEY (id),
KEY idx_alarm_id (alarm_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='被控告举报人表';
```
### 2.3 证据材料表 `t_evidence_material`
```sql
CREATE TABLE t_evidence_material (
id BIGINT NOT NULL AUTO_INCREMENT,
alarm_id BIGINT NOT NULL COMMENT '关联警情ID',
serial_no INT DEFAULT NULL COMMENT '序号',
evidence_name VARCHAR(200) NOT NULL COMMENT '证据名称',
evidence_type VARCHAR(20) NOT NULL COMMENT '证据类型(document=书证,physical=物证,audiovisual=视听,electronic=电子,appraisal=鉴定,investigation=勘验,other=其他)',
quantity INT DEFAULT 1 COMMENT '数量',
unit VARCHAR(20) DEFAULT '份' COMMENT '单位',
description VARCHAR(500) DEFAULT NULL COMMENT '描述',
collect_time DATETIME DEFAULT NULL COMMENT '收集时间',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_flag TINYINT(1) DEFAULT 0,
PRIMARY KEY (id),
KEY idx_alarm_id (alarm_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='证据材料表';
```
### 2.4 证据附件表 `t_evidence_file`
```sql
CREATE TABLE t_evidence_file (
id BIGINT NOT NULL AUTO_INCREMENT,
evidence_id BIGINT NOT NULL COMMENT '关联证据ID(t_evidence_material.id)',
file_name VARCHAR(255) NOT NULL COMMENT '文件名',
file_size BIGINT DEFAULT NULL COMMENT '文件大小(bytes)',
file_type VARCHAR(20) DEFAULT NULL COMMENT '文件类型(image/document/audio/video/other)',
file_url VARCHAR(500) NOT NULL COMMENT '文件存储路径/OSS地址',
upload_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
deleted_flag TINYINT(1) DEFAULT 0,
PRIMARY KEY (id),
KEY idx_evidence_id (evidence_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='证据附件表';
```
### 2.5 警情表单级附件表 `t_alarm_attachment`
```sql
CREATE TABLE t_alarm_attachment (
id BIGINT NOT NULL AUTO_INCREMENT,
alarm_id BIGINT NOT NULL COMMENT '关联警情ID',
name VARCHAR(255) NOT NULL COMMENT '材料名称',
upload_time DATETIME DEFAULT NULL COMMENT '上传时间',
quantity INT DEFAULT 1 COMMENT '数量',
file_url VARCHAR(500) DEFAULT NULL COMMENT '文件URL',
file_size BIGINT DEFAULT NULL COMMENT '文件大小',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
deleted_flag TINYINT(1) DEFAULT 0,
PRIMARY KEY (id),
KEY idx_alarm_id (alarm_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='警情表单级附件表';
```
### 2.6 数据字典初始化(在 `t_dict_data` 和 `t_dict` 表中插入)
框架字典需要先在管理后台「系统管理→字典管理」中添加,或直接SQL插入:
```sql
-- ===== 字典类型 (t_dict) =====
INSERT INTO t_dict (dict_name, dict_code, remark, deleted_flag, create_user_id, create_time)
VALUES
('经侦77类案件类型', 'CASE_TYPE_77', '经侦类经济犯罪案件77种分类', 0, 1, NOW()),
('警情级别', 'ALARM_LEVEL', '警情等级划分', 0, 1, NOW()),
('警情来源', 'ALARM_SOURCE', '警情来源渠道', 0, 1, NOW()),
('证据类型', 'EVIDENCE_TYPE', '证据材料类型', 0, 1, NOW()),
('警情状态', 'ALARM_STATUS', '警情处理状态', 0, 1, NOW()),
('性别', 'GENDER', '性别', 0, 1, NOW());
-- ===== 经侦77类案件类型字典值 (t_dict_data) =====
-- 以下为示例,完整77项见下方补充列表
INSERT INTO t_dict_data (dict_code, value, label, sort, deleted_flag) VALUES
('CASE_TYPE_77', '01', '假币', 1, 0),
('CASE_TYPE_77', '02', '持有、使用假币', 2, 0),
('CASE_TYPE_77', '03', '金融工作人员购买假币、以假币换取货币', 3, 0),
('CASE_TYPE_77', '04', '出售、购买、运输假币', 4, 0),
('CASE_TYPE_77', '05', '变造货币', 5, 0),
('CASE_TYPE_77', '06', '伪造货币', 6, 0),
('CASE_TYPE_77', '07', '非法吸收公众存款', 7, 0),
('CASE_TYPE_77', '08', '集资诈骗', 8, 0),
('CASE_TYPE_77', '09', '贷款诈骗', 9, 0),
('CASE_TYPE_77', '10', '票据诈骗', 10, 0),
-- ... 完整77项按此格式继续到 77
('CASE_TYPE_77', '19', '非法经营', 19, 0),
('CASE_TYPE_77', '20', '合同诈骗', 20, 0),
('CASE_TYPE_77', '21', '职务侵占', 21, 0),
('CASE_TYPE_77', '22', '挪用资金', 22, 0),
('CASE_TYPE_77', '44', '虚开增值税专用发票', 44, 0),
('CASE_TYPE_77', '77', '其他经济犯罪', 77, 0);
-- ===== 警情级别 =====
INSERT INTO t_dict_data (dict_code, value, label, sort, deleted_flag) VALUES
('ALARM_LEVEL', 'general', '一般警情', 1, 0),
('ALARM_LEVEL', 'important', '重要警情', 2, 0),
('ALARM_LEVEL', 'urgent', '紧急警情', 3, 0),
('ALARM_LEVEL', 'major', '重大警情', 4, 0),
('ALARM_LEVEL', 'serious', '严重警情', 5, 0);
-- ===== 警情来源 =====
INSERT INTO t_dict_data (dict_code, value, label, sort, deleted_flag) VALUES
('ALARM_SOURCE', 'self', '自接警', 1, 0),
('ALARM_SOURCE', '110', '110接警', 2, 0),
('ALARM_SOURCE', 'on-site', '现场报案', 3, 0),
('ALARM_SOURCE', 'transfer', '移送案件', 4, 0),
('ALARM_SOURCE', 'letter', '信访转办', 5, 0),
('ALARM_SOURCE', 'superior', '上级交办', 6, 0),
('ALARM_SOURCE', 'other', '其他', 7, 0);
-- ===== 证据类型 =====
INSERT INTO t_dict_data (dict_code, value, label, sort, deleted_flag) VALUES
('EVIDENCE_TYPE', 'document', '书证', 1, 0),
('EVIDENCE_TYPE', 'physical', '物证', 2, 0),
('EVIDENCE_TYPE', 'audiovisual', '视听资料', 3, 0),
('EVIDENCE_TYPE', 'electronic', '电子数据', 4, 0),
('EVIDENCE_TYPE', 'appraisal', '鉴定意见', 5, 0),
('EVIDENCE_TYPE', 'investigation', '勘验笔录', 6, 0),
('EVIDENCE_TYPE', 'other', '其他', 7, 0);
-- ===== 警情状态 =====
INSERT INTO t_dict_data (dict_code, value, label, sort, deleted_flag) VALUES
('ALARM_STATUS', 'pending', '待审核', 1, 0),
('ALARM_STATUS', 'reviewing', '审核中', 2, 0),
('ALARM_STATUS', 'approved', '已通过', 3, 0),
('ALARM_STATUS', 'rejected', '已退回', 4, 0),
('ALARM_STATUS', 'transferred', '已流转', 5, 0);
```
---
## 三、后端代码结构(economic-crime-api)
按照框架 `module/business/goods` 的标准分层结构,在 `economic-crime-admin` 下新建模块:
```
economic-crime-admin/src/main/java/net/lab1024/sa/admin/module/
└── business/
└── alarm/ # 接报案中心模块
├── controller/
│ └── AlarmReportController.java # 警情CRUD接口
├── service/
│ ├── AlarmReportService.java # 业务逻辑
│ └── AlarmReportQueryService.java # 查询服务(关联查询用)
├── domain/
│ ├── entity/
│ │ ├── AlarmReportEntity.java # 警情实体
│ │ ├── AlarmSuspectEntity.java # 嫌疑人实体
│ │ ├── EvidenceMaterialEntity.java # 证据实体
│ │ ├── EvidenceFileEntity.java # 证据附件实体
│ │ └── AlarmAttachmentEntity.java # 表单附件实体
│ ├── form/
│ │ ├── AlarmAddForm.java # 新增表单DTO
│ │ ├── AlarmUpdateForm.java # 更新表单DTO
│ │ ├── AlarmQueryForm.java # 查询条件DTO
│ │ └── AlarmExtractForm.java # 110抽取表单DTO
│ └── vo/
│ ├── AlarmReportVO.java # 列表VO
│ └── AlarmDetailVO.java # 详情VO(含嫌疑人/证据嵌套)
├── dao/
│ ├── AlarmReportDao.java # Mapper接口
│ ├── AlarmSuspectDao.java
│ ├── EvidenceMaterialDao.java
│ ├── EvidenceFileDao.java
│ └── AlarmAttachmentDao.java
└── constant/
└── AlarmStatusEnum.java # 状态枚举(如需)
```
### 后端接口设计(RESTful)
| 方法 | 路径 | 功能 | 权限码 |
|------|------|------|--------|
| POST | `/alarm-report/query` | 分页查询警情列表 | `alarm:query` |
| POST | `/alarm-report/add` | 新增警情登记 | `alarm:add` |
| POST | `/alarm-report/update` | 更新警情信息 | `alarm:update` |
| GET | `/alarm-report/delete/{id}` | 删除警情 | `alarm:delete` |
| GET | `/alarm-report/detail/{id}` | 警情详情(含子表) | `alarm:detail` |
| POST | `/alarm-report/audit` | 审核警情 | `alarm:audit` |
| POST | `/alarm-report/extract-110` | 110警情抽取 | `alarm:extract` |
| POST | `/alarm-report/history-query` | 首次报警历史查询 | `alarm:query` |
| GET | `/evidence-material/list/{alarmId}` | 证据材料列表 | `evidence:query` |
| POST | `/evidence-material/add` | 新增证据 | `evidence:add` |
| POST | `/evidence-material/update` | 更新证据 | `evidence:update` |
| GET | `/evidence-material/delete/{id}` | 删除证据 | `evidence:delete` |
| POST | `/suspect/add` | 新增嫌疑人 | `suspect:add` |
| GET | `/suspect/delete/{id}` | 删除嫌疑人 | `suspect:delete` |
### 后端开发规范要点
1. **统一返回**: 所有接口返回 `ResponseDTO<T>`,成功 `code=1`
2. **分页**: 使用 `PageResult<T>`,前端传 `pageNum/pageSize`
3. **校验**: Form对象使用 `@Valid` + JSR303注解
4. **权限**: `@SaCheckPermission("alarm:query")` 注解
5. **日志**: 使用 `@Slf4j` + `log.info/error`
6. **拷贝**: 使用框架的 `SmartBeanUtil.copy()`
7. **分页工具**: 使用 `SmartPageUtil.convert2PageQuery()`
8. **操作记录**: 关键操作调用 `DataTracerService`
---
## 四、前端代码结构(economic-crime-web)
按照框架 `views/business/` 的目录规范:
```
economic-crime-web/src/
├── api/
│ └── business/
│ └── alarm/ # 接报案中心API
│ └── alarm-report-api.js # 接口定义
├── constants/
│ └── business/
│ └── alarm/
│ └── alarm-const.js # 枚举/常量定义
├── views/
│ └── business/
│ └── alarm/ # 接报案中心页面
│ ├── alarm-reception-list.vue # 接报案大厅(列表页)
│ ├── components/
│ │ ├── type-select-modal.vue # 登记类型选择弹窗
│ │ ├── non-economic-form.vue # 非经侦类登记表单
│ │ ├── pending-review-form.vue # 待审核(经侦类)登记表单
│ │ ├── view-detail-drawer.vue # 查看详情抽屉
│ │ ├── audit-modal.vue # 审核弹窗
│ │ ├── evidence-modal.vue # 证据材料清单弹窗
│ │ ├── evidence-preview-modal.vue# 材料预览弹窗
│ │ └── evidence-form-modal.vue # 证据新增/编辑弹窗
│ ├── alarm-extract-list.vue # 数据互通/110抽取
│ └── ...
```
### 前端API定义示例(alarm-report-api.js)
```javascript
/*
* 接报案中心 - 警情管理接口
*/
import { postRequest, getRequest } from '/@/lib/axios';
export const alarmReportApi = {
// 分页查询
queryList: (param) => postRequest('/alarm-report/query', param),
// 新增
add: (param) => postRequest('/alarm-report/add', param),
// 更新
update: (param) => postRequest('/alarm-report/update', param),
// 删除
delete: (id) => getRequest(`/alarm-report/delete/${id}`),
// 详情
detail: (id) => getRequest(`/alarm-report/detail/${id}`),
// 审核
audit: (param) => postRequest('/alarm-report/audit', param),
// 110抽取
extract110: (param) => postRequest('/alarm-report/extract-110', param),
// 历史查询(首次报警)
historyQuery: (keyword) => getRequest('/alarm-report/history-query', { keyword }),
// === 证据材料 ===
queryEvidence: (alarmId) => getRequest(`/evidence-material/list/${alarmId}`),
addEvidence: (param) => postRequest('/evidence-material/add', param),
updateEvidence: (param) => postRequest('/evidence-material/update', param),
deleteEvidence: (id) => getRequest(`/evidence-material/delete/${id}`),
// === 嫌疑人 ===
addSuspect: (param) => postRequest('/suspect/add', param),
deleteSuspect: (id) => getRequest(`/suspect/delete/${id}`),
};
```
### 前端页面组件模式(遵循框架规范)
每个业务模块的标准模式:
- **列表页**: `a-form`(查询区) + `a-table`(表格区) + `a-modal/a-drawer`(表单弹窗)
- **表单弹窗**: 独立组件,`defineEmits(['reloadList'])` 通知父组件刷新
- **权限控制**: `v-privilege="'alarm:add'"` 控制按钮
- **字典使用**: `<DictSelect :dict-code="DICT_CODE_ENUM.ALARM_LEVEL" v-model:value="form.alarmLevel" />`
- **枚举使用**: `<SmartEnumSelect enum-name="ALARM_STATUS_ENUM" v-model:value="form.status" />`
- **文件上传**: `<FileUpload v-model:value="form.fileIds" />` (框架已封装)
### Element Plus → Ant Design Vue 组件映射
| Element Plus | Ant Design Vue | 说明 |
|-------------|----------------|------|
| `el-form` | `a-form` | model→model, rules→rules |
| `el-form-item` | `a-form-item` | label→label, prop→name |
| `el-input` | `a-input` | v-model→v-model:value |
| `el-select` | `a-select` | el-option→a-select-option |
| `el-radio-group` | `a-radio-group` | el-radio→a-radio, :value→:value |
| `el-date-picker` | `a-date-picker` | format/valueFormat保持 |
| `el-table` | `a-table` | :data→:dataSource, el-table-column→a-table-column |
| `el-dialog` | `a-modal` | v-model→:open, title→title |
| `el-button` | `a-button` | type保持(primary/danger等) |
| `el-tag` | `a-tag` | color映射调整 |
| `el-pagination` | `a-pagination` | 属性名基本一致 |
| `el-upload` | `FileUpload`组件 | 用框架封装组件替代 |
| `ElMessage` | `message` from ant-design-vue | message.success/error/warning |
| `ElMessageBox` | `Modal` from ant-design-vue | Modal.confirm/info |
---
## 五、菜单配置(需要在后台添加)
框架的路由由后端 `t_menu` 表驱动。需要在系统管理→菜单管理中添加以下菜单结构:
```
接报案中心 (menuId: 自增, path: business/alarm/alarm-reception-list)
├── 接报案大厅 path: business/alarm/alarm-reception-list component: /business/alarm/alarm-reception-list.vue
├── 数据互通 path: business/alarm/alarm-extract-list component: /business/alarm/alarm-extract-list.vue
├── 审核监督 path: business/alarm/alarm-audit-list component: /business/alarm/alarm-audit-list.vue (待开发)
├── 材料预览 path: business/alarm/material-view component: /business/alarm/material-view.vue (待开发)
└── 视频监控 path: business/alarm/center-monitor component: /business/alarm/center-monitor.vue (待开发)
案件管理 (已有或新建)
├── 案件监督 path: ...
├── 执法考评 path: ...
├── 两书一单 path: ...
├── 风险预警 path: ...
├── 涉企案件 path: ...
├── 领办包保 path: ...
└── 卷宗管理 path: ...
涉案资金
├── 资金管理 path: ...
├── 资金分析 path: ...
└── 金析为证 path: ...
涉案财物
└── 财物管理 path: ...
审议流程
├── 一般审议 path: ...
├── 监督督办 path: ...
├── 审核意见 path: ...
├── 审核组配置 path: ...
└── 流程列表 path: ...
数据大屏
└── 综合数据大屏 path: business/alarm/data-bigscreen component: /business/alarm/data-bigscreen.vue
```
---
## 六、迁移执行顺序建议
### 第一阶段:基础搭建(后端优先)
1. **建表** — 执行第二节的6张DDL + 字典初始化SQL
2. **后端Entity** — 5个实体类 + MyBatis-Plus注解
3. **后端Form/VO** — AddForm/UpdateForm/QueryForm/VO
4. **后端DAO/Mapper** — 接口 + XML
5. **后端Service** — CRUD + 逻辑
6. **后端Controller** — RESTful接口 + 权限注解
### 第二阶段:前端核心页面
7. **API层** — alarm-report-api.js
8. **常量/枚举** — alarm-const.js
9. **接报案大厅列表页** — alarm-reception-list.vue(最核心,包含所有弹窗组件)
10. **110数据互通页** — alarm-extract-list.vue
### 第三阶段:完善功能
11. **审核监督页** — 审核流程
12. **材料预览页** — 文件预览
13. **视频监控页** — 视频接入
14. **数据大屏页** — ECharts可视化
### 第四阶段:其他业务模块
15-29. 按同样模式迁移:案件管理/涉案资金/涉案财物/审议流程 各子页面
---
## 七、注意事项
1. **不要修改 jingzhen-case-mgmt** — 它作为样式参考保留
2. **样式复用策略** — 将jingzhen-case-mgmt中的CSS设计语言(渐变色值、圆角、阴影、间距)提取为 Less 变量写入框架主题
3. **多态实现** — 案件类型77种用字典驱动,不用硬编码switch;状态流转用枚举约束
4. **文件存储** — 复用框架已有的 FileController 上传接口,存取文件URL
5. **权限粒度** — 每个操作按钮配独立权限码,方便后台灵活配置