Commit Graph

79 Commits

Author SHA1 Message Date
wkc
ad369e7789 feat: 添加采购交易新增DTO
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 15:30:49 +08:00
wkc
f80a58fa75 feat: 添加采购交易查询DTO
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 15:30:46 +08:00
wkc
913e5e5dfd feat: 添加采购交易信息实体类
- 创建 CcdiPurchaseTransaction 实体类
- 使用 java.time.LocalDate 和 LocalDateTime 替代 Date
- 使用 BigDecimal 处理金额和数量字段
- 使用 @TableField 实现审计字段自动填充
- 符合若依框架和 MyBatis Plus 规范

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 15:17:05 +08:00
wkc
a2c9c14092 docs: 添加中介库异步导入功能实施计划 2026-02-06 15:13:22 +08:00
wkc
636a3a7c47 chore: 忽略Excel临时文件
- 在.gitignore中添加规则忽略Excel临时文件(~$*)
- 避免Excel打开时生成的临时文件被提交到版本控制

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 15:13:06 +08:00
wkc
9232a9f10f feat: 实现招聘信息异步导入功能
- 添加异步导入服务接口和实现
- 创建导入失败记录VO类
- 添加导入设计文档和测试数据生成脚本
- 支持大批量招聘数据的异步处理

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 15:12:40 +08:00
wkc
d83732f07c feat: 添加员工采购交易信息表
- 新建 ccdi_purchase_transaction 表,包含36个字段
- 支持采购事项全流程信息管理(申请、审批、合同、验收、结算)
- 包含供应商信息、采购方式、时间节点等关键业务字段
- 添加审计字段(create_time, update_time, created_by, updated_by)
- 添加业务索引优化查询性能:
  * idx_applicant_id: 申请人查询
  * idx_apply_date: 申请日期范围查询
  * idx_supplier_uscc: 供应商查询
  * idx_category_method: 采购类别和方式组合查询

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 15:03:38 +08:00
wkc
c8a05e3001 docs: 添加中介库异步导入功能设计文档 2026-02-06 14:46:16 +08:00
wkc
9e9733cf52 feat: 完成员工导入结果跨页面持久化功能
功能概述:
- 使用localStorage存储最近一次导入任务信息
- 支持切换菜单后查看上一次的导入失败记录
- 自动过期处理(7天)
- 完整的错误处理和用户友好的提示信息
- 新增清除历史记录功能

核心实现:
- saveImportTaskToStorage: 保存导入状态到localStorage
- getImportTaskFromStorage: 读取并验证导入状态
- clearImportTaskFromStorage: 清除localStorage数据
- restoreImportState: 页面加载时恢复导入状态
- getLastImportTooltip: 获取导入时间提示
- clearImportHistory: 用户手动清除历史记录

导入流程增强:
- handleFileSuccess: 保存初始状态,清除旧数据
- handleImportComplete: 保存完整状态,更新UI
- startImportStatusPolling: 添加5分钟超时机制

错误处理增强:
- getFailureList: 分类处理404/500/网络错误
- 404错误时自动清除localStorage并隐藏按钮
- 友好的用户提示信息

UI优化:
- lastImportInfo计算属性显示导入统计
- 失败记录按钮tooltip显示导入时间
- 失败记录对话框显示完整统计信息
- 对话框添加清除历史记录按钮

测试场景:
- 导入成功无失败后刷新页面
- 导入有失败后刷新页面
- 导入有失败后切换菜单
- 新导入覆盖旧记录
- 手动清除历史记录
- localStorage过期处理

