|
|
ddc06b876a
|
fix: 修复importPersonBatch方法返回类型
将Mapper接口的importPersonBatch返回类型从void改为int,
以正确返回ON DUPLICATE KEY UPDATE的影响行数。
|
2026-02-08 17:20:45 +08:00 |
|
|
|
5ec5913759
|
fix: 修复中介导入成功条数计算错误
问题:
- 导入成功条数显示为负数
- 原因:成功数量计算使用 validRecords.size() - failures.size()
- 但没有使用实际的数据库操作返回值
修复:
- saveBatchWithUpsert 和 saveBatch 方法现在返回 int
- 累加实际的数据库影响行数
- 使用 actualSuccessCount 变量跟踪真实成功数量
影响范围:
- CcdiIntermediaryPersonImportServiceImpl
- CcdiIntermediaryEntityImportServiceImpl
|
2026-02-08 17:18:18 +08:00 |
|
|
|
7d534de54f
|
refactor: 重构Service层使用ON DUPLICATE KEY UPDATE
- 更新模式直接调用importPersonBatch/importEntityBatch
- 移除'先删除再插入'逻辑,代码简化约50%
- 添加辅助方法saveBatchWithUpsert/getExistingPersonIdsFromDb
- 添加createFailureVO重载方法简化失败记录创建
变更详情:
- CcdiIntermediaryPersonImportServiceImpl: 重构importPersonAsync方法
- CcdiIntermediaryEntityImportServiceImpl: 重构importEntityAsync方法
- 两个Service均采用统一的处理模式
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-08 16:21:22 +08:00 |
|
|
|
161b2c880f
|
refactor: 优化importEntityBatch方法签名
- 修改返回值类型从void改为int,与项目其他批量方法保持一致
- 更新JavaDoc注释,描述行为而不是实现细节
- 在XML中添加importEntityBatch的完整实现
- 使用ON DUPLICATE KEY UPDATE实现存在则更新,不存在则插入的功能
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-08 16:18:30 +08:00 |
|
|
|
894e376c9e
|
docs: 补充importEntityBatch方法的JavaDoc @return标签
规范审查发现Task 3的JavaDoc注释不够完整,补充了@return标签说明无返回值。
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-08 16:13:43 +08:00 |
|
|
|
198ac91696
|
feat: 添加实体中介批量导入方法签名
添加importEntityBatch方法到Mapper接口,用于支持ON DUPLICATE KEY UPDATE的批量导入操作。
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-08 16:12:18 +08:00 |
|
|
|
de3f1abb09
|
fix: 修正importPersonBatch SQL的UPSERT逻辑
- 添加person_id字段到UPDATE部分,支持身份证号更新
- 修正gender枚举字段的空字符串判断,移除不必要的空字符串检查
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-08 16:06:36 +08:00 |
|
|
|
2f3ad08813
|
feat: 实现个人中介批量导入ON DUPLICATE KEY UPDATE SQL
使用INSERT ... ON DUPLICATE KEY UPDATE实现单次SQL完成插入或更新操作。
- 仅更新Excel中非空的字段
- 自动更新update_time和update_by
- 保留created_by和create_time等审计字段
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-08 16:03:58 +08:00 |
|
|
|
048e97e331
|
feat: 添加个人中介批量导入方法签名
添加importPersonBatch方法到Mapper接口,用于支持ON DUPLICATE KEY UPDATE的批量导入操作。
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-08 15:58:08 +08:00 |
|
|
|
5b4c1247dd
|
refactor: 统一采购交易导入接口返回值
- 添加ImportResultVO导入
- 添加数据验证(至少需要一条数据)
- 修改返回结构为ImportResultVO对象
- 与员工信息导入接口保持一致
返回值包含:
- taskId: 任务ID
- status: PROCESSING状态
- message: 提示消息
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-08 14:11:43 +08:00 |
|
|
|
e120f836b2
|
docs: 添加采购交易导入功能优化设计文档
设计目标:
- 采用后台异步处理+通知提示,避免弹窗阻塞用户操作
- 完全复用员工信息维护的导入逻辑
- 支持查看导入失败记录
- 实现状态持久化
主要设计内容:
- 整体架构和用户交互流程
- 前端组件结构和状态管理
- UI组件修改方案
- 核心方法实现(10个方法)
- 完整修改清单和测试要点
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-08 13:40:32 +08:00 |
|
|
|
f659913b2f
|
员工采购
|
2026-02-06 17:22:59 +08:00 |
|
|
|
4a560bd4e4
|
refactor: 更新采购交易导入使用专门的失败记录VO
将通用的ImportFailureVO替换为专门的PurchaseTransactionImportFailureVO,
以提供更明确的类型安全和更好的API文档。
修改文件:
- ICcdiPurchaseTransactionImportService.java: 更新接口方法返回类型
- CcdiPurchaseTransactionImportServiceImpl.java: 更新实现类使用专门的VO
- CcdiPurchaseTransactionController.java: 更新Controller使用专门的VO
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-06 16:11:30 +08:00 |
|
|
|
1aa0d15ee8
|
feat: 添加采购交易导入失败记录VO
创建 PurchaseTransactionImportFailureVO 类,用于采购交易信息批量导入时的失败记录展示。
包含字段:
- 采购事项ID、采购类别、项目名称、标的物名称
- 采购方式、预算金额
- 申请人信息(工号、姓名、部门)
- 采购申请日期、错误信息
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-06 16:08:18 +08:00 |
|
|
|
9df2b5a8e5
|
fix: 添加采购交易导入的Redis状态初始化
|
2026-02-06 15:59:08 +08:00 |
|
|
|
4ba0803622
|
feat: 添加采购交易Controller控制器
|
2026-02-06 15:51:45 +08:00 |
|
|
|
a4c21b83e9
|
feat: 添加采购交易异步导入Service实现类
|
2026-02-06 15:51:41 +08:00 |
|
|
|
a2764fd3eb
|
feat: 添加采购交易Service实现类
|
2026-02-06 15:51:38 +08:00 |
|
|
|
179901759f
|
feat: 添加采购交易异步导入Service接口
|
2026-02-06 15:51:34 +08:00 |
|
|
|
584581e720
|
feat: 添加采购交易Service接口
|
2026-02-06 15:51:29 +08:00 |
|
|
|
d9f1b5293f
|
feat: 添加采购交易Mapper XML映射文件
|
2026-02-06 15:51:00 +08:00 |
|
|
|
b0bd66da91
|
feat: 添加采购交易Mapper接口
|
2026-02-06 15:50:38 +08:00 |
|
|
|
ac3b9cd740
|
fix: 修复DTO工号验证规范问题
- 申请人工号验证从@Size改为@Pattern正则表达式
- 采购负责人工号验证从@Size改为@Pattern正则表达式
- 统一使用7位数字格式验证(^\d{7}$)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-06 15:36:05 +08:00 |
|
|
|
1d09c88bec
|
feat: 添加采购交易Excel类
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-06 15:30:56 +08:00 |
|
|
|
39032ebe63
|
feat: 添加采购交易VO类
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-06 15:30:54 +08:00 |
|
|
|
c1de614cb2
|
feat: 添加采购交易编辑DTO
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-06 15:30:51 +08:00 |
|
|
|
ad369e7789
|
feat: 添加采购交易新增DTO
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-06 15:30:49 +08:00 |
|
|
|
f80a58fa75
|
feat: 添加采购交易查询DTO
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-06 15:30:46 +08:00 |
|
|
|
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 |
|
|
|
9232a9f10f
|
feat: 实现招聘信息异步导入功能
- 添加异步导入服务接口和实现
- 创建导入失败记录VO类
- 添加导入设计文档和测试数据生成脚本
- 支持大批量招聘数据的异步处理
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-06 15:12:40 +08:00 |
|
|
|
3d4a42b9fb
|
员工异步导入
|
2026-02-06 11:19:40 +08:00 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
20bead7ddf
|
fix: 修复Controller中success方法调用,直接使用AjaxResult.success()
|
2026-02-06 09:55:30 +08:00 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
0aa812c283
|
feat: 添加导入相关VO类(ImportResultVO, ImportStatusVO, ImportFailureVO)
|
2026-02-06 09:18:31 +08:00 |
|
|
|
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 |
|
|
|
4c3eeea256
|
员工关系移除
|
2026-02-06 09:01:33 +08:00 |
|
|
|
1e691f9697
|
docs: 添加员工信息导入结果弹窗自适应优化设计文档
- 分析现有问题:弹窗内容过多时超出视口
- 设计固定高度+内容可滚动的Flexbox布局方案
- 提供完整的CSS样式和响应式设计
- 包含实施计划、验收标准和技术要点
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-05 16:09:40 +08:00 |
|
|
|
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 |
|
|
|
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 |
|
|
|
81d4038302
|
中介黑名单更新
|
2026-02-05 13:33:27 +08:00 |
|
|
|
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 |
|