Browse Source

feat(order): 添加PO明细数据访问层和映射配置

- 创建PODetailMapper接口定义基础CRUD操作
- 实现 getListByModel 方法支持条件查询功能
- 实现 myPage 方法支持分页查询和多表关联
- 添加 batchUpdatePoDetail 批量更新方法
- 实现 selectByPK 主键查询方法
- 添加 getMaxItemNo 获取最大项目编号方法
- 配置完整的MyBatis XML映射文件
- 定义BaseResultMap和BaseColumnList映射
- 实现动态SQL查询逻辑支持模糊匹配
- 添加批量更新的SQL实现逻辑
master
qiankanghui 2 months ago
parent
commit
2d4d4f576a
  1. 10
      src/main/java/com/xujie/modules/order/dao/PODetailMapper.java
  2. 46
      src/main/java/com/xujie/modules/order/service/Impl/PODetailServiceImpl.java
  3. 6
      src/main/resources/mapper/order/PODetailMapper.xml

10
src/main/java/com/xujie/modules/order/dao/PODetailMapper.java

@ -33,13 +33,5 @@ public interface PODetailMapper extends BaseMapper<PODetail> {
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);
}

46
src/main/java/com/xujie/modules/order/service/Impl/PODetailServiceImpl.java

@ -52,9 +52,20 @@ public class PODetailServiceImpl extends ServiceImpl<PODetailMapper, PODetail> 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<PODetailMapper, PODetail> i
return;
}
// 获取当前用户和时间
SysUserEntity currentUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
String currentUserName = currentUser != null ? currentUser.getUsername() : "system";
Date currentTime = new Date();
// 主表跟明细为1对1关系所以主表跟明细一起更新
List<POHeader> poHeaders = new ArrayList<>();
poDetailVoList.forEach(model -> {
@ -111,6 +127,10 @@ public class PODetailServiceImpl extends ServiceImpl<PODetailMapper, PODetail> 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<PODetailMapper, PODetail> i
// 新增:控制 item_no(每个PO递增)
Map<String, Integer> 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<String> duplicateItems = new ArrayList<>();
// 用于收集错误信息
List<String> errorMessages = new ArrayList<>();
// 转换并保存每条数据
int rowNum = 1; // Excel行号从1开始第1行是标题
for (PODetailExcelDTO excelDTO : excelList) {
@ -224,17 +244,9 @@ public class PODetailServiceImpl extends ServiceImpl<PODetailMapper, PODetail> 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<PODetailMapper, PODetail> 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<PODetailMapper, PODetail> i
String errorMsg = "导入过程中发现 " + errorMessages.size() + " 个错误:\n" + String.join("\n", errorMessages);
throw new RuntimeException(errorMsg);
}
// 如果有重复数据抛出异常并提示
if (!duplicateItems.isEmpty()) {
String duplicateMsg = "以下数据已存在,跳过保存:\n" + String.join("\n", duplicateItems);

6
src/main/resources/mapper/order/PODetailMapper.xml

@ -496,11 +496,5 @@
AND site = #{site}
</select>
<select id="countByOrderAndItem" resultType="java.lang.Integer">
SELECT COUNT(1)
FROM PODetail
WHERE order_no = #{orderNo}
AND site = #{site}
</select>
</mapper>
Loading…
Cancel
Save