相关提交:
- b932a7d docs: 添加员工导入结果跨页面持久化设计文档

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 13:40:39 +08:00
wkc
f22dd4f0ce feat: 添加UI优化和用户体验增强
- 新增lastImportInfo计算属性显示导入统计
- 失败记录按钮添加tooltip显示导入时间
- 失败记录对话框添加统计信息展示
- 对话框添加清除历史记录按钮

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 12:37:27 +08:00
wkc
210196437e feat: 增强失败记录查询的错误处理
- 添加404错误处理(记录过期)
- 添加500错误和500错误的友好提示
- 错误时自动清除localStorage并隐藏按钮

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 12:35:38 +08:00
wkc
989f8de19a fix: 改进导入处理逻辑的健壮性
- 添加response验证,防止taskId缺失
- 添加轮询超时机制,防止无限轮询(5分钟)
- 完善状态处理逻辑,成功时清除失败按钮

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 12:33:31 +08:00
wkc
cb12f1db70 feat: 修改导入处理逻辑以支持状态持久化
- handleFileSuccess: 清除旧数据,保存新任务初始状态
- handleImportComplete: 更新localStorage中的完整任务状态

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 12:31:17 +08:00
wkc
0c9627617c fix: 在handleImportComplete中添加状态保存逻辑
- 导入完成时保存任务状态到localStorage
- 修复getLastImportTooltip中的字段名不一致问题(saveTime)
- 确保导入状态持久化功能正常工作

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 12:26:57 +08:00
wkc
beaa59c1d3 fix: 移除restoreImportState不必要的async关键字
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 12:21:54 +08:00
wkc
8bf2792fd7 feat: 添加导入状态恢复和用户交互方法
- restoreImportState: 从localStorage恢复导入状态
- getLastImportTooltip: 获取导入时间提示信息
- clearImportHistory: 用户手动清除历史记录
- created(): 添加状态恢复调用

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 12:19:32 +08:00
wkc
3bb50077db feat: 添加localStorage工具方法用于导入状态持久化
- saveImportTaskToStorage: 保存导入任务到localStorage
- getImportTaskFromStorage: 读取并校验导入任务数据
- clearImportTaskFromStorage: 清除localStorage数据

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 12:15:30 +08:00
wkc
b932a7dba8 docs: 添加员工导入结果跨页面持久化设计文档
实现了导入状态的localStorage持久化方案:
- 支持切换菜单后查看上一次导入结果
- 仅保留最后一次导入记录
- 依赖Redis TTL自动清理过期数据
- 完整的错误处理和边界情况处理

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 12:11:42 +08:00
wkc
3d4a42b9fb 员工异步导入 2026-02-06 11:19:40 +08:00
wkc
61e8d45212 fix: 修复员工导入异步实现,实现真正的非阻塞异步
问题分析:
- Service方法同时使用@Async和CompletableFuture.supplyAsync
- Controller调用future.get()会阻塞等待
- 这不是真正的异步

修复方案:
- 移除@Async注解
- Service方法使用CompletableFuture.runAsync()异步执行doImport
- Service方法改为void返回类型,立即返回
- Controller不调用future.get(),自己构建响应
- 实现真正的异步非阻塞导入

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 10:13:03 +08:00
wkc
0b0655174a fix: 修复员工导入异步方法的实现
## 问题
- importEmployeeAsync方法在返回CompletableFuture之前同步调用了doImport()
- 方法上有@Transactional注解,会导致事务管理问题
- 不是真正的异步执行

## 解决方案
- 移除importEmployeeAsync方法上的@Transactional注解
- 使用CompletableFuture.supplyAsync()在importExecutor线程池中异步执行doImport
- 将@Transactional注解移到doImport方法上
- 注入importExecutor线程池

## 技术细节
- @Async注解会将方法提交到线程池执行
- CompletableFuture.supplyAsync()确保doImport在独立线程中执行
- 事务在doImport方法中管理,避免异步方法事务问题

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 10:06:20 +08:00
wkc
50ac577297 fix: 修复异步方法返回类型不兼容问题
将@Async方法的返回类型从String改为CompletableFuture<ImportResultVO>,
并使用CompletableFuture.completedFuture()立即返回已完成的Future,
既符合@Async的要求,又能实现立即返回的效果。

