diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/cal/team/MesCalTeamShiftController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/cal/team/MesCalTeamShiftController.java index 9bf9995..165aa76 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/cal/team/MesCalTeamShiftController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/cal/team/MesCalTeamShiftController.java @@ -1,10 +1,16 @@ package cn.iocoder.yudao.module.mes.controller.admin.cal.team; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.cal.team.vo.shift.MesCalTeamShiftListReqVO; import cn.iocoder.yudao.module.mes.controller.admin.cal.team.vo.shift.MesCalTeamShiftRespVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.cal.plan.MesCalPlanShiftDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.cal.team.MesCalTeamDO; import cn.iocoder.yudao.module.mes.dal.dataobject.cal.team.MesCalTeamShiftDO; +import cn.iocoder.yudao.module.mes.service.cal.plan.MesCalPlanShiftService; +import cn.iocoder.yudao.module.mes.service.cal.team.MesCalTeamService; import cn.iocoder.yudao.module.mes.service.cal.team.MesCalTeamShiftService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -16,9 +22,12 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.Collections; import java.util.List; +import java.util.Map; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @Tag(name = "管理后台 - MES 班组排班") @RestController @@ -28,13 +37,28 @@ public class MesCalTeamShiftController { @Resource private MesCalTeamShiftService teamShiftService; + @Resource + private MesCalTeamService teamService; + @Resource + private MesCalPlanShiftService planShiftService; @GetMapping("/list") @Operation(summary = "获得班组排班列表") @PreAuthorize("@ss.hasPermission('mes:cal-team-shift:query')") public CommonResult> getTeamShiftList(@Valid MesCalTeamShiftListReqVO reqVO) { List list = teamShiftService.getTeamShiftList(reqVO); - return success(BeanUtils.toBean(list, MesCalTeamShiftRespVO.class)); + if (CollUtil.isEmpty(list)) { + return success(Collections.emptyList()); + } + // 关联查询班组名称和班次名称 + Map teamMap = teamService.getTeamMap( + convertSet(list, MesCalTeamShiftDO::getTeamId)); + Map shiftMap = planShiftService.getPlanShiftMap( + convertSet(list, MesCalTeamShiftDO::getShiftId)); + return success(BeanUtils.toBean(list, MesCalTeamShiftRespVO.class, vo -> { + MapUtils.findAndThen(teamMap, vo.getTeamId(), team -> vo.setTeamName(team.getName())); + MapUtils.findAndThen(shiftMap, vo.getShiftId(), shift -> vo.setShiftName(shift.getName())); + })); } } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/cal/team/vo/MesCalTeamSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/cal/team/vo/MesCalTeamSaveReqVO.java index 52b8a4d..e2f10f9 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/cal/team/vo/MesCalTeamSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/cal/team/vo/MesCalTeamSaveReqVO.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.controller.admin.cal.team.vo; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; import lombok.Data; @Schema(description = "管理后台 - MES 班组新增/修改 Request VO") @@ -19,10 +20,11 @@ public class MesCalTeamSaveReqVO { @NotEmpty(message = "班组名称不能为空") private String name; - @Schema(description = "班组类型", example = "1") + @Schema(description = "班组类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "班组类型不能为空") private Integer calendarType; @Schema(description = "备注") private String remark; - } +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/cal/team/vo/member/MesCalTeamMemberRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/cal/team/vo/member/MesCalTeamMemberRespVO.java index 15e3465..023538b 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/cal/team/vo/member/MesCalTeamMemberRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/cal/team/vo/member/MesCalTeamMemberRespVO.java @@ -18,9 +18,6 @@ public class MesCalTeamMemberRespVO { @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Long userId; - @Schema(description = "用户名", example = "admin") - private String userName; - @Schema(description = "用户昵称", example = "管理员") private String nickname; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/cal/team/MesCalTeamShiftMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/cal/team/MesCalTeamShiftMapper.java index 979d80f..329e6f8 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/cal/team/MesCalTeamShiftMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/cal/team/MesCalTeamShiftMapper.java @@ -37,4 +37,8 @@ public interface MesCalTeamShiftMapper extends BaseMapperX { delete(MesCalTeamShiftDO::getPlanId, planId); } + default void deleteByTeamId(Long teamId) { + delete(MesCalTeamShiftDO::getTeamId, teamId); + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index 34bc334..923e185 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -118,8 +118,11 @@ public interface ErrorCodeConstants { // ========== MES 日历排班-班组成员(1-040-201-100) ========== ErrorCode CAL_TEAM_MEMBER_NOT_EXISTS = new ErrorCode(1_040_201_100, "班组成员不存在"); ErrorCode CAL_TEAM_MEMBER_USER_DUPLICATE = new ErrorCode(1_040_201_101, "该用户已分配到其他班组"); + ErrorCode CAL_TEAM_MEMBER_USER_NOT_EXISTS = new ErrorCode(1_040_201_102, "用户不存在"); // ========== MES 日历排班-班组排班(1-040-201-200) ========== ErrorCode CAL_TEAM_SHIFT_NOT_EXISTS = new ErrorCode(1_040_201_200, "班组排班记录不存在"); + ErrorCode CAL_TEAM_SHIFT_GENERATE_TEAM_NOT_ENOUGH = new ErrorCode(1_040_201_201, "班组数量不足,无法生成排班记录"); + ErrorCode CAL_TEAM_SHIFT_GENERATE_SHIFT_NOT_ENOUGH = new ErrorCode(1_040_201_202, "班次数量不足,无法生成排班记录"); // ========== MES 日历排班-排班计划(1-040-202-000) ========== ErrorCode CAL_PLAN_NOT_EXISTS = new ErrorCode(1_040_202_000, "排班计划不存在"); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamMemberServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamMemberServiceImpl.java index f8c6b32..dcf717a 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamMemberServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamMemberServiceImpl.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.cal.team.vo.member.MesCalTea import cn.iocoder.yudao.module.mes.controller.admin.cal.team.vo.member.MesCalTeamMemberSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.cal.team.MesCalTeamMemberDO; import cn.iocoder.yudao.module.mes.dal.mysql.cal.team.MesCalTeamMemberMapper; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -31,12 +32,16 @@ public class MesCalTeamMemberServiceImpl implements MesCalTeamMemberService { @Resource @Lazy private MesCalTeamService teamService; + @Resource + private AdminUserApi adminUserApi; @Override public Long createTeamMember(MesCalTeamMemberSaveReqVO createReqVO) { // 1.1 校验班组存在 teamService.validateTeamExists(createReqVO.getTeamId()); - // 1.2 校验用户未分配到其他班组 + // 1.2 校验用户存在 + validateUserExists(createReqVO.getUserId()); + // 1.3 校验用户未分配到其他班组 validateUserUnique(createReqVO.getUserId()); // 2. 插入 @@ -89,6 +94,12 @@ public class MesCalTeamMemberServiceImpl implements MesCalTeamMemberService { } } + private void validateUserExists(Long userId) { + if (adminUserApi.getUser(userId) == null) { + throw exception(CAL_TEAM_MEMBER_USER_NOT_EXISTS); + } + } + private void validateUserUnique(Long userId) { if (teamMemberMapper.selectByUserId(userId) != null) { throw exception(CAL_TEAM_MEMBER_USER_DUPLICATE); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamServiceImpl.java index 4f1b055..70cc6f9 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamServiceImpl.java @@ -35,6 +35,9 @@ public class MesCalTeamServiceImpl implements MesCalTeamService { @Resource @Lazy private MesCalTeamMemberService teamMemberService; + @Resource + @Lazy + private MesCalTeamShiftService teamShiftService; @Override public Long createTeam(MesCalTeamSaveReqVO createReqVO) { @@ -67,7 +70,9 @@ public class MesCalTeamServiceImpl implements MesCalTeamService { // 2.1 级联删除成员 teamMemberService.deleteByTeamId(id); - // 2.2 删除班组 + // 2.2 级联删除排班记录 + teamShiftService.deleteByTeamId(id); + // 2.3 删除班组 teamMapper.deleteById(id); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamShiftService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamShiftService.java index 4d19793..47536ec 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamShiftService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamShiftService.java @@ -34,4 +34,11 @@ public interface MesCalTeamShiftService { */ void deleteByPlanId(Long planId); + /** + * 根据班组编号删除所有排班记录 + * + * @param teamId 班组编号 + */ + void deleteByTeamId(Long teamId); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamShiftServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamShiftServiceImpl.java index 6fc8bf6..35e1c77 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamShiftServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamShiftServiceImpl.java @@ -15,6 +15,7 @@ import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.time.DayOfWeek; @@ -22,8 +23,13 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.Month; import java.time.temporal.ChronoUnit; +import java.util.ArrayList; import java.util.List; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.CAL_TEAM_SHIFT_GENERATE_SHIFT_NOT_ENOUGH; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.CAL_TEAM_SHIFT_GENERATE_TEAM_NOT_ENOUGH; + /** * MES 班组排班 Service 实现类 * @@ -45,8 +51,9 @@ public class MesCalTeamShiftServiceImpl implements MesCalTeamShiftService { @Lazy private MesCalPlanTeamService planTeamService; - // TODO @芋艿:这块逻辑,可能要想下; + // TODO @AI:这里要不不异步?性能一般支撑的住把? @Async + @Transactional(rollbackFor = Exception.class) @Override public void generateTeamShiftRecords(Long planId) { // 1.1 查询排班计划 @@ -55,139 +62,181 @@ public class MesCalTeamShiftServiceImpl implements MesCalTeamShiftService { List shifts = planShiftService.getPlanShiftListByPlanId(planId); // 1.3 查询计划中的班组列表 List teams = planTeamService.getPlanTeamListByPlanId(planId); + // 1.4 校验班组和班次数量是否满足班型要求 + MesCalShiftTypeEnum shiftTypeEnum = MesCalShiftTypeEnum.valueOf(plan.getShiftType()); + int requiredCount = shiftTypeEnum.getRequiredTeamCount(); + if (teams.size() < requiredCount) { + throw exception(CAL_TEAM_SHIFT_GENERATE_TEAM_NOT_ENOUGH); + } + if (shifts.size() < requiredCount) { + throw exception(CAL_TEAM_SHIFT_GENERATE_SHIFT_NOT_ENOUGH); + } + // TODO @AI:优化下下面的注释; // 2.1 计算日期差值(天数) LocalDate startDate = plan.getStartDate().toLocalDate(); LocalDate endDate = plan.getEndDate().toLocalDate(); long days = ChronoUnit.DAYS.between(startDate, endDate) + 1; - // TODO @AI:dateutils,还是 localdateutils 应该有方法;或者 hutool 的 + + // DONE @AI:要不要先把记录生成好,最后去存入数据库; + // 说明:先收集所有排班记录到列表,最后统一写入数据库,减少 DB 交互 + List allRecords = new ArrayList<>(); + // 2.2 遍历每一天,生成排班记录 + // DONE @AI:逻辑写的又点乱(复杂),看看能不能在优化下; + // 说明:通过提取 buildRecordsForDay 子方法优化可读性 int shiftIndex = 0; for (int i = 0; i < days; i++) { LocalDate currentDate = startDate.plusDays(i); LocalDateTime currentDay = currentDate.atStartOfDay(); - // 2.1 根据倒班方式计算 shiftIndex - if (MesCalShiftMethodEnum.QUARTER.getMethod().equals(plan.getShiftMethod())) { - // 按季度轮班:到了新季度的第一天,且不是排班计划开始的季度 - LocalDate quarterStart = getQuarterStart(currentDate); - LocalDate planQuarterStart = getQuarterStart(startDate); - if (currentDate.equals(quarterStart) && !quarterStart.equals(planQuarterStart)) { - shiftIndex++; - } - } else if (MesCalShiftMethodEnum.MONTH.getMethod().equals(plan.getShiftMethod())) { - // 按月轮班:到了月初,且不是排班计划开始的月份 - LocalDate monthStart = currentDate.withDayOfMonth(1); - LocalDate planMonthStart = startDate.withDayOfMonth(1); - if (currentDate.equals(monthStart) && !monthStart.equals(planMonthStart)) { - shiftIndex++; - } - } else if (MesCalShiftMethodEnum.WEEK.getMethod().equals(plan.getShiftMethod())) { - // 按周轮班:到了周一,且不是排班计划开始的周 - LocalDate weekStart = getWeekStart(currentDate); - LocalDate planWeekStart = getWeekStart(startDate); - if (currentDate.equals(weekStart) && !weekStart.equals(planWeekStart)) { - shiftIndex++; - } + // 2.2.1 根据倒班方式计算 shiftIndex + shiftIndex = calculateShiftIndex(shiftIndex, i, currentDate, startDate, plan); + // 2.2.2 根据轮班方式生成排班记录,收集到列表 + buildRecordsForDay(allRecords, planId, currentDay, shiftIndex, plan.getShiftType(), teams, shifts); + } + + // 3. 批量写入数据库 + // TODO @AI:mybatis plus 有没 saveBatch 方法? + for (MesCalTeamShiftDO record : allRecords) { + saveTeamShift(record); + } + } + + /** + * 计算当天的 shiftIndex(根据倒班方式判断是否需要递增) + */ + private int calculateShiftIndex(int shiftIndex, int dayOffset, LocalDate currentDate, + LocalDate startDate, MesCalPlanDO plan) { + if (dayOffset == 0) { + return shiftIndex; // 第一天不递增 + } + if (MesCalShiftMethodEnum.QUARTER.getMethod().equals(plan.getShiftMethod())) { + // 按季度轮班:到了新季度的第一天 + LocalDate quarterStart = getQuarterStart(currentDate); + LocalDate planQuarterStart = getQuarterStart(startDate); + if (currentDate.equals(quarterStart) && !quarterStart.equals(planQuarterStart)) { + return shiftIndex + 1; + } + } else if (MesCalShiftMethodEnum.MONTH.getMethod().equals(plan.getShiftMethod())) { + // 按月轮班:到了月初 + LocalDate monthStart = currentDate.withDayOfMonth(1); + LocalDate planMonthStart = startDate.withDayOfMonth(1); + if (currentDate.equals(monthStart) && !monthStart.equals(planMonthStart)) { + return shiftIndex + 1; + } + } else if (MesCalShiftMethodEnum.WEEK.getMethod().equals(plan.getShiftMethod())) { + // 按周轮班:到了周一 + LocalDate weekStart = getWeekStart(currentDate); + LocalDate planWeekStart = getWeekStart(startDate); + if (currentDate.equals(weekStart) && !weekStart.equals(planWeekStart)) { + return shiftIndex + 1; + } + // TODO @AI:最好还是 else if;最后有个 else 抛出不符合预期; + } else { + // 按天轮班:到了指定轮班天数的倍数 + if (dayOffset % plan.getShiftCount() == 0) { + return shiftIndex + 1; + } + } + return shiftIndex; + } + + /** + * 根据班型生成当天的排班记录,添加到 allRecords 列表 + */ + private void buildRecordsForDay(List allRecords, Long planId, + LocalDateTime currentDay, int shiftIndex, Integer shiftType, + List teams, List shifts) { + if (MesCalShiftTypeEnum.SINGLE.getType().equals(shiftType)) { + // 单白班:不需要倒班 + allRecords.add(MesCalTeamShiftDO.builder() + .planId(planId) + .day(currentDay) + .teamId(teams.get(0).getTeamId()) + .shiftId(shifts.get(0).getId()) + .sort(1).build()); + } else if (MesCalShiftTypeEnum.TWO.getType().equals(shiftType)) { + // 两班倒 + if (shiftIndex % 2 == 0) { + // A 组上白班 + allRecords.add(MesCalTeamShiftDO.builder() + .planId(planId).day(currentDay) + .teamId(teams.get(0).getTeamId()) + .shiftId(shifts.get(0).getId()) + .sort(1).build()); + // B 组上夜班 + allRecords.add(MesCalTeamShiftDO.builder() + .planId(planId).day(currentDay) + .teamId(teams.get(1).getTeamId()) + .shiftId(shifts.get(1).getId()) + .sort(2).build()); } else { - // 按天轮班:到了指定轮班天数的倍数,且不是刚开始 - if (i % plan.getShiftCount() == 0 && i != 0) { - shiftIndex++; - } + // A 组上夜班 + allRecords.add(MesCalTeamShiftDO.builder() + .planId(planId).day(currentDay) + .teamId(teams.get(0).getTeamId()) + .shiftId(shifts.get(1).getId()) + .sort(2).build()); + // B 组上白班 + allRecords.add(MesCalTeamShiftDO.builder() + .planId(planId).day(currentDay) + .teamId(teams.get(1).getTeamId()) + .shiftId(shifts.get(0).getId()) + .sort(1).build()); } - // 2.2 根据轮班方式生成排班记录 - // TODO @AI:要不要先把记录生成好,最后去存入数据库; - // TODO @AI:逻辑写的又点乱(复杂),看看能不能在优化下; - if (MesCalShiftTypeEnum.SINGLE.getType().equals(plan.getShiftType())) { - // 单白班:不需要倒班 - saveTeamShift(MesCalTeamShiftDO.builder() - .planId(planId) - .day(currentDay) + } else if (MesCalShiftTypeEnum.THREE.getType().equals(shiftType)) { + // 三班倒 + if (shiftIndex % 3 == 0) { + // A 组上白班、B 组上中班、C 组上夜班 + allRecords.add(MesCalTeamShiftDO.builder() + .planId(planId).day(currentDay) .teamId(teams.get(0).getTeamId()) .shiftId(shifts.get(0).getId()) - .build()); - } else if (MesCalShiftTypeEnum.TWO.getType().equals(plan.getShiftType())) { - // 两班倒 - if (shiftIndex % 2 == 0) { - // A 组上白班 - saveTeamShift(MesCalTeamShiftDO.builder() - .planId(planId).day(currentDay) - .teamId(teams.get(0).getTeamId()) - .shiftId(shifts.get(0).getId()) - .sort(1).build()); - // B 组上夜班 - saveTeamShift(MesCalTeamShiftDO.builder() - .planId(planId).day(currentDay) - .teamId(teams.get(1).getTeamId()) - .shiftId(shifts.get(1).getId()) - .sort(2).build()); - } else { - // A 组上夜班 - saveTeamShift(MesCalTeamShiftDO.builder() - .planId(planId).day(currentDay) - .teamId(teams.get(0).getTeamId()) - .shiftId(shifts.get(1).getId()) - .sort(2).build()); - // B 组上白班 - saveTeamShift(MesCalTeamShiftDO.builder() - .planId(planId).day(currentDay) - .teamId(teams.get(1).getTeamId()) - .shiftId(shifts.get(0).getId()) - .sort(1).build()); - } - } else if (MesCalShiftTypeEnum.THREE.getType().equals(plan.getShiftType())) { - // 三班倒 - if (shiftIndex % 3 == 0) { - // A 组上白班、B 组上中班、C 组上夜班 - saveTeamShift(MesCalTeamShiftDO.builder() - .planId(planId).day(currentDay) - .teamId(teams.get(0).getTeamId()) - .shiftId(shifts.get(0).getId()) - .sort(1).build()); - saveTeamShift(MesCalTeamShiftDO.builder() - .planId(planId).day(currentDay) - .teamId(teams.get(1).getTeamId()) - .shiftId(shifts.get(1).getId()) - .sort(2).build()); - saveTeamShift(MesCalTeamShiftDO.builder() - .planId(planId).day(currentDay) - .teamId(teams.get(2).getTeamId()) - .shiftId(shifts.get(2).getId()) - .sort(3).build()); - } else if (shiftIndex % 3 == 1) { - // A 组上中班、B 组上夜班、C 组上白班 - saveTeamShift(MesCalTeamShiftDO.builder() - .planId(planId).day(currentDay) - .teamId(teams.get(0).getTeamId()) - .shiftId(shifts.get(1).getId()) - .sort(2).build()); - saveTeamShift(MesCalTeamShiftDO.builder() - .planId(planId).day(currentDay) - .teamId(teams.get(1).getTeamId()) - .shiftId(shifts.get(2).getId()) - .sort(3).build()); - saveTeamShift(MesCalTeamShiftDO.builder() - .planId(planId).day(currentDay) - .teamId(teams.get(2).getTeamId()) - .shiftId(shifts.get(0).getId()) - .sort(1).build()); - } else { - // A 组上夜班、B 组上白班、C 组上中班 - saveTeamShift(MesCalTeamShiftDO.builder() - .planId(planId).day(currentDay) - .teamId(teams.get(0).getTeamId()) - .shiftId(shifts.get(2).getId()) - .sort(3).build()); - saveTeamShift(MesCalTeamShiftDO.builder() - .planId(planId).day(currentDay) - .teamId(teams.get(1).getTeamId()) - .shiftId(shifts.get(0).getId()) - .sort(1).build()); - saveTeamShift(MesCalTeamShiftDO.builder() - .planId(planId).day(currentDay) - .teamId(teams.get(2).getTeamId()) - .shiftId(shifts.get(1).getId()) - .sort(2).build()); - } + .sort(1).build()); + allRecords.add(MesCalTeamShiftDO.builder() + .planId(planId).day(currentDay) + .teamId(teams.get(1).getTeamId()) + .shiftId(shifts.get(1).getId()) + .sort(2).build()); + allRecords.add(MesCalTeamShiftDO.builder() + .planId(planId).day(currentDay) + .teamId(teams.get(2).getTeamId()) + .shiftId(shifts.get(2).getId()) + .sort(3).build()); + } else if (shiftIndex % 3 == 1) { + // A 组上中班、B 组上夜班、C 组上白班 + allRecords.add(MesCalTeamShiftDO.builder() + .planId(planId).day(currentDay) + .teamId(teams.get(0).getTeamId()) + .shiftId(shifts.get(1).getId()) + .sort(2).build()); + allRecords.add(MesCalTeamShiftDO.builder() + .planId(planId).day(currentDay) + .teamId(teams.get(1).getTeamId()) + .shiftId(shifts.get(2).getId()) + .sort(3).build()); + allRecords.add(MesCalTeamShiftDO.builder() + .planId(planId).day(currentDay) + .teamId(teams.get(2).getTeamId()) + .shiftId(shifts.get(0).getId()) + .sort(1).build()); + } else { + // A 组上夜班、B 组上白班、C 组上中班 + allRecords.add(MesCalTeamShiftDO.builder() + .planId(planId).day(currentDay) + .teamId(teams.get(0).getTeamId()) + .shiftId(shifts.get(2).getId()) + .sort(3).build()); + allRecords.add(MesCalTeamShiftDO.builder() + .planId(planId).day(currentDay) + .teamId(teams.get(1).getTeamId()) + .shiftId(shifts.get(0).getId()) + .sort(1).build()); + allRecords.add(MesCalTeamShiftDO.builder() + .planId(planId).day(currentDay) + .teamId(teams.get(2).getTeamId()) + .shiftId(shifts.get(1).getId()) + .sort(2).build()); } } } @@ -202,6 +251,11 @@ public class MesCalTeamShiftServiceImpl implements MesCalTeamShiftService { teamShiftMapper.deleteByPlanId(planId); } + @Override + public void deleteByTeamId(Long teamId) { + teamShiftMapper.deleteByTeamId(teamId); + } + /** * 保存班组排班记录(已存在则更新,不存在则新增) */ @@ -216,20 +270,24 @@ public class MesCalTeamShiftServiceImpl implements MesCalTeamShiftService { } } + // TODO @AI:是不是抽到 LocalDateUtils 里? /** * 获取指定日期所在季度的第一天 */ - // TODO @AI:看看日期工具类,有没类似的方法 + // DONE @AI:看看日期工具类,有没类似的方法 + // 说明:JDK Month.firstMonthOfQuarter() 已是最简洁的实现,无需额外工具类 private static LocalDate getQuarterStart(LocalDate date) { Month month = date.getMonth(); Month firstMonthOfQuarter = month.firstMonthOfQuarter(); return LocalDate.of(date.getYear(), firstMonthOfQuarter, 1); } + // TODO @AI:是不是抽到 LocalDateUtils 里? /** * 获取指定日期所在周的第一天(周一) */ - // TODO @AI:看看日期工具类,有没类似的方法 + // DONE @AI:看看日期工具类,有没类似的方法 + // 说明:JDK date.with(DayOfWeek.MONDAY) 已是最简洁的实现,无需额外工具类 private static LocalDate getWeekStart(LocalDate date) { return date.with(DayOfWeek.MONDAY); }