Commit 3ec0fc4152f0b2bde2bc7454b9bed1702378fd51

Authored by YunaiV
1 parent e2613a57

✨ feat(mes): 优化排班日历查询逻辑,支持批量班组查询

重构排班日历查询功能,简化代码实现,支持一次性查询多个班组的排班记录。
新增班组编号集合字段,提升查询效率和可读性。
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/cal/calendar/MesCalCalendarController.java
@@ -161,14 +161,11 @@ public class MesCalCalendarController { @@ -161,14 +161,11 @@ public class MesCalCalendarController {
161 if (CollUtil.isEmpty(teams)) { 161 if (CollUtil.isEmpty(teams)) {
162 return Collections.emptyList(); 162 return Collections.emptyList();
163 } 163 }
164 - // 2. 查询这些班组在日期范围内的排班记录  
165 - List<MesCalTeamShiftDO> result = new ArrayList<>(teams.size());  
166 - for (MesCalTeamDO team : teams) {  
167 - MesCalTeamShiftListReqVO reqVO = new MesCalTeamShiftListReqVO()  
168 - .setTeamId(team.getId()).setStartDay(startDay).setEndDay(endDay);  
169 - result.addAll(teamShiftService.getTeamShiftList(reqVO));  
170 - }  
171 - return result; 164 + // 2. 一次 IN 查询这些班组在日期范围内的排班记录
  165 + MesCalTeamShiftListReqVO reqVO = new MesCalTeamShiftListReqVO()
  166 + .setTeamIds(convertSet(teams, MesCalTeamDO::getId))
  167 + .setStartDay(startDay).setEndDay(endDay);
  168 + return teamShiftService.getTeamShiftList(reqVO);
172 } 169 }
173 170
174 /** 171 /**
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/cal/team/vo/shift/MesCalTeamShiftListReqVO.java
@@ -5,6 +5,7 @@ import lombok.Data; @@ -5,6 +5,7 @@ import lombok.Data;
5 import org.springframework.format.annotation.DateTimeFormat; 5 import org.springframework.format.annotation.DateTimeFormat;
6 6
7 import java.time.LocalDateTime; 7 import java.time.LocalDateTime;
  8 +import java.util.Collection;
8 9
9 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; 10 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
10 11
@@ -15,6 +16,9 @@ public class MesCalTeamShiftListReqVO { @@ -15,6 +16,9 @@ public class MesCalTeamShiftListReqVO {
15 @Schema(description = "班组编号", example = "201") 16 @Schema(description = "班组编号", example = "201")
16 private Long teamId; 17 private Long teamId;
17 18
  19 + @Schema(description = "班组编号集合")
  20 + private Collection<Long> teamIds;
  21 +
18 @Schema(description = "排班计划编号", example = "1") 22 @Schema(description = "排班计划编号", example = "1")
19 private Long planId; 23 private Long planId;
20 24
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/machinery/vo/type/MesDvMachineryTypeSaveReqVO.java
@@ -12,8 +12,7 @@ public class MesDvMachineryTypeSaveReqVO { @@ -12,8 +12,7 @@ public class MesDvMachineryTypeSaveReqVO {
12 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 12 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
13 private Long id; 13 private Long id;
14 14
15 - @Schema(description = "类型编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "MT-001")  
16 - @NotEmpty(message = "类型编码不能为空") 15 + @Schema(description = "类型编码", example = "MT-001")
17 private String code; 16 private String code;
18 17
19 @Schema(description = "类型名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "数控机床") 18 @Schema(description = "类型名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "数控机床")
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/cal/team/MesCalTeamShiftMapper.java
@@ -19,6 +19,7 @@ public interface MesCalTeamShiftMapper extends BaseMapperX&lt;MesCalTeamShiftDO&gt; { @@ -19,6 +19,7 @@ public interface MesCalTeamShiftMapper extends BaseMapperX&lt;MesCalTeamShiftDO&gt; {
19 default List<MesCalTeamShiftDO> selectList(MesCalTeamShiftListReqVO reqVO) { 19 default List<MesCalTeamShiftDO> selectList(MesCalTeamShiftListReqVO reqVO) {
20 return selectList(new LambdaQueryWrapperX<MesCalTeamShiftDO>() 20 return selectList(new LambdaQueryWrapperX<MesCalTeamShiftDO>()
21 .eqIfPresent(MesCalTeamShiftDO::getTeamId, reqVO.getTeamId()) 21 .eqIfPresent(MesCalTeamShiftDO::getTeamId, reqVO.getTeamId())
  22 + .inIfPresent(MesCalTeamShiftDO::getTeamId, reqVO.getTeamIds())
22 .eqIfPresent(MesCalTeamShiftDO::getPlanId, reqVO.getPlanId()) 23 .eqIfPresent(MesCalTeamShiftDO::getPlanId, reqVO.getPlanId())
23 .geIfPresent(MesCalTeamShiftDO::getDay, reqVO.getStartDay()) 24 .geIfPresent(MesCalTeamShiftDO::getDay, reqVO.getStartDay())
24 .leIfPresent(MesCalTeamShiftDO::getDay, reqVO.getEndDay()) 25 .leIfPresent(MesCalTeamShiftDO::getDay, reqVO.getEndDay())
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dv/machinery/MesDvMachineryTypeMapper.java
@@ -36,9 +36,8 @@ public interface MesDvMachineryTypeMapper extends BaseMapperX&lt;MesDvMachineryType @@ -36,9 +36,8 @@ public interface MesDvMachineryTypeMapper extends BaseMapperX&lt;MesDvMachineryType
36 .eq(MesDvMachineryTypeDO::getName, name)); 36 .eq(MesDvMachineryTypeDO::getName, name));
37 } 37 }
38 38
39 - default MesDvMachineryTypeDO selectByParentIdAndCode(Long parentId, String code) { 39 + default MesDvMachineryTypeDO selectByCode(String code) {
40 return selectOne(new LambdaQueryWrapperX<MesDvMachineryTypeDO>() 40 return selectOne(new LambdaQueryWrapperX<MesDvMachineryTypeDO>()
41 - .eq(MesDvMachineryTypeDO::getParentId, parentId)  
42 .eq(MesDvMachineryTypeDO::getCode, code)); 41 .eq(MesDvMachineryTypeDO::getCode, code));
43 } 42 }
44 43
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -142,7 +142,7 @@ public interface ErrorCodeConstants { @@ -142,7 +142,7 @@ public interface ErrorCodeConstants {
142 ErrorCode DV_MACHINERY_TYPE_PARENT_NOT_EXITS = new ErrorCode(1_040_300_002, "父级类型不存在"); 142 ErrorCode DV_MACHINERY_TYPE_PARENT_NOT_EXITS = new ErrorCode(1_040_300_002, "父级类型不存在");
143 ErrorCode DV_MACHINERY_TYPE_PARENT_ERROR = new ErrorCode(1_040_300_003, "不能设置自己为父类型"); 143 ErrorCode DV_MACHINERY_TYPE_PARENT_ERROR = new ErrorCode(1_040_300_003, "不能设置自己为父类型");
144 ErrorCode DV_MACHINERY_TYPE_NAME_DUPLICATE = new ErrorCode(1_040_300_004, "同一父类型下已存在该名称"); 144 ErrorCode DV_MACHINERY_TYPE_NAME_DUPLICATE = new ErrorCode(1_040_300_004, "同一父类型下已存在该名称");
145 - ErrorCode DV_MACHINERY_TYPE_CODE_DUPLICATE = new ErrorCode(1_040_300_005, "同一父类型下已存在该编码"); 145 + ErrorCode DV_MACHINERY_TYPE_CODE_DUPLICATE = new ErrorCode(1_040_300_005, "设备类型编码已存在");
146 ErrorCode DV_MACHINERY_TYPE_PARENT_IS_CHILD = new ErrorCode(1_040_300_006, "不能设置自己的子类型为父类型"); 146 ErrorCode DV_MACHINERY_TYPE_PARENT_IS_CHILD = new ErrorCode(1_040_300_006, "不能设置自己的子类型为父类型");
147 ErrorCode DV_MACHINERY_TYPE_HAS_MACHINERY = new ErrorCode(1_040_300_007, "该类型下存在设备,无法删除"); 147 ErrorCode DV_MACHINERY_TYPE_HAS_MACHINERY = new ErrorCode(1_040_300_007, "该类型下存在设备,无法删除");
148 148
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java
@@ -37,7 +37,8 @@ public enum MesMdAutoCodeRuleCodeEnum { @@ -37,7 +37,8 @@ public enum MesMdAutoCodeRuleCodeEnum {
37 WM_STOCK_TAKING_PLAN_CODE("WM_STOCK_TAKING_PLAN_CODE", "盘点方案编码"), 37 WM_STOCK_TAKING_PLAN_CODE("WM_STOCK_TAKING_PLAN_CODE", "盘点方案编码"),
38 WM_STOCK_TAKING_CODE("WM_STOCK_TAKING_CODE", "盘点任务编码"), 38 WM_STOCK_TAKING_CODE("WM_STOCK_TAKING_CODE", "盘点任务编码"),
39 TRANSFER_CODE("TRANSFER_CODE", "转移调拨单编码"), 39 TRANSFER_CODE("TRANSFER_CODE", "转移调拨单编码"),
40 - WM_OUTSOURCE_ISSUE_CODE("WM_OUTSOURCE_ISSUE_CODE", "外协发料单编码"); 40 + WM_OUTSOURCE_ISSUE_CODE("WM_OUTSOURCE_ISSUE_CODE", "外协发料单编码"),
  41 + DV_MACHINERY_TYPE_CODE("DV_MACHINERY_TYPE_CODE", "设备类型编码");
41 42
42 /** 43 /**
43 * 规则代码 44 * 规则代码
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/machinery/MesDvMachineryTypeServiceImpl.java
@@ -2,12 +2,14 @@ package cn.iocoder.yudao.module.mes.service.dv.machinery; @@ -2,12 +2,14 @@ package cn.iocoder.yudao.module.mes.service.dv.machinery;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.ObjUtil; 4 import cn.hutool.core.util.ObjUtil;
  5 +import cn.hutool.core.util.StrUtil;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 import cn.iocoder.yudao.module.mes.controller.admin.dv.machinery.vo.type.MesDvMachineryTypeListReqVO; 7 import cn.iocoder.yudao.module.mes.controller.admin.dv.machinery.vo.type.MesDvMachineryTypeListReqVO;
7 import cn.iocoder.yudao.module.mes.controller.admin.dv.machinery.vo.type.MesDvMachineryTypeSaveReqVO; 8 import cn.iocoder.yudao.module.mes.controller.admin.dv.machinery.vo.type.MesDvMachineryTypeSaveReqVO;
8 import cn.iocoder.yudao.module.mes.dal.dataobject.dv.machinery.MesDvMachineryTypeDO; 9 import cn.iocoder.yudao.module.mes.dal.dataobject.dv.machinery.MesDvMachineryTypeDO;
9 -import cn.iocoder.yudao.module.mes.dal.mysql.dv.machinery.MesDvMachineryMapper;  
10 import cn.iocoder.yudao.module.mes.dal.mysql.dv.machinery.MesDvMachineryTypeMapper; 10 import cn.iocoder.yudao.module.mes.dal.mysql.dv.machinery.MesDvMachineryTypeMapper;
  11 +import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum;
  12 +import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
11 import jakarta.annotation.Resource; 13 import jakarta.annotation.Resource;
12 import org.springframework.context.annotation.Lazy; 14 import org.springframework.context.annotation.Lazy;
13 import org.springframework.stereotype.Service; 15 import org.springframework.stereotype.Service;
@@ -33,11 +35,17 @@ public class MesDvMachineryTypeServiceImpl implements MesDvMachineryTypeService @@ -33,11 +35,17 @@ public class MesDvMachineryTypeServiceImpl implements MesDvMachineryTypeService
33 @Resource 35 @Resource
34 @Lazy // 延迟加载,避免循环依赖 36 @Lazy // 延迟加载,避免循环依赖
35 private MesDvMachineryService machineryService; 37 private MesDvMachineryService machineryService;
  38 + @Resource
  39 + private MesMdAutoCodeRecordService autoCodeRecordService;
36 40
37 @Override 41 @Override
38 public Long createMachineryType(MesDvMachineryTypeSaveReqVO createReqVO) { 42 public Long createMachineryType(MesDvMachineryTypeSaveReqVO createReqVO) {
  43 + // 自动生成编码
  44 + if (StrUtil.isEmpty(createReqVO.getCode())) {
  45 + createReqVO.setCode(autoCodeRecordService.generateAutoCode(MesMdAutoCodeRuleCodeEnum.DV_MACHINERY_TYPE_CODE.getCode()));
  46 + }
39 // 校验 47 // 校验
40 - validateMachineryTypeSave(null, createReqVO.getParentId(), createReqVO.getName(), createReqVO.getCode()); 48 + validateMachineryTypeSaveData(createReqVO);
41 49
42 // 插入 50 // 插入
43 MesDvMachineryTypeDO machineryType = BeanUtils.toBean(createReqVO, MesDvMachineryTypeDO.class); 51 MesDvMachineryTypeDO machineryType = BeanUtils.toBean(createReqVO, MesDvMachineryTypeDO.class);
@@ -48,7 +56,7 @@ public class MesDvMachineryTypeServiceImpl implements MesDvMachineryTypeService @@ -48,7 +56,7 @@ public class MesDvMachineryTypeServiceImpl implements MesDvMachineryTypeService
48 @Override 56 @Override
49 public void updateMachineryType(MesDvMachineryTypeSaveReqVO updateReqVO) { 57 public void updateMachineryType(MesDvMachineryTypeSaveReqVO updateReqVO) {
50 // 校验 58 // 校验
51 - validateMachineryTypeSave(updateReqVO.getId(), updateReqVO.getParentId(), updateReqVO.getName(), updateReqVO.getCode()); 59 + validateMachineryTypeSaveData(updateReqVO);
52 60
53 // 更新 61 // 更新
54 MesDvMachineryTypeDO updateObj = BeanUtils.toBean(updateReqVO, MesDvMachineryTypeDO.class); 62 MesDvMachineryTypeDO updateObj = BeanUtils.toBean(updateReqVO, MesDvMachineryTypeDO.class);
@@ -72,16 +80,16 @@ public class MesDvMachineryTypeServiceImpl implements MesDvMachineryTypeService @@ -72,16 +80,16 @@ public class MesDvMachineryTypeServiceImpl implements MesDvMachineryTypeService
72 machineryTypeMapper.deleteById(id); 80 machineryTypeMapper.deleteById(id);
73 } 81 }
74 82
75 - private void validateMachineryTypeSave(Long id, Long parentId, String name, String code) {  
76 - if (id != null) {  
77 - validateMachineryTypeExists(id); 83 + private void validateMachineryTypeSaveData(MesDvMachineryTypeSaveReqVO saveReqVO) {
  84 + if (saveReqVO.getId() != null) {
  85 + validateMachineryTypeExists(saveReqVO.getId());
78 } 86 }
79 // 校验父级节点有效性 87 // 校验父级节点有效性
80 - validateParentMachineryType(id, parentId); 88 + validateParentMachineryType(saveReqVO.getId(), saveReqVO.getParentId());
81 // 校验类型名称唯一性 89 // 校验类型名称唯一性
82 - validateMachineryTypeNameUnique(id, parentId, name); 90 + validateMachineryTypeNameUnique(saveReqVO.getId(), saveReqVO.getParentId(), saveReqVO.getName());
83 // 校验类型编码唯一性 91 // 校验类型编码唯一性
84 - validateMachineryTypeCodeUnique(id, parentId, code); 92 + validateMachineryTypeCodeUnique(saveReqVO.getId(), saveReqVO.getParentId(), saveReqVO.getCode());
85 } 93 }
86 94
87 private void validateMachineryTypeExists(Long id) { 95 private void validateMachineryTypeExists(Long id) {
@@ -135,8 +143,7 @@ public class MesDvMachineryTypeServiceImpl implements MesDvMachineryTypeService @@ -135,8 +143,7 @@ public class MesDvMachineryTypeServiceImpl implements MesDvMachineryTypeService
135 } 143 }
136 144
137 private void validateMachineryTypeCodeUnique(Long id, Long parentId, String code) { 145 private void validateMachineryTypeCodeUnique(Long id, Long parentId, String code) {
138 - // TODO @yunai:类型编码的唯一性,建议全局校验,而非同一父级下校验  
139 - MesDvMachineryTypeDO machineryType = machineryTypeMapper.selectByParentIdAndCode(parentId, code); 146 + MesDvMachineryTypeDO machineryType = machineryTypeMapper.selectByCode(code);
140 if (machineryType == null) { 147 if (machineryType == null) {
141 return; 148 return;
142 } 149 }