修改文件:
- ICcdiEmployeeService.java: 更新接口返回类型
- CcdiEmployeeServiceImpl.java: 使用CompletableFuture.completedFuture()
- CcdiEmployeeController.java: 调用future.get()获取结果(不会阻塞)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 09:59:30 +08:00
wkc
20bead7ddf fix: 修复Controller中success方法调用,直接使用AjaxResult.success() 2026-02-06 09:55:30 +08:00
wkc
9aee2b4cde docs: 添加员工信息导入接口文档
- 添加异步导入接口文档
- 添加导入状态查询接口文档
- 添加失败记录查询接口文档
- 说明使用流程和注意事项

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 09:53:12 +08:00
wkc
765ab7bc8d feat: 实现员工信息异步导入功能前端
- 添加导入状态查询API (getImportStatus)
- 添加导入失败记录查询API (getImportFailures)
- 实现导入状态轮询机制 (每2秒轮询一次)
- 添加轮询定时器生命周期管理 (beforeDestroy销毁)
- 添加导入完成通知功能
- 添加查看导入失败记录按钮 (有失败时显示)
- 添加失败记录对话框及分页查询功能

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 09:51:01 +08:00
wkc
db46521c8b fix: 修复异步导入方法的阻塞调用问题
## 问题描述
Controller层使用了future.get()阻塞调用,导致异步导入失去意义

## 修复内容
1. 修改ICcdiEmployeeService接口:将返回类型从CompletableFuture<ImportResultVO>改为String
2. 修改CcdiEmployeeServiceImpl:importEmployeeAsync方法立即返回taskId
3. 修改CcdiEmployeeController:移除future.get()调用,直接使用返回的taskId
4. 移除不需要的CompletableFuture导入

## 技术细节
- Service方法保持@Async注解,在独立线程池中执行
- Controller立即返回taskId给前端,不等待导入完成
- 前端可通过/importStatus/{taskId}接口查询导入进度

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 09:46:27 +08:00
wkc
d709183561 refactor: 修改员工信息导入接口为异步并添加状态查询接口
- 将importData接口改为异步调用,使用CompletableFuture
- 添加getImportStatus接口查询导入任务状态
- 添加getImportFailures接口查询导入失败记录(支持分页)
- 添加必要的导入:CompletableFuture、ImportResultVO、ImportStatusVO、ImportFailureVO
- 保持现有的权限注解@PreAuthorize和日志注解@Log

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 09:44:01 +08:00
wkc
6101d94d82 fix: 修复员工导入Service层的事务管理和批量插入性能问题
问题1: importEmployeeAsync方法缺少@Transactional注解
- 在第239行添加@Transactional注解,确保异步操作的事务一致性

问题2: saveBatch方法性能问题
- 原实现: 循环内逐条调用insert(),不是真正的批量插入
- 修复方案:
  1. 在CcdiEmployeeMapper接口中新增insertBatch方法
  2. 在CcdiEmployeeMapper.xml中实现真正的批量插入SQL
  3. saveBatch方法改为调用insertBatch,分批次批量插入

性能提升:
- 之前: 1000条数据需要1000次数据库往返
- 之后: 1000条数据只需2次数据库往返(分批次500条)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 09:41:50 +08:00
wkc
d5af1602f9 refactor: 重构validateEmployeeData方法复用逻辑
- 修改validateEmployeeData方法,增加existingIds参数支持导入场景
- 删除validateEmployeeDataForImport方法,统一使用validateEmployeeData
- 单条新增场景(existingIds=null)执行原有验证逻辑
- 导入场景(existingIds!=null)跳过柜员号唯一性检查(已在调用前批量查询)
- 保持性能优化:批量查询一次existingIds,而非每条记录单独查询

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 09:37:54 +08:00
wkc
8bdce0adbf feat: 实现员工信息异步导入Service层方法
完成功能:
- 新增异步导入方法 importEmployeeAsync,使用@Async注解实现异步处理
- 新增查询导入状态方法 getImportStatus
- 新增查询导入失败记录方法 getImportFailures
- 实现完整的导入逻辑,包括数据分类、批量操作、进度跟踪
- 使用Redis存储导入状态和失败记录,TTL设置为7天
- 支持增量更新模式,批量插入新数据,批量更新已有数据
- 实时更新导入进度到Redis

