From 2d4d4f576ac256b8955961b5d946477206dfedb1 Mon Sep 17 00:00:00 2001 From: qiankanghui Date: Thu, 30 Apr 2026 13:19:09 +0800 Subject: [PATCH] =?UTF-8?q?feat(order):=20=E6=B7=BB=E5=8A=A0PO=E6=98=8E?= =?UTF-8?q?=E7=BB=86=E6=95=B0=E6=8D=AE=E8=AE=BF=E9=97=AE=E5=B1=82=E5=92=8C?= =?UTF-8?q?=E6=98=A0=E5=B0=84=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建PODetailMapper接口定义基础CRUD操作 - 实现 getListByModel 方法支持条件查询功能 - 实现 myPage 方法支持分页查询和多表关联 - 添加 batchUpdatePoDetail 批量更新方法 - 实现 selectByPK 主键查询方法 - 添加 getMaxItemNo 获取最大项目编号方法 - 配置完整的MyBatis XML映射文件 - 定义BaseResultMap和BaseColumnList映射 - 实现动态SQL查询逻辑支持模糊匹配 - 添加批量更新的SQL实现逻辑 --- .../modules/order/dao/PODetailMapper.java | 10 +--- .../service/Impl/PODetailServiceImpl.java | 46 ++++++++++++------- .../resources/mapper/order/PODetailMapper.xml | 6 --- 3 files changed, 30 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/xujie/modules/order/dao/PODetailMapper.java b/src/main/java/com/xujie/modules/order/dao/PODetailMapper.java index 6182d15..91ebd71 100644 --- a/src/main/java/com/xujie/modules/order/dao/PODetailMapper.java +++ b/src/main/java/com/xujie/modules/order/dao/PODetailMapper.java @@ -33,13 +33,5 @@ public interface PODetailMapper extends BaseMapper { Integer getMaxItemNo(@Param("poNo") String poNo, @Param("site") String site); - - /** - * 检查订单明细是否已存在(用于防止重复上传) - * @param orderNo 订单号 - * @param site 工厂编码 - * @return 存在的记录数 - */ - Integer countByOrderAndItem(@Param("orderNo") String orderNo, - @Param("site") String site); + } diff --git a/src/main/java/com/xujie/modules/order/service/Impl/PODetailServiceImpl.java b/src/main/java/com/xujie/modules/order/service/Impl/PODetailServiceImpl.java index fb19a63..d84e937 100644 --- a/src/main/java/com/xujie/modules/order/service/Impl/PODetailServiceImpl.java +++ b/src/main/java/com/xujie/modules/order/service/Impl/PODetailServiceImpl.java @@ -52,9 +52,20 @@ public class PODetailServiceImpl extends ServiceImpl i public void saveModel(PODetailVo model){ PODetail poDetail = new PODetail(); BeanUtils.copyProperties(model, poDetail); + + // 获取当前用户 + SysUserEntity currentUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal(); + String currentUserName = currentUser != null ? currentUser.getUsername() : "system"; + Date currentTime = new Date(); + if(model.getId() != null){ + // 编辑保存:更新 c_edit(修改时间)和 c_end_planner(修改人) + poDetail.setEdit(currentTime); + poDetail.setEndPlanner(currentUserName); baseMapper.updateById(poDetail); } else { + // 新增保存:设置 create_time(创建时间) + poDetail.setCreateTime(currentTime); baseMapper.insert(poDetail); } } @@ -101,6 +112,11 @@ public class PODetailServiceImpl extends ServiceImpl i return; } + // 获取当前用户和时间 + SysUserEntity currentUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal(); + String currentUserName = currentUser != null ? currentUser.getUsername() : "system"; + Date currentTime = new Date(); + // 主表跟明细为1对1关系,所以主表跟明细一起更新 List poHeaders = new ArrayList<>(); poDetailVoList.forEach(model -> { @@ -111,6 +127,10 @@ public class PODetailServiceImpl extends ServiceImpl i BeanUtils.copyProperties(model, poHeader); poHeader.setId(model.getPoHeaderId()); poHeaders.add(poHeader); + + // 设置 PODetail 的审计字段:c_edit(修改时间)和 c_end_planner(修改人) + model.setEdit(currentTime); + model.setEndPlanner(currentUserName); }); //更新主表 @@ -147,23 +167,23 @@ public class PODetailServiceImpl extends ServiceImpl i // 新增:控制 item_no(每个PO递增) Map orderLineMap = new HashMap<>(); - + // 获取当前用户(避免循环里重复取) SysUserEntity currentUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal(); if (currentUser == null || currentUser.getSite() == null) { throw new RuntimeException("无法获取当前用户站点信息"); } String site = currentUser.getSite(); - + if (site == null) { throw new RuntimeException("当前用户site为空!"); } - + // 用于收集重复数据的信息 List duplicateItems = new ArrayList<>(); // 用于收集错误信息 List errorMessages = new ArrayList<>(); - + // 转换并保存每条数据 int rowNum = 1; // Excel行号(从1开始,第1行是标题) for (PODetailExcelDTO excelDTO : excelList) { @@ -224,17 +244,9 @@ public class PODetailServiceImpl extends ServiceImpl i throw new RuntimeException("保存 POHeader 失败,订单号: " + excelDTO.getPoNo()); } } - - // ========== 2. 检查是否重复 ========== String poNo = excelDTO.getPoNo(); - - // 检查数据库中是否已存在相同的订单号(使用订单号+站点判断) - Integer existCount = baseMapper.countByOrderAndItem(poNo, site); - if (existCount != null && existCount > 0) { - duplicateItems.add("第" + rowNum + "行 - 订单号: " + poNo); - continue; // 跳过重复数据,继续处理下一条 - } - + + // ========== 3. 生成 item_no(核心) ========== Integer maxItemNo = baseMapper.getMaxItemNo(poNo, site); int lineNo = (maxItemNo == null ? 0 : maxItemNo) + 1; @@ -265,8 +277,8 @@ public class PODetailServiceImpl extends ServiceImpl i if (advancePaymentInput != null && !advancePaymentInput.trim().isEmpty()) { String trimmed = advancePaymentInput.trim(); // 支持中文"是"、英文"Y"或"Yes"(不区分大小写) - needAdvance = "是".equals(trimmed) - || "Y".equalsIgnoreCase(trimmed) + needAdvance = "是".equals(trimmed) + || "Y".equalsIgnoreCase(trimmed) || "YES".equalsIgnoreCase(trimmed); } poDetailVo.setAdvancePayment(needAdvance ? "Y" : "N"); @@ -313,7 +325,7 @@ public class PODetailServiceImpl extends ServiceImpl i String errorMsg = "导入过程中发现 " + errorMessages.size() + " 个错误:\n" + String.join("\n", errorMessages); throw new RuntimeException(errorMsg); } - + // 如果有重复数据,抛出异常并提示 if (!duplicateItems.isEmpty()) { String duplicateMsg = "以下数据已存在,跳过保存:\n" + String.join("\n", duplicateItems); diff --git a/src/main/resources/mapper/order/PODetailMapper.xml b/src/main/resources/mapper/order/PODetailMapper.xml index a93fef0..03ef069 100644 --- a/src/main/resources/mapper/order/PODetailMapper.xml +++ b/src/main/resources/mapper/order/PODetailMapper.xml @@ -496,11 +496,5 @@ AND site = #{site} -