diff --git a/src/main/java/com/zg/project/information/controller/ConstructionTeamController.java b/src/main/java/com/zg/project/information/controller/ConstructionTeamController.java index a9f2db8..1869bc4 100644 --- a/src/main/java/com/zg/project/information/controller/ConstructionTeamController.java +++ b/src/main/java/com/zg/project/information/controller/ConstructionTeamController.java @@ -54,7 +54,7 @@ public class ConstructionTeamController extends BaseController } /** - * 导入施工队数据(全部新增,不校验重复) + * 导入施工队数据(全部新增) */ @PreAuthorize("@ss.hasPermi('information:construction:import')") @Log(title = "施工队信息", businessType = BusinessType.IMPORT) diff --git a/src/main/java/com/zg/project/information/mapper/ConstructionTeamMapper.java b/src/main/java/com/zg/project/information/mapper/ConstructionTeamMapper.java index b93ad6e..a86dfa3 100644 --- a/src/main/java/com/zg/project/information/mapper/ConstructionTeamMapper.java +++ b/src/main/java/com/zg/project/information/mapper/ConstructionTeamMapper.java @@ -2,6 +2,7 @@ package com.zg.project.information.mapper; import java.util.List; import com.zg.project.information.domain.ConstructionTeam; +import io.lettuce.core.dynamic.annotation.Param; /** * 施工队信息Mapper接口 @@ -35,6 +36,12 @@ public interface ConstructionTeamMapper */ public int insertConstructionTeam(ConstructionTeam constructionTeam); + /** + * 查询当前最大施工队编号 + */ + String selectMaxTeamCode(); + + /** * 修改施工队信息 * @@ -58,4 +65,8 @@ public interface ConstructionTeamMapper * @return 结果 */ public int deleteConstructionTeamByIds(Long[] ids); + + ConstructionTeam selectByTeamCode(@Param("teamCode") String teamCode); + + ConstructionTeam selectByTeamName(@Param("teamName") String teamName); } diff --git a/src/main/java/com/zg/project/information/service/impl/ConstructionTeamServiceImpl.java b/src/main/java/com/zg/project/information/service/impl/ConstructionTeamServiceImpl.java index 8f2ae17..21ae400 100644 --- a/src/main/java/com/zg/project/information/service/impl/ConstructionTeamServiceImpl.java +++ b/src/main/java/com/zg/project/information/service/impl/ConstructionTeamServiceImpl.java @@ -1,7 +1,9 @@ package com.zg.project.information.service.impl; import java.util.Date; +import java.util.HashSet; import java.util.List; +import java.util.Set; import com.zg.common.exception.ServiceException; import com.zg.common.utils.StringUtils; @@ -11,6 +13,8 @@ import com.zg.project.information.mapper.ConstructionTeamMapper; import com.zg.project.information.domain.ConstructionTeam; import com.zg.project.information.service.IConstructionTeamService; +import static com.zg.common.utils.SecurityUtils.getUsername; + /** * 施工队信息Service业务层处理 * @@ -56,9 +60,36 @@ public class ConstructionTeamServiceImpl implements IConstructionTeamService @Override public int insertConstructionTeam(ConstructionTeam constructionTeam) { + // 1️⃣ 自动生成施工队编号(6 位) + String teamCode = generateTeamCode(); + constructionTeam.setTeamCode(teamCode); + + // 2️⃣ 补充若依通用字段(如果你没用 BaseEntity 自动处理) + constructionTeam.setCreatedBy(getUsername()); + constructionTeam.setCreatedAt(new Date()); + constructionTeam.setIsDelete("0"); + return constructionTeamMapper.insertConstructionTeam(constructionTeam); } + /** + * 生成施工队编号(CT + 6位数字) + * 示例:CT000001 + */ + private String generateTeamCode() { + String maxCode = constructionTeamMapper.selectMaxTeamCode(); + + if (maxCode == null) { + return "CT000001"; + } + + // 取数字部分 + int num = Integer.parseInt(maxCode.substring(2)); + num++; + + return String.format("CT%06d", num); + } + /** * 修改施工队信息 * @@ -96,7 +127,7 @@ public class ConstructionTeamServiceImpl implements IConstructionTeamService } /** - * 导入施工队信息列表 + * 导入施工队信息列表(名称 / 编号 去重) * * @param teamList 导入的施工队信息列表 * @param operName 操作人员 @@ -113,54 +144,106 @@ public class ConstructionTeamServiceImpl implements IConstructionTeamService int successNum = 0; int failureNum = 0; StringBuilder failureMsg = new StringBuilder(); - Date now = new Date(); + // ===== ① Excel 内去重 ===== + Set teamCodeSet = new HashSet<>(); + Set teamNameSet = new HashSet<>(); + + for (ConstructionTeam team : teamList) + { + String teamCode = team.getTeamCode(); + String teamName = team.getTeamName(); + + if (StringUtils.isBlank(teamCode) || StringUtils.isBlank(teamName)) + { + failureNum++; + failureMsg.append("
施工队名称/编号不能为空,已跳过。"); + continue; + } + + if (!teamCodeSet.add(teamCode)) + { + failureNum++; + failureMsg.append("
施工队编号重复(Excel 内):").append(teamCode); + continue; + } + + if (!teamNameSet.add(teamName)) + { + failureNum++; + failureMsg.append("
施工队名称重复(Excel 内):").append(teamName); + continue; + } + } + + // ===== ② 数据库内去重 ===== for (ConstructionTeam team : teamList) { try { - // 可选:最低限度必填校验(建议保留,不然空行也会入库) - if (StringUtils.isBlank(team.getTeamName()) || StringUtils.isBlank(team.getTeamCode())) + // 跳过前面校验失败的数据 + if (StringUtils.isBlank(team.getTeamCode()) || StringUtils.isBlank(team.getTeamName())) { - failureNum++; - failureMsg.append("
施工队名称/编号不能为空,已跳过。"); continue; } - // 按你供应计划逻辑:不校验重复,全部新增 + // 按编号查 + ConstructionTeam existByCode = + constructionTeamMapper.selectByTeamCode(team.getTeamCode()); + if (existByCode != null) + { + failureNum++; + failureMsg.append("
施工队编号已存在:").append(team.getTeamCode()); + continue; + } + + // 按名称查 + ConstructionTeam existByName = + constructionTeamMapper.selectByTeamName(team.getTeamName()); + if (existByName != null) + { + failureNum++; + failureMsg.append("
施工队名称已存在:").append(team.getTeamName()); + continue; + } + + // ===== 新增 ===== team.setCreatedBy(operName); team.setCreatedAt(now); team.setUpdatedBy(operName); team.setUpdatedAt(now); - // isDelete 默认 0 if (StringUtils.isBlank(team.getIsDelete())) { team.setIsDelete("0"); } - // 走你现有 insert(Mapper/XML 已存在) - insertConstructionTeam(team); - + constructionTeamMapper.insertConstructionTeam(team); successNum++; + } catch (Exception e) { failureNum++; - failureMsg.append("
施工队编号:").append(team.getTeamCode()) - .append(",施工队名称:").append(team.getTeamName()) - .append(" 导入失败:").append(e.getMessage()); + failureMsg.append("
施工队编号:") + .append(team.getTeamCode()) + .append(",施工队名称:") + .append(team.getTeamName()) + .append(" 导入失败:") + .append(e.getMessage()); } } if (failureNum > 0) { - failureMsg.insert(0, "导入完成,但有 " + failureNum + " 条记录失败:"); + failureMsg.insert(0, + "导入完成,成功 " + successNum + " 条,失败 " + failureNum + " 条:"); throw new ServiceException(failureMsg.toString()); } return "导入成功,共 " + successNum + " 条数据"; } + } diff --git a/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java b/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java index 86ccccd..99dbfa3 100644 --- a/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java +++ b/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java @@ -67,11 +67,14 @@ public class RkInfoController extends BaseController return getDataTable(list); } - + /** + * 库存查询 + * @param dto + * @return + */ @PostMapping("/pageStatistics") public Map pageStatistics(@RequestBody RkInfoQueryDTO dto) { - // 分页(如果这里不需要总数,后面你可以改成 startPage(..., false)) PageHelper.startPage(dto.getPageNum(), dto.getPageSize()); List list = rkInfoService.selectAllRkInfo(dto); @@ -81,6 +84,16 @@ public class RkInfoController extends BaseController return dataInfo; } + /** + * 出入库查询 + */ + @PostMapping("/pageList") + public TableDataInfo pageList(@RequestBody RkInfoQueryDTO dto) { + PageHelper.startPage(dto.getPageNum(), dto.getPageSize()); + List list = rkInfoService.selectRkInfoPageList(dto); + return getDataTable(list); + } + /** * 单据头信息:根据入库单号查询公共字段 */ diff --git a/src/main/java/com/zg/project/wisdom/domain/RkInfo.java b/src/main/java/com/zg/project/wisdom/domain/RkInfo.java index 9ca74d6..055e749 100644 --- a/src/main/java/com/zg/project/wisdom/domain/RkInfo.java +++ b/src/main/java/com/zg/project/wisdom/domain/RkInfo.java @@ -198,6 +198,9 @@ public class RkInfo extends BaseEntity { @Excel(name = "总金额") private BigDecimal totalAmount; + @Excel(name = "备注") + private String remark; + /** 库位码(编码) */ @Excel(name = "库位码") private String pcode; @@ -238,7 +241,7 @@ public class RkInfo extends BaseEntity { @Excel(name = "出库备注") private String ckRemark; -// @Excel(name = "审核状态") + // @Excel(name = "审核状态") private String status; /** 是否移库过(0否 1是) */ @@ -457,6 +460,14 @@ public class RkInfo extends BaseEntity { public String getCkRemark() { return ckRemark; } public void setCkRemark(String ckRemark) { this.ckRemark = ckRemark; } + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } diff --git a/src/main/java/com/zg/project/wisdom/mapper/RkInfoMapper.java b/src/main/java/com/zg/project/wisdom/mapper/RkInfoMapper.java index ad1487a..fa1c915 100644 --- a/src/main/java/com/zg/project/wisdom/mapper/RkInfoMapper.java +++ b/src/main/java/com/zg/project/wisdom/mapper/RkInfoMapper.java @@ -237,6 +237,10 @@ public interface RkInfoMapper */ List selectAllRkInfo(RkInfo query); + /** + * 出入库明细分页查询(统计页面) + */ + List selectRkInfoPageList(RkInfo query); int updateBillInfo(RkInfo query); diff --git a/src/main/java/com/zg/project/wisdom/service/IRkInfoService.java b/src/main/java/com/zg/project/wisdom/service/IRkInfoService.java index 46bf731..082488c 100644 --- a/src/main/java/com/zg/project/wisdom/service/IRkInfoService.java +++ b/src/main/java/com/zg/project/wisdom/service/IRkInfoService.java @@ -173,6 +173,11 @@ public interface IRkInfoService */ List selectAllRkInfo(RkInfo query); + /** + * 出入库明细分页查询(统计页面) + */ + List selectRkInfoPageList(RkInfo query); + public int updateBillInfo(RkInfo rkInfo); /** diff --git a/src/main/java/com/zg/project/wisdom/service/impl/MoveRecordServiceImpl.java b/src/main/java/com/zg/project/wisdom/service/impl/MoveRecordServiceImpl.java index 07e69ff..8ce65d1 100644 --- a/src/main/java/com/zg/project/wisdom/service/impl/MoveRecordServiceImpl.java +++ b/src/main/java/com/zg/project/wisdom/service/impl/MoveRecordServiceImpl.java @@ -107,6 +107,11 @@ public class MoveRecordServiceImpl implements IMoveRecordService return moveRecordMapper.deleteMoveRecordById(id); } + /** + * 处理库存移库操作 + * + * @param dto 移库请求参数(包含原库存ID、移库目标列表等) + */ /** * 处理库存移库操作 * @@ -124,11 +129,6 @@ public class MoveRecordServiceImpl implements IMoveRecordService throw new ServiceException("目标位置列表不能为空"); } - // 0.1 校验每个目标库位与仓库关系 - for (MoveTargetItem target : dto.getTargets()) { - validatePcodeWarehouseRelation(target.getToPcode(), target.getToCangku()); - } - // 1. 查询原始库存记录 RkInfo original = rkInfoMapper.selectRkInfoById(dto.getFromRkId()); if (original == null || "1".equals(original.getIsDelete())) { @@ -154,69 +154,61 @@ public class MoveRecordServiceImpl implements IMoveRecordService String username = dto.getMovedBy(); Date now = DateUtils.parseDate(dto.getMovedAt()); - // ===== 情况一:整库移库(目标总数量 = 原库存,且仅一个目标)===== + // ===== 情况一:整库移库(单目标 + 数量相等)===== if (dto.getTargets().size() == 1 && totalQty.compareTo(realQty) == 0) { MoveTargetItem target = dto.getTargets().get(0); - // 记录移库前快照 - RkInfo info = new RkInfo(); - BeanUtils.copyProperties(original, info); + // 移库前快照 + RkInfo snapshot = new RkInfo(); + BeanUtils.copyProperties(original, snapshot); - // ✅ 更新原库存到新位置(统一写入 cangku) + // 更新原库存位置 original.setCangku(target.getToCangku()); original.setPcode(target.getToPcode()); original.setTrayCode(target.getToTrayCode()); - - // ✅ 发生移库就标记 original.setHasMoved("1"); original.setUpdateBy(username); original.setUpdateTime(now); rkInfoMapper.updateRkInfo(original); - // 记录移库日志(从 info → target) - moveRecordMapper.insertMoveRecord(createMoveRecord(info, target, dto)); + // 移库记录 + moveRecordMapper.insertMoveRecord( + createMoveRecord(snapshot, target, dto) + ); return; } - // ===== 情况二 & 三:需要新建多条库存记录 ===== + // ===== 情况二 / 三:拆分移库 ===== List insertList = new ArrayList<>(); - // ✅ 注意:做移库的“来源记录快照”,用于日志一致性(不受后面数量更新影响) + // 来源快照(用于日志 & 新库存模板) RkInfo fromSnapshot = new RkInfo(); BeanUtils.copyProperties(original, fromSnapshot); - // 情况三:部分移库(目标总量 < 原库存) → 原库存数量减少 + // 情况三:部分移库(原库存减少) if (totalQty.compareTo(realQty) < 0) { original.setRealQty(realQty.subtract(totalQty)); - - // ✅ 关键:发生移库就标记(你问的 has_moved 应该是 1) original.setHasMoved("1"); - original.setUpdateBy(username); original.setUpdateTime(now); rkInfoMapper.updateRkInfo(original); } else { - // 情况二:原库存刚好用完(但目标多个) → 删除原库存 + // 情况二:原库存刚好用完(但目标多个) rkInfoMapper.deleteRkInfoById(original.getId()); } - // 新增多条目标库存 + // 新增目标库存 for (MoveTargetItem target : dto.getTargets()) { RkInfo newInfo = new RkInfo(); - // ✅ 以“移库前快照”作为模板,避免被上面修改过数量影响其它字段 + // 以移库前快照为模板 BeanUtils.copyProperties(fromSnapshot, newInfo, "id"); - // ✅ 目标位置字段 newInfo.setCangku(target.getToCangku()); newInfo.setPcode(target.getToPcode()); newInfo.setTrayCode(target.getToTrayCode()); - - // ✅ 目标数量 newInfo.setRealQty(target.getRealQty()); - - // ✅ 发生移库就标记 newInfo.setHasMoved("1"); newInfo.setCreateBy(username); @@ -226,8 +218,10 @@ public class MoveRecordServiceImpl implements IMoveRecordService insertList.add(newInfo); - // ✅ 移库记录:从“移库前快照” → 每个 target(更准确) - moveRecordMapper.insertMoveRecord(createMoveRecord(fromSnapshot, target, dto)); + // 移库记录 + moveRecordMapper.insertMoveRecord( + createMoveRecord(fromSnapshot, target, dto) + ); } if (!insertList.isEmpty()) { diff --git a/src/main/java/com/zg/project/wisdom/service/impl/RkInfoServiceImpl.java b/src/main/java/com/zg/project/wisdom/service/impl/RkInfoServiceImpl.java index 621086c..e077faf 100644 --- a/src/main/java/com/zg/project/wisdom/service/impl/RkInfoServiceImpl.java +++ b/src/main/java/com/zg/project/wisdom/service/impl/RkInfoServiceImpl.java @@ -1372,6 +1372,11 @@ public class RkInfoServiceImpl implements IRkInfoService return rkInfoMapper.selectAllRkInfo(query); } + @Override + public List selectRkInfoPageList(RkInfo query) { + return rkInfoMapper.selectRkInfoPageList(query); + } + @Override public int updateBillInfo(RkInfo query) { return rkInfoMapper.updateBillInfo(query); diff --git a/src/main/resources/application-druid.yml b/src/main/resources/application-druid.yml index 3cde3ee..7a8c206 100644 --- a/src/main/resources/application-druid.yml +++ b/src/main/resources/application-druid.yml @@ -6,7 +6,7 @@ spring: druid: # 主库数据源 master: -# url: jdbc:mysql://101.132.133.142:3306/wisdom?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 +# url: jdbc:mysql://47.100.212.83:3306/wisdom?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 # url: jdbc:mysql://192.168.1.28:3306/wisdom?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 # url: jdbc:mysql://192.168.1.192:3306/wisdom?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 url: jdbc:mysql://192.168.1.251:3306/wisdom?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 diff --git a/src/main/resources/mybatis/information/ConstructionTeamMapper.xml b/src/main/resources/mybatis/information/ConstructionTeamMapper.xml index 20fa222..1295bf2 100644 --- a/src/main/resources/mybatis/information/ConstructionTeamMapper.xml +++ b/src/main/resources/mybatis/information/ConstructionTeamMapper.xml @@ -31,12 +31,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and is_delete = #{isDelete} - + + + + + insert into construction_team @@ -59,6 +75,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + update construction_team diff --git a/src/main/resources/mybatis/wisdom/RkInfoMapper.xml b/src/main/resources/mybatis/wisdom/RkInfoMapper.xml index 4006848..4f688b8 100644 --- a/src/main/resources/mybatis/wisdom/RkInfoMapper.xml +++ b/src/main/resources/mybatis/wisdom/RkInfoMapper.xml @@ -1338,6 +1338,127 @@ +