|
|
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 |
|
|
|
a2c9c14092
|
docs: 添加中介库异步导入功能实施计划
|
2026-02-06 15:13:22 +08:00 |
|
|
|
636a3a7c47
|
chore: 忽略Excel临时文件
- 在.gitignore中添加规则忽略Excel临时文件(~$*)
- 避免Excel打开时生成的临时文件被提交到版本控制
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-06 15:13:06 +08:00 |
|
|
|
9232a9f10f
|
feat: 实现招聘信息异步导入功能
- 添加异步导入服务接口和实现
- 创建导入失败记录VO类
- 添加导入设计文档和测试数据生成脚本
- 支持大批量招聘数据的异步处理
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-06 15:12:40 +08:00 |
|
|
|
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 |
|
|
|
c8a05e3001
|
docs: 添加中介库异步导入功能设计文档
|
2026-02-06 14:46:16 +08:00 |
|
|
|
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 |
|
|
|
f22dd4f0ce
|
feat: 添加UI优化和用户体验增强
- 新增lastImportInfo计算属性显示导入统计
- 失败记录按钮添加tooltip显示导入时间
- 失败记录对话框添加统计信息展示
- 对话框添加清除历史记录按钮
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-06 12:37:27 +08:00 |
|
|
|
210196437e
|
feat: 增强失败记录查询的错误处理
- 添加404错误处理(记录过期)
- 添加500错误和500错误的友好提示
- 错误时自动清除localStorage并隐藏按钮
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-06 12:35:38 +08:00 |
|
|
|
989f8de19a
|
fix: 改进导入处理逻辑的健壮性
- 添加response验证,防止taskId缺失
- 添加轮询超时机制,防止无限轮询(5分钟)
- 完善状态处理逻辑,成功时清除失败按钮
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-06 12:33:31 +08:00 |
|
|
|
cb12f1db70
|
feat: 修改导入处理逻辑以支持状态持久化
- handleFileSuccess: 清除旧数据,保存新任务初始状态
- handleImportComplete: 更新localStorage中的完整任务状态
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-06 12:31:17 +08:00 |
|
|
|
0c9627617c
|
fix: 在handleImportComplete中添加状态保存逻辑
- 导入完成时保存任务状态到localStorage
- 修复getLastImportTooltip中的字段名不一致问题(saveTime)
- 确保导入状态持久化功能正常工作
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-06 12:26:57 +08:00 |
|
|
|
beaa59c1d3
|
fix: 移除restoreImportState不必要的async关键字
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-06 12:21:54 +08:00 |
|
|
|
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 |
|
|
|
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 |
|
|
|
b932a7dba8
|
docs: 添加员工导入结果跨页面持久化设计文档
实现了导入状态的localStorage持久化方案:
- 支持切换菜单后查看上一次导入结果
- 仅保留最后一次导入记录
- 依赖Redis TTL自动清理过期数据
- 完整的错误处理和边界情况处理
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-06 12:11:42 +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 |
|
|
|
9aee2b4cde
|
docs: 添加员工信息导入接口文档
- 添加异步导入接口文档
- 添加导入状态查询接口文档
- 添加失败记录查询接口文档
- 说明使用流程和注意事项
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
2026-02-06 09:53:12 +08:00 |
|
|
|
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 |
|
|
|
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 |
|
|
|
e00cc59eed
|
docs: 记录员工表employee_id主键唯一性说明
|
2026-02-06 09:21:12 +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 |
|
|
|
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 |
|