package com.gkhy.safePlatform.account.service.impl; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.gkhy.safePlatform.account.entity.schedule.*; import com.gkhy.safePlatform.account.enums.UserStatusEnum; import com.gkhy.safePlatform.account.enums.schedule.GroupStatusEnum; import com.gkhy.safePlatform.account.enums.schedule.GroupStrategyCycleTypeEnum; import com.gkhy.safePlatform.account.enums.schedule.GroupStrategyStatusEnum; import com.gkhy.safePlatform.account.model.dto.req.GroupStrategyAddReqDTO; import com.gkhy.safePlatform.account.model.dto.req.GroupStrategyModReqDTO; import com.gkhy.safePlatform.account.model.dto.resp.GroupInfoRespDTO; import com.gkhy.safePlatform.account.model.dto.resp.GroupStrategyInfoRespDTO; import com.gkhy.safePlatform.account.model.dto.resp.GroupStrategyRespDTO; import com.gkhy.safePlatform.account.model.query.GroupStrategyPageQuery; import com.gkhy.safePlatform.account.model.query.GroupStrategyQuery; import com.gkhy.safePlatform.account.model.query.db.GroupStrategyDBQuery; import com.gkhy.safePlatform.account.model.query.db.GroupStrategyPageDBQuery; import com.gkhy.safePlatform.account.service.GroupStrategyService; import com.gkhy.safePlatform.account.service.baseService.*; import com.gkhy.safePlatform.commons.co.ContextCacheUser; import com.gkhy.safePlatform.commons.enums.E; import com.gkhy.safePlatform.commons.enums.ResultCodes; import com.gkhy.safePlatform.commons.exception.AusinessException; import com.gkhy.safePlatform.commons.exception.BusinessException; import com.gkhy.safePlatform.commons.query.PageQuery; import com.gkhy.safePlatform.commons.utils.StringUtils; import com.gkhy.safePlatform.commons.vo.SearchResultVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @Service("groupStrategyService") public class GroupStrategyServiceImpl implements GroupStrategyService { @Autowired private GroupInfoService groupInfoService; @Autowired private GroupStrategyInfoService groupStrategyInfoService; @Autowired private TimeStrategyInfoSerive timeStrategyInfoSerive; @Autowired private WorkTimeGroupInfoService workTimeGroupInfoService; @Autowired private WorkTimePeriodInfoService workTimePeriodInfoService; @Override @Transactional public void addGroupStrategy(ContextCacheUser currentUser, GroupStrategyAddReqDTO groupStrategyAddReqDTO) { ; if (groupStrategyAddReqDTO.getGroupIds() == null || groupStrategyAddReqDTO.getTimeStrategyId() == null || groupStrategyAddReqDTO.getGroupStrategyCycleType() == null) { throw new BusinessException(ResultCodes.CLIENT_PARAM_NULL); } if (StringUtils.isBlank(groupStrategyAddReqDTO.getGroupStrategyName())) { throw new AusinessException(E.DATA_PARAM_NULL, "班组策略名称为空"); } if (groupStrategyAddReqDTO.getGroupIds().size() == 0) { throw new AusinessException(E.DATA_PARAM_NULL, "班组数量为0"); } if (groupStrategyAddReqDTO.getCycleStartTime() == null) { throw new AusinessException(E.DATA_PARAM_NULL, "开始时间为空"); } if (!groupStrategyAddReqDTO.getCycleStartTime().isAfter(LocalDate.now())) { throw new AusinessException(E.DATA_PARAM_CHECK_INVALID, "开始时间需要今日后"); } GroupStrategyCycleTypeEnum cycle = GroupStrategyCycleTypeEnum.parse(groupStrategyAddReqDTO.getGroupStrategyCycleType()); if (cycle == null) { throw new AusinessException(E.DATA_STATUS_NOT_EXIST, "循环类型不合法"); } for (Long groupId : groupStrategyAddReqDTO.getGroupIds()) { GroupInfoDO groupInfo = groupInfoService.getGroupInfoById(groupId); if (groupInfo == null) { throw new AusinessException(E.DATA_DATABASE_NO_EXISTENT, "班组不存在"); } // 是否已绑定其他班组 GroupStrategyInfoDO groupStrategyInfoDO = groupInfoService.getGroupStrategyByGroupId(groupId); if (groupStrategyInfoDO != null) { throw new AusinessException(E.DATA_DATABASE_EXIST,"班组已有时间策略"); } } TimeStrategyInfo timeStrategyById = timeStrategyInfoSerive.getTimeStrategyById(groupStrategyAddReqDTO.getTimeStrategyId()); if (timeStrategyById == null) { throw new AusinessException(E.DATA_DATABASE_NO_EXISTENT, "时间策略不存在"); } // 1.班组策略保存 GroupStrategyInfo groupStrategyInfo = new GroupStrategyInfo(); groupStrategyInfo.setName(groupStrategyAddReqDTO.getGroupStrategyName().trim()); groupStrategyInfo.setInfo(groupStrategyAddReqDTO.getGroupStrategyInfo()); groupStrategyInfo.setTimeStrategyId(groupStrategyAddReqDTO.getTimeStrategyId()); groupStrategyInfo.setCreateUid(currentUser.getUid()); groupStrategyInfo.setGmtCreate(new Date()); groupStrategyInfo.setCreateBy(currentUser.getRealName()); groupStrategyInfo.setStatus(GroupStrategyStatusEnum.ENABLED.getCode()); groupStrategyInfo.setCycle(cycle.getCode()); groupStrategyInfo.setCycleStartTime(groupStrategyAddReqDTO.getCycleStartTime()); groupStrategyInfoService.save(groupStrategyInfo); // 2.多个班组 List groupStrategyMembers = new ArrayList<>(); GroupInfo groupInfo; for (Long groupId :groupStrategyAddReqDTO.getGroupIds()) { groupInfo = new GroupInfo(); groupInfo.setId(groupId); groupInfo.setGroupStrategyId(groupStrategyInfo.getId()); groupStrategyMembers.add(groupInfo); } groupInfoService.updateBatchById(groupStrategyMembers); // 同步消息触发班组任务生成 } @Override @Transactional public void modGroupStrategy(ContextCacheUser currentUser, GroupStrategyModReqDTO groupStrategyModReqDTO) { ; if (groupStrategyModReqDTO.getGroupStrategyId() == null || groupStrategyModReqDTO.getGroupIds() == null || groupStrategyModReqDTO.getTimeStrategyId() == null || groupStrategyModReqDTO.getGroupStrategyCycleType() == null) { throw new BusinessException(ResultCodes.CLIENT_PARAM_NULL); } if (StringUtils.isBlank(groupStrategyModReqDTO.getGroupStrategyName())) { throw new AusinessException(E.DATA_PARAM_NULL, "班组策略名称为空"); } if (groupStrategyModReqDTO.getGroupIds().size() == 0) { throw new AusinessException(E.DATA_PARAM_NULL, "班组数量为0"); } if (groupStrategyModReqDTO.getCycleStartTime() == null) { throw new AusinessException(E.DATA_PARAM_NULL, "开始时间为空"); } if (!groupStrategyModReqDTO.getCycleStartTime().isAfter(LocalDate.now())) { throw new AusinessException(E.DATA_PARAM_CHECK_INVALID, "开始时间需要今日后"); } GroupStrategyCycleTypeEnum cycle = GroupStrategyCycleTypeEnum.parse(groupStrategyModReqDTO.getGroupStrategyCycleType()); if (cycle == null) { throw new AusinessException(E.DATA_STATUS_NOT_EXIST, "循环类型不合法"); } TimeStrategyInfo timeStrategyInfo = timeStrategyInfoSerive.getTimeStrategyById(groupStrategyModReqDTO.getTimeStrategyId()); if (timeStrategyInfo == null) { throw new AusinessException(E.DATA_DATABASE_NO_EXISTENT, "时间策略不存在"); } if (!timeStrategyInfo.getStatus().equals(GroupStatusEnum.ENABLED.getCode())) { throw new AusinessException(E.DATA_DATABASE_EXIST_BUT_NOT_VALID, "时间策略不存在"); } GroupStrategyInfoDO groupStrategyInfoDO = groupStrategyInfoService.getGroupStrategyInfoById(groupStrategyModReqDTO.getGroupStrategyId()); if (groupStrategyInfoDO == null) { throw new AusinessException(E.DATA_DATABASE_NO_EXISTENT, "班组策略不存在"); } if (!groupStrategyInfoDO.getStatus().equals(GroupStatusEnum.ENABLED.getCode())) { throw new AusinessException(E.DATA_DATABASE_EXIST_BUT_NOT_VALID, "班组策略不存在"); } // 获取班组策略的所有班组id List groupIdsOrigin = groupInfoService.listGroupIdsByGroupStrategyId(groupStrategyModReqDTO.getGroupStrategyId()); List groupIds = groupStrategyModReqDTO.getGroupIds(); // for (Long groupId : groupIds) { GroupInfoDO groupInfo = groupInfoService.getGroupInfoById(groupId); if (groupInfo == null) { throw new AusinessException(E.DATA_DATABASE_NO_EXISTENT, "班组不存在"); } if (!groupInfo.getStatus().equals(GroupStatusEnum.ENABLED.getCode())) { throw new AusinessException(E.DATA_DATABASE_EXIST_BUT_NOT_VALID, "班组不存在"); } // 是否已绑定其他班组 GroupStrategyInfoDO groupStrategyInfo = groupInfoService.getGroupStrategyByGroupId(groupId); if (groupStrategyInfo != null && !groupStrategyInfo.getId().equals(groupStrategyModReqDTO.getGroupStrategyId())) { throw new AusinessException(E.DATA_DATABASE_EXIST,"班组已有时间策略"); } } // 1.更新班组策略 GroupStrategyInfo groupStrategyInfo = new GroupStrategyInfo(); groupStrategyInfo.setId(groupStrategyInfoDO.getId()); groupStrategyInfo.setName(groupStrategyModReqDTO.getGroupStrategyName().trim()); groupStrategyInfo.setInfo(groupStrategyModReqDTO.getGroupStrategyInfo()); groupStrategyInfo.setEditUid(currentUser.getUid()); groupStrategyInfo.setEditBy(currentUser.getRealName()); groupStrategyInfo.setGmtModified(new Date()); groupStrategyInfo.setTimeStrategyId(timeStrategyInfo.getId()); groupStrategyInfo.setCycle(cycle.getCode()); groupStrategyInfo.setCycleStartTime(groupStrategyModReqDTO.getCycleStartTime()); groupStrategyInfoService.updateById(groupStrategyInfo); // 2.更新班组 List toDelGroupIds = groupIdsOrigin.stream().filter(item -> !groupIds.contains(item)).collect(Collectors.toList()); List toAddGroupIds = groupIds.stream().filter(item -> !groupIdsOrigin.contains(item)).collect(Collectors.toList()); List groupStrategyMemberInfos; GroupInfo groupInfo; if (toAddGroupIds.size() > 0) { groupStrategyMemberInfos = new ArrayList<>(); for (Long groupId : toAddGroupIds) { groupInfo = new GroupInfo(); groupInfo.setGroupStrategyId(groupStrategyInfoDO.getId()); groupInfo.setId(groupId); groupStrategyMemberInfos.add(groupInfo); } groupInfoService.updateBatchById(groupStrategyMemberInfos); } // 删除 if (toDelGroupIds.size() > 0) { groupInfoService.unbindBatchGroupStrategyByGroupIds(toDelGroupIds); } } @Override @Transactional public void delGroupStrategy(ContextCacheUser currentUser, Long groupStrategyId) { ; if (groupStrategyId == null) { throw new BusinessException(ResultCodes.CLIENT_PARAM_NULL); } GroupStrategyInfoDO groupStrategyInfoDO = groupStrategyInfoService.getGroupStrategyInfoById(groupStrategyId); if (groupStrategyInfoDO == null) { throw new AusinessException(E.DATA_DATABASE_NO_EXISTENT, "班组策略不存在"); } if (!groupStrategyInfoDO.getStatus().equals(GroupStatusEnum.ENABLED.getCode())) { throw new AusinessException(E.DATA_DATABASE_EXIST_BUT_NOT_VALID, "班组策略不存在"); } // 1.删除 GroupStrategyInfo groupStrategyInfo = new GroupStrategyInfo(); groupStrategyInfo.setId(groupStrategyInfoDO.getId()); groupStrategyInfo.setEditBy(currentUser.getRealName()); groupStrategyInfo.setEditUid(currentUser.getUid()); groupStrategyInfo.setGmtModified(new Date()); groupStrategyInfo.setStatus(GroupStrategyStatusEnum.ABANDONED.getCode()); groupStrategyInfoService.updateById(groupStrategyInfo); // 2.解除组绑定策略 groupInfoService.unbindGroupStrategyByGroupStrategyId(groupStrategyId); } @Override public SearchResultVO> listGroupStrategyByPage(ContextCacheUser currentUser, PageQuery pageQuery) { ; Page page = new Page<>(pageQuery.getPageIndex(), pageQuery.getPageSize()); GroupStrategyPageDBQuery dbQuery = new GroupStrategyPageDBQuery(); if (pageQuery.getSearchParams() != null) { dbQuery.setGroupStrategyName(pageQuery.getSearchParams().getGroupStrategyName()); } // 分页查询 List dbData = groupStrategyInfoService.listGroupStrategyInfos(page, dbQuery); // 返回data List resultPageData = new ArrayList<>(dbData.size()); if (dbData.size() > 0) { GroupStrategyRespDTO respDTO; GroupStrategyStatusEnum statusEnum; for (GroupStrategyInfo groupStrategyInfo : dbData) { respDTO = new GroupStrategyRespDTO(); respDTO.setGroupStrategyId(groupStrategyInfo.getId()); respDTO.setGroupStrategyName(groupStrategyInfo.getName()); respDTO.setTimeStrategyId(groupStrategyInfo.getTimeStrategyId()); respDTO.setCycle(groupStrategyInfo.getCycle()); respDTO.setCycleStartTime(groupStrategyInfo.getCycleStartTime()); respDTO.setCreateBy(groupStrategyInfo.getCreateBy()); respDTO.setGmtCreate(groupStrategyInfo.getGmtCreate()); respDTO.setEditBy(groupStrategyInfo.getEditBy()); respDTO.setGmtModified(groupStrategyInfo.getGmtModified()); GroupStrategyCycleTypeEnum cycleTypeEnum = GroupStrategyCycleTypeEnum.parse(groupStrategyInfo.getCycle()); // 周期 if (cycleTypeEnum != null) { respDTO.setCycleDesc(cycleTypeEnum.getValue()); } // 状态 respDTO.setStatus(groupStrategyInfo.getStatus()); statusEnum = GroupStrategyStatusEnum.parse(groupStrategyInfo.getStatus()); if (statusEnum != null) { respDTO.setStatusDesc(statusEnum.getValue()); } // 是否包含组成员返回 List groups = Collections.emptyList(); if (pageQuery.getSearchParams().isContainGroupEnable()) { List groupInfoDOS = groupInfoService.listGroupInfoDOsByGroupStrategyId(groupStrategyInfo.getId()); groups = new ArrayList<>(groupInfoDOS.size()); GroupInfoRespDTO groupInfoRespDTO; GroupStatusEnum groupStatusEnum; for (GroupInfoDO groupInfoDO : groupInfoDOS) { groupInfoRespDTO = new GroupInfoRespDTO(); groupInfoRespDTO.setGroupId(groupInfoDO.getId()); groupInfoRespDTO.setGroupName(groupInfoDO.getName()); groupInfoRespDTO.setGroupInfo(groupInfoDO.getInfo()); groupInfoRespDTO.setGroupStrategyId(groupInfoDO.getGroupStrategyId()); groupInfoRespDTO.setStatus(groupInfoDO.getStatus()); groupStatusEnum = GroupStatusEnum.parse(groupInfoDO.getStatus()); if (groupStatusEnum != null) { groupInfoRespDTO.setStatusDesc(groupStatusEnum.getValue()); } groups.add(groupInfoRespDTO); } } respDTO.setGroups(groups); resultPageData.add(respDTO); } } return new SearchResultVO<>( true, page.getCurrent(), page.getSize(), page.getPages(), page.getTotal(), resultPageData, ResultCodes.OK ); } @Override public List listGroupStrategy(ContextCacheUser currentUser, GroupStrategyQuery query) { ; GroupStrategyDBQuery dbQuery = new GroupStrategyDBQuery(); dbQuery.setGroupStrategyName(query.getGroupStrategyName()); dbQuery.setTimeStrategyId(query.getTimeStrategyId()); List groupStrategyInfoDOs = groupStrategyInfoService.listGroupStrategyInfos(dbQuery); List respDTOS = new ArrayList<>(groupStrategyInfoDOs.size()); if (groupStrategyInfoDOs.size() > 0) { GroupStrategyInfoRespDTO respDTO; GroupStrategyCycleTypeEnum cycleTypeEnum; GroupStrategyStatusEnum strategyStatusEnum; for (GroupStrategyInfoDO groupStrategyInfoDO : groupStrategyInfoDOs) { respDTO = new GroupStrategyInfoRespDTO(); respDTO.setGroupStrategyId(groupStrategyInfoDO.getId()); respDTO.setGroupStrategyName(groupStrategyInfoDO.getName()); respDTO.setGroupStrategyInfo(groupStrategyInfoDO.getInfo()); respDTO.setTimeStrategyId(groupStrategyInfoDO.getTimeStrategyId()); respDTO.setCycleStartTime(groupStrategyInfoDO.getCycleStartTime()); respDTO.setCycle(groupStrategyInfoDO.getCycle()); cycleTypeEnum = GroupStrategyCycleTypeEnum.parse(groupStrategyInfoDO.getCycle()); if (cycleTypeEnum != null) { respDTO.setCycleDesc(cycleTypeEnum.getValue()); } respDTO.setStatus(groupStrategyInfoDO.getStatus()); strategyStatusEnum = GroupStrategyStatusEnum.parse(groupStrategyInfoDO.getStatus()); if (strategyStatusEnum != null) { respDTO.setStatusDesc(strategyStatusEnum.getValue()); } // 是否包含班组 List groups = Collections.emptyList(); if (query.isContainGroupEnable()) { List groupInfoDOS = groupInfoService.listGroupInfoDOsByGroupStrategyId(groupStrategyInfoDO.getId()); groups = new ArrayList<>(groupInfoDOS.size()); GroupInfoRespDTO groupInfoRespDTO; GroupStatusEnum groupStatusEnum; for (GroupInfoDO groupInfoDO : groupInfoDOS) { groupInfoRespDTO = new GroupInfoRespDTO(); groupInfoRespDTO.setGroupId(groupInfoDO.getId()); groupInfoRespDTO.setGroupName(groupInfoDO.getName()); groupInfoRespDTO.setGroupInfo(groupInfoDO.getInfo()); groupInfoRespDTO.setGroupStrategyId(groupInfoDO.getGroupStrategyId()); groupInfoRespDTO.setStatus(groupInfoDO.getStatus()); groupStatusEnum = GroupStatusEnum.parse(groupInfoDO.getStatus()); if (groupStatusEnum != null) { groupInfoRespDTO.setStatusDesc(groupStatusEnum.getValue()); } groups.add(groupInfoRespDTO); } } respDTO.setGroups(groups); respDTOS.add(respDTO); } } return respDTOS; } }