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<PlanStageDto> planStage = infoById.getPlanStage();
|
|
// 获取依旧存在的阶段信息
|
List<InfoStageDto> infoStageNow = getListDtoByInfoId(infoId);
|
|
Map<Long, Integer> 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<InfoStage> updateWrapper = new LambdaUpdateWrapper<InfoStage>();
|
updateWrapper.eq(InfoStage::getId, id);
|
updateWrapper.set(InfoStage::getIsDelete, IsDeleteEnum.DELETED.getCode());
|
infoStageMapper.update(null, updateWrapper);
|
|
infoStageHandleService.syncInfoStage(infoStage.getProjectManagementInfoId());
|
}
|
|
public List<InfoStageDto> getListDtoByInfoId(@NotNull Long infoId) {
|
LambdaQueryWrapper<InfoStage> queryWrapper = new LambdaQueryWrapper<InfoStage>();
|
queryWrapper.eq(InfoStage::getProjectManagementInfoId, infoId);
|
queryWrapper.eq(InfoStage::getIsDelete, IsDeleteEnum.NOT_DELETED.getCode());
|
List<InfoStageDto> infoStageDtos = BeanUtil.copyToList(infoStageMapper.selectList(queryWrapper), InfoStageDto.class);
|
|
/*
|
* 进行排序 先按照对应的sort进行排序,后按照创建时间排序
|
* 可能会出现后部情况 比如
|
* 立项 100%
|
* 立项 50% 这种情况,当然也支持修改操作
|
*/
|
SaveInfoDto infoById = infoHandleService.getInfoById(infoId);
|
List<PlanStageDto> planStage = infoById.getPlanStage();
|
|
// 构建 id -> sort 映射
|
Map<Long, Integer> 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<InfoStageVo> getListVoByInfoId(@NotNull Long infoId) {
|
List<InfoStageDto> listByInfoId = getListDtoByInfoId(infoId);
|
List<InfoStageVo> infoStageVos = BeanUtil.copyToList(listByInfoId, InfoStageVo.class);
|
// 处理附件
|
customerFollowUpFileService.fillAttachment(infoStageVos, InfoStageVo::getAttachment, InfoStageVo::setAttachmentList);
|
return infoStageVos;
|
}
|
|
|
}
|