技术要点:
- 使用RedisTemplate操作Redis,Hash结构存储状态
- 使用importExecutor线程池异步执行导入任务
- 使用UUID生成唯一任务ID
- 使用CompletableFuture包装返回结果
- 批量操作提高性能(saveBatch每500条一批)
- 失败记录只保存到Redis,不保存成功记录

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 09:34:08 +08:00
wkc
e8a4b53a0e fix: 修复CcdiEmployeeMapper.xml中的remark字段问题
- 删除insertOrUpdateBatch方法中的remark字段
- 确保SQL只包含数据库中实际存在的11个字段
- ON DUPLICATE KEY UPDATE中也删除了remark字段

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 09:24:40 +08:00
wkc
97bb899093 feat: 添加员工信息批量插入或更新Mapper方法
在CcdiEmployeeMapper中新增insertOrUpdateBatch方法:
- 支持批量插入员工信息
- 使用ON DUPLICATE KEY UPDATE实现upsert功能
- 基于employee_id主键判断重复
- 插入时记录创建时间和创建人
- 更新时保留原创建信息,更新修改时间和修改人

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 09:22:06 +08:00
wkc
e00cc59eed docs: 记录员工表employee_id主键唯一性说明 2026-02-06 09:21:12 +08:00
wkc
0aa812c283 feat: 添加导入相关VO类(ImportResultVO, ImportStatusVO, ImportFailureVO) 2026-02-06 09:18:31 +08:00
wkc
ce4000f477 feat: 添加异步配置类,配置导入任务专用线程池
- 创建AsyncConfig配置类,启用Spring异步支持
- 配置importExecutor线程池:
  * 核心线程数: 2
  * 最大线程数: 5
  * 队列容量: 100
  * 线程名前缀: import-async-
  * 拒绝策略: CallerRunsPolicy
  * 优雅关闭: 等待60秒完成任务

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 09:15:14 +08:00
wkc
4c3eeea256 员工关系移除 2026-02-06 09:01:33 +08:00
wkc
8b6967bf32 fix: 修复ImportDialog模板根元素问题
- 添加div根元素包裹两个dialog组件
- 解决Vue 2 'Component template should contain exactly one root element'编译错误

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-05 16:33:33 +08:00
wkc
9aa3faf452 refactor: 抽离导入结果弹窗为通用组件并适配所有导入页面
新增组件:
- ImportResultDialog.vue: 通用导入结果弹窗组件
  * 支持HTML内容渲染
  * 60vh高度限制,内容独立滚动
  * 美化滚动条样式(6px宽度、圆角设计)
  * 提供visible、content、title等props配置

适配页面:
1. 员工信息管理页面 (ccdiEmployee)
   - 使用ImportResultDialog组件替代内嵌Dialog
   - 简化数据状态管理(importResultVisible、importResultContent)
   - 添加handleImportResultClose方法处理关闭事件

2. 员工招聘信息页面 (ccdiStaffRecruitment)
   - 使用ImportResultDialog替代$modal.msgSuccess/msgError
   - 统一导入结果展示方式
   - 支持HTML格式的错误列表展示

3. 中介黑名单导入组件 (ccdiIntermediary/ImportDialog)
   - 使用ImportResultDialog替代$msgbox
   - 保留原有的消息解析逻辑(成功/失败分类处理)
   - 移除内联样式,使用组件样式

优势:
- 统一导入结果展示样式和交互体验
- 组件复用,减少代码重复
- 便于维护和扩展(一处修改,全局生效)
- 自适应滚动,支持大量失败数据展示

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-05 16:31:01 +08:00
wkc
bb0e0b5dc9 refactor: 使用Dialog组件替代MessageBox优化导入结果弹窗
变更说明:
- 添加importResult数据状态管理弹窗显示和内容
- 创建专用Dialog组件展示导入结果,使用v-html渲染HTML
- 修改handleFileSuccess方法,使用Dialog替代$alert
- 添加Dialog专用样式,内容区域60vh高度支持独立滚动
- 美化滚动条样式(6px宽度、圆角设计、hover效果)
- 删除旧的MessageBox全局样式

修复问题:
- 解决CSS覆盖Element UI MessageBox样式不生效的问题
- 导入失败数据较多时,弹窗自适应页面高度

优势:
- 样式100%可控,无CSS优先级冲突
- Dialog组件自带良好的响应式布局
- 代码结构清晰,易于维护和扩展

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-05 16:20:53 +08:00
wkc
f3a999c6aa fix: 优化员工信息导入结果弹窗自适应布局
- 提升弹窗高度至70vh,宽度至700px,提升可读性
- 使用Flexbox布局确保标题、内容、按钮三部分结构稳定
- 添加美化的滚动条样式(6px宽度、圆角设计、hover效果)
- 内容区域使用calc精确计算高度,支持独立滚动
- 添加响应式媒体查询,适配小屏幕和移动端
- 标题和按钮区域添加分隔边框,增强视觉层次

