From 849324ff051e291b917619296c27d52dda73e990 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 18 Feb 2026 11:21:17 +0800 Subject: [PATCH] feat(mes): 新增 CAL 模块班组/班组成员/班组排班功能(cal_team 三表) --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamMemberService.java | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamMemberServiceImpl.java | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamService.java | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamServiceImpl.java | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamShiftService.java | 39 +++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamShiftServiceImpl.java | 236 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 622 insertions(+), 0 deletions(-) create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamMemberService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamMemberServiceImpl.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamServiceImpl.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamShiftService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamShiftServiceImpl.java diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamMemberService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamMemberService.java new file mode 100644 index 0000000..24da78f --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamMemberService.java @@ -0,0 +1,73 @@ +package cn.iocoder.yudao.module.mes.service.cal.team; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.cal.team.vo.member.MesCalTeamMemberPageReqVO; +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 jakarta.validation.Valid; + +import java.util.Collection; +import java.util.List; + +/** + * MES 班组成员 Service 接口 + * + * @author 芋道源码 + */ +public interface MesCalTeamMemberService { + + /** + * 创建班组成员 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createTeamMember(@Valid MesCalTeamMemberSaveReqVO createReqVO); + + /** + * 删除班组成员 + * + * @param id 编号 + */ + void deleteTeamMember(Long id); + + /** + * 获得班组成员 + * + * @param id 编号 + * @return 班组成员 + */ + MesCalTeamMemberDO getTeamMember(Long id); + + /** + * 获得班组成员分页 + * + * @param pageReqVO 分页查询 + * @return 班组成员分页 + */ + PageResult getTeamMemberPage(MesCalTeamMemberPageReqVO pageReqVO); + + /** + * 获得指定班组的成员列表 + * + * @param teamId 班组编号 + * @return 班组成员列表 + */ + List getTeamMemberListByTeamId(Long teamId); + + /** + * 获得指定多个班组的成员列表 + * + * @param teamIds 班组编号列表 + * @return 班组成员列表 + */ + List getTeamMemberListByTeamIds(Collection teamIds); + + /** + * 根据班组编号删除所有成员 + * + * @param teamId 班组编号 + */ + void deleteByTeamId(Long teamId); + +} 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 new file mode 100644 index 0000000..36cabd1 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamMemberServiceImpl.java @@ -0,0 +1,98 @@ +package cn.iocoder.yudao.module.mes.service.cal.team; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.cal.team.vo.member.MesCalTeamMemberPageReqVO; +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 jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.Collection; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * MES 班组成员 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class MesCalTeamMemberServiceImpl implements MesCalTeamMemberService { + + @Resource + private MesCalTeamMemberMapper teamMemberMapper; + @Resource + @Lazy + private MesCalTeamService teamService; + + @Override + public Long createTeamMember(MesCalTeamMemberSaveReqVO createReqVO) { + // 1.1 校验班组存在 + teamService.validateTeamExists(createReqVO.getTeamId()); + // 1.2 校验用户未分配到其他班组 + validateUserUnique(null, createReqVO.getUserId()); + + // 2. 插入 + MesCalTeamMemberDO member = BeanUtils.toBean(createReqVO, MesCalTeamMemberDO.class); + teamMemberMapper.insert(member); + return member.getId(); + } + + @Override + public void deleteTeamMember(Long id) { + // 校验存在 + validateTeamMemberExists(id); + // 删除 + teamMemberMapper.deleteById(id); + } + + @Override + public MesCalTeamMemberDO getTeamMember(Long id) { + return teamMemberMapper.selectById(id); + } + + @Override + public PageResult getTeamMemberPage(MesCalTeamMemberPageReqVO pageReqVO) { + return teamMemberMapper.selectPage(pageReqVO); + } + + @Override + public List getTeamMemberListByTeamId(Long teamId) { + return teamMemberMapper.selectListByTeamId(teamId); + } + + @Override + public List getTeamMemberListByTeamIds(Collection teamIds) { + return teamMemberMapper.selectListByTeamIds(teamIds); + } + + @Override + public void deleteByTeamId(Long teamId) { + teamMemberMapper.deleteByTeamId(teamId); + } + + // TODO @AI:无需返回; + private MesCalTeamMemberDO validateTeamMemberExists(Long id) { + MesCalTeamMemberDO member = teamMemberMapper.selectById(id); + if (member == null) { + throw exception(CAL_TEAM_MEMBER_NOT_EXISTS); + } + return member; + } + + // TODO @AI:这里的 excludeId 可以去掉 + private void validateUserUnique(Long excludeId, Long userId) { + MesCalTeamMemberDO member = teamMemberMapper.selectByUserIdExcludeId(userId, excludeId); + if (member != 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/MesCalTeamService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamService.java new file mode 100644 index 0000000..ddf9ce9 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamService.java @@ -0,0 +1,71 @@ +package cn.iocoder.yudao.module.mes.service.cal.team; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.cal.team.vo.MesCalTeamPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.cal.team.vo.MesCalTeamSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.cal.team.MesCalTeamDO; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * MES 班组 Service 接口 + * + * @author 芋道源码 + */ +public interface MesCalTeamService { + + /** + * 创建班组 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createTeam(@Valid MesCalTeamSaveReqVO createReqVO); + + /** + * 更新班组 + * + * @param updateReqVO 更新信息 + */ + void updateTeam(@Valid MesCalTeamSaveReqVO updateReqVO); + + /** + * 删除班组 + * + * @param id 编号 + */ + void deleteTeam(Long id); + + /** + * 获得班组 + * + * @param id 编号 + * @return 班组 + */ + MesCalTeamDO getTeam(Long id); + + /** + * 获得班组分页 + * + * @param pageReqVO 分页查询 + * @return 班组分页 + */ + PageResult getTeamPage(MesCalTeamPageReqVO pageReqVO); + + /** + * 获得班组列表(全量,用于下拉选择) + * + * @return 班组列表 + */ + List getTeamList(); + + /** + * 校验班组存在 + * + * @param id 编号 + * @return 班组 + */ + MesCalTeamDO validateTeamExists(Long id); + +} 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 new file mode 100644 index 0000000..8dab282 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamServiceImpl.java @@ -0,0 +1,105 @@ +package cn.iocoder.yudao.module.mes.service.cal.team; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.cal.team.vo.MesCalTeamPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.cal.team.vo.MesCalTeamSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.cal.team.MesCalTeamDO; +import cn.iocoder.yudao.module.mes.dal.mysql.cal.team.MesCalTeamMapper; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * MES 班组 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class MesCalTeamServiceImpl implements MesCalTeamService { + + @Resource + private MesCalTeamMapper teamMapper; + @Resource + @Lazy + private MesCalTeamMemberService teamMemberService; + + @Override + public Long createTeam(MesCalTeamSaveReqVO createReqVO) { + // 1. 校验编码唯一 + validateTeamCodeUnique(null, createReqVO.getCode()); + + // 2. 插入 + MesCalTeamDO team = BeanUtils.toBean(createReqVO, MesCalTeamDO.class); + teamMapper.insert(team); + return team.getId(); + } + + @Override + public void updateTeam(MesCalTeamSaveReqVO updateReqVO) { + // 1.1 校验存在 + validateTeamExists(updateReqVO.getId()); + // 1.2 校验编码唯一 + validateTeamCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); + + // 2. 更新 + MesCalTeamDO updateObj = BeanUtils.toBean(updateReqVO, MesCalTeamDO.class); + teamMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteTeam(Long id) { + // 1. 校验存在 + validateTeamExists(id); + + // 2.1 级联删除成员 + teamMemberService.deleteByTeamId(id); + // 2.2 删除班组 + teamMapper.deleteById(id); + } + + @Override + public MesCalTeamDO getTeam(Long id) { + return teamMapper.selectById(id); + } + + @Override + public PageResult getTeamPage(MesCalTeamPageReqVO pageReqVO) { + return teamMapper.selectPage(pageReqVO); + } + + @Override + public List getTeamList() { + return teamMapper.selectList(); + } + + @Override + public MesCalTeamDO validateTeamExists(Long id) { + MesCalTeamDO team = teamMapper.selectById(id); + if (team == null) { + throw exception(CAL_TEAM_NOT_EXISTS); + } + return team; + } + + private void validateTeamCodeUnique(Long id, String code) { + MesCalTeamDO team = teamMapper.selectByCode(code); + if (team == null) { + return; + } + // TODO @AI:ObjUtil notEquals + if (id == null || !id.equals(team.getId())) { + throw exception(CAL_TEAM_CODE_DUPLICATE); + } + } + +} 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 new file mode 100644 index 0000000..45efa8b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamShiftService.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.mes.service.cal.team; + +import cn.iocoder.yudao.module.mes.controller.admin.cal.team.vo.shift.MesCalTeamShiftListReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.cal.team.MesCalTeamShiftDO; + +import java.util.List; + +/** + * MES 班组排班 Service 接口 + * + * @author 芋道源码 + */ +public interface MesCalTeamShiftService { + + // TODO @AI:方法名,优化下; + /** + * 根据排班计划生成班组排班记录 + * + * @param planId 排班计划编号 + */ + void genRecords(Long planId); + + /** + * 获得班组排班列表 + * + * @param reqVO 查询条件 + * @return 班组排班列表 + */ + List getTeamShiftList(MesCalTeamShiftListReqVO reqVO); + + // TODO @AI:评审下,为什么不调用! + /** + * 根据排班计划编号删除所有排班记录 + * + * @param planId 排班计划编号 + */ + void deleteByPlanId(Long planId); + +} 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 new file mode 100644 index 0000000..718e3fe --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/cal/team/MesCalTeamShiftServiceImpl.java @@ -0,0 +1,236 @@ +package cn.iocoder.yudao.module.mes.service.cal.team; + +import cn.iocoder.yudao.module.mes.controller.admin.cal.team.vo.shift.MesCalTeamShiftListReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.cal.plan.MesCalPlanDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.cal.plan.MesCalPlanShiftDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.cal.plan.MesCalPlanTeamDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.cal.team.MesCalTeamShiftDO; +import cn.iocoder.yudao.module.mes.dal.mysql.cal.team.MesCalTeamShiftMapper; +import cn.iocoder.yudao.module.mes.enums.cal.MesCalShiftMethodEnum; +import cn.iocoder.yudao.module.mes.enums.cal.MesCalShiftTypeEnum; +import cn.iocoder.yudao.module.mes.service.cal.plan.MesCalPlanService; +import cn.iocoder.yudao.module.mes.service.cal.plan.MesCalPlanShiftService; +import cn.iocoder.yudao.module.mes.service.cal.plan.MesCalPlanTeamService; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.Month; +import java.time.temporal.ChronoUnit; +import java.util.List; + +/** + * MES 班组排班 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class MesCalTeamShiftServiceImpl implements MesCalTeamShiftService { + + @Resource + private MesCalTeamShiftMapper teamShiftMapper; + @Resource + @Lazy + private MesCalPlanService planService; + @Resource + @Lazy + private MesCalPlanShiftService planShiftService; + @Resource + @Lazy + private MesCalPlanTeamService planTeamService; + + @Async + @Override + public void genRecords(Long planId) { + // 1.1 查询排班计划 + MesCalPlanDO plan = planService.getPlan(planId); + // 1.2 查询计划中的班次列表 + List shifts = planShiftService.getPlanShiftListByPlanId(planId); + // 1.3 查询计划中的班组列表 + List teams = planTeamService.getPlanTeamListByPlanId(planId); + + // 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 的 + // 2.2 遍历每一天,生成排班记录 + 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++; + } + } else { + // 按天轮班:到了指定轮班天数的倍数,且不是刚开始 + if (i % plan.getShiftCount() == 0 && i != 0) { + shiftIndex++; + } + } + // 2.2 根据轮班方式生成排班记录 + // TODO @AI:要不要先把记录生成好,最后去存入数据库; + // TODO @AI:逻辑写的又点乱(复杂),看看能不能在优化下; + if (MesCalShiftTypeEnum.SINGLE.getType().equals(plan.getShiftType())) { + // 单白班:不需要倒班 + saveTeamShift(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()); + } + } + } + } + + @Override + public List getTeamShiftList(MesCalTeamShiftListReqVO reqVO) { + return teamShiftMapper.selectList(reqVO); + } + + @Override + public void deleteByPlanId(Long planId) { + teamShiftMapper.deleteByPlanId(planId); + } + + /** + * 保存班组排班记录(已存在则更新,不存在则新增) + */ + private void saveTeamShift(MesCalTeamShiftDO teamShift) { + MesCalTeamShiftDO existing = teamShiftMapper.selectByDayAndTeamId( + teamShift.getDay(), teamShift.getTeamId()); + if (existing != null) { + teamShift.setId(existing.getId()); + teamShiftMapper.updateById(teamShift); + } else { + teamShiftMapper.insert(teamShift); + } + } + + /** + * 获取指定日期所在季度的第一天 + */ + // TODO @AI:看看日期工具类,有没类似的方法 + private static LocalDate getQuarterStart(LocalDate date) { + Month month = date.getMonth(); + Month firstMonthOfQuarter = month.firstMonthOfQuarter(); + return LocalDate.of(date.getYear(), firstMonthOfQuarter, 1); + } + + /** + * 获取指定日期所在周的第一天(周一) + */ + // TODO @AI:看看日期工具类,有没类似的方法 + private static LocalDate getWeekStart(LocalDate date) { + return date.with(DayOfWeek.MONDAY); + } + +} -- libgit2 0.21.4