package com.ruoyi.projectManagement.service.impl.handle; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.ruoyi.basic.service.CustomerFollowUpFileService; import com.ruoyi.common.enums.IsDeleteEnum; import com.ruoyi.common.enums.PlanStageEnum; import com.ruoyi.projectManagement.dto.InfoStageDto; import com.ruoyi.projectManagement.dto.PlanStageDto; import com.ruoyi.projectManagement.dto.SaveInfoDto; import com.ruoyi.projectManagement.mapper.InfoStageMapper; import com.ruoyi.projectManagement.pojo.Info; import com.ruoyi.projectManagement.pojo.InfoStage; import com.ruoyi.projectManagement.vo.InfoStageVo; import com.ruoyi.projectManagement.vo.SaveInfoStageVo; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.validation.constraints.NotNull; import java.util.*; import java.util.stream.Collectors; /** * @author buhuazhen * @date 2026/3/11 * @email 3038525872@qq.com */ @Component @RequiredArgsConstructor @Transactional(rollbackFor = Exception.class, readOnly = true) public class InfoStageHandleService { private final InfoStageMapper infoStageMapper; private final InfoHandleService infoHandleService; private final CustomerFollowUpFileService customerFollowUpFileService; @Autowired @Lazy private InfoStageHandleService infoStageHandleService; @Transactional public void save(@NotNull SaveInfoStageVo saveInfoStageVo) { InfoStage infoStage = BeanUtil.copyProperties(saveInfoStageVo, InfoStage.class); // 附件处理 String attachmentIds = StrUtil.join(",", Optional.ofNullable(saveInfoStageVo.getAttachmentIds()).orElse(Collections.emptyList())); infoStage.setAttachment(attachmentIds); if (infoStage.getId() == null) { infoStageMapper.insert(infoStage); } else { infoStageMapper.updateById(infoStage); } infoStageHandleService.syncInfoStage(infoStage.getProjectManagementInfoId()); } /** * 同步项目阶段状态 * * @param infoId */ @Transactional public void syncInfoStage(@NotNull Long infoId) { SaveInfoDto infoById = infoHandleService.getInfoById(infoId); List planStage = infoById.getPlanStage(); // 获取依旧存在的阶段信息 List infoStageNow = getListDtoByInfoId(infoId); Map maxProgressMap = infoStageNow.stream() .filter(e -> e.getProjectManagementPlanNodeId() != null) .collect(Collectors.toMap( InfoStageDto::getProjectManagementPlanNodeId, e -> Optional.ofNullable(e.getProgress()).orElse(0), Integer::max )); for (PlanStageDto stage : planStage) { int progress = maxProgressMap.getOrDefault(stage.getId(), 0); stage.setPlanStageEnum(calcStage(progress)); } // 进行调整 Info info = new Info(); info.setId(infoId); info.setPlanStage(planStage); infoHandleService.updateById(info); } private PlanStageEnum calcStage(int progress) { if (progress <= 0) { return PlanStageEnum.TO_BEGIN; } else if (progress < 100) { return PlanStageEnum.ON_GOING; } return PlanStageEnum.ENDED; } @Transactional(rollbackFor = Exception.class) public void deleteById(@NotNull Long id) { InfoStage infoStage = infoStageMapper.selectById(id); if (infoStage == null) { return; } LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper(); updateWrapper.eq(InfoStage::getId, id); updateWrapper.set(InfoStage::getIsDelete, IsDeleteEnum.DELETED.getCode()); infoStageMapper.update(null, updateWrapper); infoStageHandleService.syncInfoStage(infoStage.getProjectManagementInfoId()); } public List getListDtoByInfoId(@NotNull Long infoId) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); queryWrapper.eq(InfoStage::getProjectManagementInfoId, infoId); queryWrapper.eq(InfoStage::getIsDelete, IsDeleteEnum.NOT_DELETED.getCode()); List infoStageDtos = BeanUtil.copyToList(infoStageMapper.selectList(queryWrapper), InfoStageDto.class); /* * 进行排序 先按照对应的sort进行排序,后按照创建时间排序 * 可能会出现后部情况 比如 * 立项 100% * 立项 50% 这种情况,当然也支持修改操作 */ SaveInfoDto infoById = infoHandleService.getInfoById(infoId); List planStage = infoById.getPlanStage(); // 构建 id -> sort 映射 Map stageSortMap = planStage.stream() .collect(Collectors.toMap( PlanStageDto::getId, PlanStageDto::getSort )); // 排序 infoStageDtos.sort( Comparator // 先按阶段排序 .comparing((InfoStageDto dto) -> stageSortMap.getOrDefault(dto.getProjectManagementPlanNodeId(), Integer.MAX_VALUE) ) // 再按创建时间排序 .thenComparing(InfoStageDto::getCreateTime) ); return infoStageDtos; } public List getListVoByInfoId(@NotNull Long infoId) { List listByInfoId = getListDtoByInfoId(infoId); List infoStageVos = BeanUtil.copyToList(listByInfoId, InfoStageVo.class); // 处理附件 customerFollowUpFileService.fillAttachment(infoStageVos, InfoStageVo::getAttachment, InfoStageVo::setAttachmentList); return infoStageVos; } }