修复问题:导入失败数据较多时,弹窗超出视口,确定按钮不可见

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-05 16:11:58 +08:00
wkc
1e691f9697 docs: 添加员工信息导入结果弹窗自适应优化设计文档
- 分析现有问题:弹窗内容过多时超出视口
- 设计固定高度+内容可滚动的Flexbox布局方案
- 提供完整的CSS样式和响应式设计
- 包含实施计划、验收标准和技术要点

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-05 16:09:40 +08:00
wkc
bed3ab5ed8 docs: 添加员工招聘信息管理功能设计文档
包含完整的数据库设计、API接口设计、批量导入优化方案和实施步骤。

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-05 14:46:12 +08:00
wkc
07dea1bf0c feat: 员工信息必填项优化 - 柜员号、所属部门、电话设为必填
## 后端修改
- AddDTO: deptId和phone添加@NotNull/@NotBlank注解
- EditDTO: deptId和phone添加@NotNull/@NotBlank注解
- Service: 导入验证添加deptId和phone必填校验

## 前端修改
- 表单校验规则: deptId和phone添加required校验
- 自动显示必填标记(红色星号)

## API文档更新
- 新增接口字段说明: deptId和phone标记为必填
- 导入模板: 标注必填项(*标记)
- 业务错误信息: 添加部门和电话相关错误提示

## 必填字段清单
1. employeeId(柜员号) - 7位数字
2. name(姓名)
3. deptId(所属部门)
4. idCard(身份证号)
5. phone(电话) - 11位手机号
6. status(状态)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-05 14:26:40 +08:00
wkc
da663fb635 feat: 员工柜员号优化 - 移除tellerNo,employeeId作为7位数字柜员号
## 数据库修改
- 删除teller_no字段
- employee_id改为非自增,手动输入7位数字
- 更新字段注释

## 后端修改
- Entity: 移除tellerNo,employeeId改为INPUT类型
- DTO: Add/Edit/Query/Excel全部使用employeeId
- VO: 移除tellerNo字段
- Service: 添加柜员号唯一性校验(使用selectById)
- Mapper XML: 移除teller_no查询和映射

## 前端修改
- 查询表单: tellerNo改为employeeId,添加7位数字限制
- 表格列: 显示employeeId作为柜员号
- 对话框: 新增可输入,编辑只读
- JavaScript: 数据结构和校验规则更新

## 文档更新
- API文档: 完整更新所有接口说明
- 实施报告: 生成详细实施报告

## 测试
- 生成测试脚本(9个测试用例)
- 测试账号: admin/admin123

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-05 14:18:28 +08:00
wkc
9c84af78f2 docs: 添加员工柜员号优化设计文档
- 移除tellerNo字段,将employeeId设置为柜员号
- 柜员号为7位数字,手动输入,唯一性校验
- 包含数据库、后端、前端、测试等完整设计方案
- 生成测试脚本和API文档更新计划
2026-02-05 14:06:35 +08:00
wkc
81d4038302 中介黑名单更新 2026-02-05 13:33:27 +08:00
wkc
1af2677c05 feat: 导入功能改为批量插入和批量更新
## 修改内容

### Mapper 接口
- CcdiBizIntermediaryMapper: 新增 insertBatch() 和 updateBatch() 方法
- CcdiEnterpriseBaseInfoMapper: 新增 insertBatch() 和 updateBatch() 方法

### Mapper XML
- 新增 CcdiBizIntermediaryMapper.xml: 实现个人中介的批量插入和更新
- 新增 CcdiEnterpriseBaseInfoMapper.xml: 实现实体中介的批量插入和更新
  - 批量插入使用 VALUES (...), (...), (...) 语法
  - 批量更新使用 foreach 分隔多条 UPDATE 语句

### Service 实现
- importIntermediaryPerson(): 改为两轮处理模式
  - 第一轮:数据验证和分类(区分插入和更新)
  - 第二轮:批量插入新记录 + 批量更新已存在记录

- importIntermediaryEntity(): 改为两轮处理模式
  - 第一轮:数据验证和分类(区分插入和更新)
  - 第二轮:批量插入新记录 + 批量更新已存在记录

## 性能优化
- 从原来的逐条插入/更新改为批量操作
- 减少数据库连接次数,提升大数据量导入性能
- 事务一致性保证,全部成功或全部回滚

编译验证:通过
2026-02-04 19:52:29 +08:00
wkc
cca2e620b5 fix: 修复intermediaryType字段访问错误
- intermediaryType字段仅存在于VO中,不应在Entity上访问
- 移除查询条件中对getIntermediaryType()的错误引用
- 修改插入方法,使用正确的字段设置:
  - 个人中介:setPersonType('中介') + setDataSource
  - 实体中介:setRiskLevel('1') + setEntSource('INTERMEDIARY') + setDataSource
- 修复位置:查询条件、新增方法、导入方法共6处

编译验证:通过
2026-02-04 19:45:05 +08:00
wkc
e0ce344d09 feat: 完成中介黑名单管理模块测试脚本、API文档、菜单配置和测试报告模板
## 新增文件

### 测试脚本 (Task 11)
- doc/scripts/test-intermediary-api.sh: 完整的API自动化测试脚本
  * 获取Token
  * 测试查询列表(含条件查询)
  * 测试新增个人/实体中介
  * 测试查询详情
  * 测试修改操作
  * 测试唯一性校验
  * 支持彩色输出和错误处理

- doc/scripts/cleanup-intermediary-test-data.sh: 测试数据清理脚本
  * 查询测试数据
  * 删除测试数据
  * 验证删除结果

- doc/scripts/run-test.bat: Windows测试脚本启动器
- doc/scripts/run-cleanup.bat: Windows清理脚本启动器

### API文档 (Task 12)
- doc/api/中介黑名单管理API文档-v2.0.md: 完整的v2.0 API接口文档
  * 14个API接口详细说明
  * 请求参数、响应格式、错误码
  * 字典数据说明
  * 业务错误信息
  * v2.0主要变更说明

### 菜单配置 (Task 13)
- sql/menu-intermediary.sql: 菜单和权限配置SQL
  * 主菜单: 中介黑名单(目录)
  * 子菜单: 中介管理(页面)
  * 按钮权限: 查询、列表、新增、修改、删除、导出、导入
  * 包含详细的注释和使用说明

### 测试报告模板 (Task 14)
- doc/test/intermediary-blacklist-test-report.md: 测试报告模板
  * 44个测试用例(列表查询、个人/实体中介、唯一性校验、删除、导入导出、权限)
  * 测试结果统计表格
  * 缺陷统计表格
  * 测试结论模板
  * 签名确认

### 文档 (Task 10)
- doc/README-中介黑名单测试部署.md: 测试与部署指南
  * 快速开始指南
  * API接口列表
  * 菜单权限说明
  * 数据字典说明
  * 常见问题解答
  * 版本历史

## 功能特性

1. **自动化测试**
   - 支持Linux/Windows环境
   - 完整的API覆盖
   - 彩色输出,易于阅读
   - 错误处理和提示

2. **完整的文档**
   - 详细的API文档
   - 清晰的测试报告模板
   - 便于复现的测试用例

3. **菜单配置**
   - 一键SQL执行
   - 完整的权限体系
   - 支持角色分配

4. **测试支持**
   - 测试数据清理
   - 测试结果验证
   - 批处理支持

## 技术亮点

- 使用jq进行JSON解析
- 支持Token自动获取
- 完整的错误处理
- 跨平台支持(Linux/Windows)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-04 19:37:17 +08:00
wkc
85d4289ba7 feat: 添加中介Controller控制器
- 新增CcdiIntermediaryController,提供中介RESTful API
- 支持个人和实体中介的统一列表查询
- 提供个人和实体中介的详情查询接口
- 支持个人和实体中介的新增、修改、删除操作
- 提供唯一性校验接口
- 支持Excel模板下载和数据导入功能
- 完整的Swagger API文档注解

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-04 19:31:55 +08:00