diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/oem/service/impl/OemSettlementApprovalServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/oem/service/impl/OemSettlementApprovalServiceImpl.java index 695d08f35..9c85e91d2 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/oem/service/impl/OemSettlementApprovalServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/oem/service/impl/OemSettlementApprovalServiceImpl.java @@ -340,15 +340,15 @@ public class OemSettlementApprovalServiceImpl extends BaseServiceImpl stoneList = fmProjectApplication.getStoneList(); - if(CollectionUtils.isNotEmpty(stoneList)){ - //子项全删全增 - List oldStoneList = fmProjectMilestoneService.list(Wrappers.lambdaQuery().eq(FmProjectMilestoneEntity::getPaId,fmProjectApplication.getId())); - List stoneIdList = oldStoneList.stream().map(BaseEntity::getId).collect(Collectors.toList()); - if(CollectionUtils.isNotEmpty(stoneIdList)){ - fmProjectMilestoneService.deleteLogic(stoneIdList); - } - stoneList.forEach(item -> { - item.setId(null); - item.setPaId(fmProjectApplication.getId()); - }); - fmProjectMilestoneService.saveBatch(stoneList); - } - return R.status(fmProjectApplicationService.updateById(fmProjectApplication)); + return fmProjectApplicationService.updateOrSave(fmProjectApplication); } /** @@ -163,8 +151,9 @@ public class FmProjectApplicationController extends BladeController { @ApiOperationSupport(order = 6) @Operation(summary = "新增或修改", description = "传入fmProjectApplication") public R submit(@Valid @RequestBody FmProjectApplicationEntity fmProjectApplication) { - if(fmProjectApplication.getId()==null||0==fmProjectApplication.getId()) - fmProjectApplication.setPaCode(nextCode()); + if(fmProjectApplication.getId()==null||0==fmProjectApplication.getId()) { + fmProjectApplication.setPaCode(fmProjectApplicationService.nextCode()); + } if(fmProjectApplication.getTouchingTime()==null){ fmProjectApplication.setTouchingTime(new Date()); } @@ -213,33 +202,43 @@ public class FmProjectApplicationController extends BladeController { List list = fmProjectApplicationService.exportFmProjectApplication(queryWrapper); ExcelUtil.export(response, "项目管理数据" + DateUtil.time(), "项目管理数据表", list, FmProjectApplicationExcel.class); } - public String nextCode() { - // 自增总长度 - int len = 3; - // 自增值 - int num = 0; - // 编码模式 - String codePattern = new SimpleDateFormat("yyyyMMdd").format(new Date()); - // 当前模式下最大编码 - List pgrList = fmProjectApplicationService.list( - new QueryWrapper().lambda() - .likeRight(FmProjectApplicationEntity::getPaCode, codePattern) - .orderByDesc(FmProjectApplicationEntity::getPaCode)); - FmProjectApplicationEntity pgr = pgrList.size() > 0 ? pgrList.get(0) : null; - if (pgr != null) { - num = Integer.parseInt(pgr.getPaCode().substring(codePattern.length(), codePattern.length() + len)); - } - num++; - // 下个编码 - return codePattern + prefix(String.valueOf(num), "0", len); + + /** + * 项目管理 立项(新增) + * 立项后状态设置为待审批,不立即进入审批环节 + */ + @PostMapping("/createApplication") + @ApiOperationSupport(order = 10) + @Operation(summary = "立项", description = "传入fmProjectApplication,立项后状态为待审批") + public R createApplication(@Valid @RequestBody FmProjectApplicationEntity fmProjectApplication) { + return R.status(fmProjectApplicationService.createApplication(fmProjectApplication)); } - public static final String prefix(String StringToFix, String fixChar, int targetLen) { - int len = StringToFix.length(); - for(int i = 0; i < targetLen - len; i += fixChar.length()) { - StringToFix = fixChar + StringToFix; - } - return StringToFix; + /** + * 项目管理 提交审批 + * 仅对待审批状态的项目生效,提交后进入审批环节 + */ + @GetMapping("/submitApproval") + @ApiOperationSupport(order = 11) + @Operation(summary = "提交审批", description = "传入项目ID,仅对待审批状态的项目生效") + public R submitApproval(@Parameter(description = "项目ID", required = true) @RequestParam Long id, + @Parameter(description = "审批人", required = true) @RequestParam Long approverId, + @Parameter(description = "审批人名称", required = true) @RequestParam String approverName) { + + fmProjectApplicationService.submitApproval(id,approverId,approverName); + return R.success("提交审批成功"); + } + + + /** + * 项目管理 审批 + */ + @PostMapping("/approval") + @ApiOperationSupport(order = 5) + @Operation(summary = "修改", description = "传入fmProjectApplication") + public R approval(@Valid @RequestBody FmProjectApplicationEntity fmProjectApplication) { + fmProjectApplicationService.approval(fmProjectApplication); + return R.success("审批成功"); } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/controller/FmProjectMilestoneController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/controller/FmProjectMilestoneController.java index 0fdcc80c8..bd5bd0292 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/controller/FmProjectMilestoneController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/controller/FmProjectMilestoneController.java @@ -25,6 +25,7 @@ */ package org.springblade.desk.process.controller; +import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; @@ -52,6 +53,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; +import java.util.Objects; /** * 项目里程碑 控制器 @@ -164,6 +166,9 @@ public class FmProjectMilestoneController extends BladeController { @ApiOperationSupport(order = 10) @Operation(summary = "执行", description = "传入fmProjectMilestone") public R projectExecute(@Valid @RequestBody FmProjectMilestoneEntity fmProjectMilestone) { + if (BeanUtil.isEmpty(fmProjectMilestone) || Objects.isNull(fmProjectMilestone.getId())) { + throw new RuntimeException("参数异常"); + } return R.status(fmProjectMilestoneService.projectExecute(fmProjectMilestone)); } /** diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/entity/FmProjectApplicationEntity.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/entity/FmProjectApplicationEntity.java index a27efa1cc..0ef02e6a8 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/entity/FmProjectApplicationEntity.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/entity/FmProjectApplicationEntity.java @@ -159,12 +159,109 @@ public class FmProjectApplicationEntity extends BaseEntity { */ @Schema(description = "成员名称") private String memberName; + + /**APPROVAL_MAN + * 审批人 + * */ + @Schema(description = "审批人") + private Long approvalMan; + /** + * APPROVAL_MAN_NAME + * 审批人名称 + */ + @Schema(description = "审批人名称") + private String approvalManName; /** * 审批状态 */ @Schema(description = "审批状态") private Long approvalStatus; + public enum ApprovalStatusEnum { + /** + * 立项待提交 + */ + STATUS_DRAFT(0L, "立项待提交"), + /** + * 立项待审 + */ + STATUS_PENDING(1L, "立项待审"), + /** + * 立项审批不通过 + */ + STATUS_REJECTED(2L, "立项审批不通过"), + /** + * 项目进行中 + */ + STATUS_IN_PROGRESS(3L, "项目进行中"), + /** + * 项目待核查 + */ + STATUS_PENDING_CHECK(4L, "项目待核查"), + /** + * 项目核查不通过 + */ + STATUS_CHECK_REJECTED(5L, "项目核查不通过"), + /** + * 项目待核准 + */ + STATUS_PENDING_APPROVAL(6L, "项目待核准"), + /** + * 项目核准不通过 + */ + STATUS_APPROVAL_REJECTED(7L, "项目核准不通过"), + /** + * 项目已核准 + */ + STATUS_APPROVED(8L, "项目已核准"); + + private final Long code; + private final String desc; + + ApprovalStatusEnum(Long code, String desc) { + this.code = code; + this.desc = desc; + } + + public Long getCode() { + return code; + } + + public String getDesc() { + return desc; + } + + /** + * 根据 code 获取描述 + */ + public static String getDescByCode(Long code) { + if (code == null) { + return ""; + } + for (ApprovalStatusEnum status : values()) { + if (status.getCode().equals(code)) { + return status.getDesc(); + } + } + return ""; + } + + /** + * 根据 code 获取枚举 + */ + public static ApprovalStatusEnum getByCode(Long code) { + if (code == null) { + return null; + } + for (ApprovalStatusEnum status : values()) { + if (status.getCode().equals(code)) { + return status; + } + } + return null; + } + } + @TableField(exist = false) private List stoneList; diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/entity/FmProjectMilestoneEntity.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/entity/FmProjectMilestoneEntity.java index 49c7baccd..a1a88f0bd 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/entity/FmProjectMilestoneEntity.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/entity/FmProjectMilestoneEntity.java @@ -157,8 +157,14 @@ public class FmProjectMilestoneEntity extends BaseEntity { /** * 评价人 */ - @Schema(description = "评价人") + @Schema(description = "评价人名称") private String gradeMan; + + /** + * 评价人 + */ + @Schema(description = "评价人Id") + private Long gradeManId; /** * 业务领导评价 */ @@ -182,6 +188,18 @@ public class FmProjectMilestoneEntity extends BaseEntity { @Schema(description = "附件ID") private String fileId; + /** + * 下一节点审批人ID(用于存储用户选择的审批人) + */ + @Schema(description = "下一节点审批人ID") + private Long nextApproverId; + + /** + * 下一节点审批人姓名(冗余字段,便于展示) + */ + @Schema(description = "下一节点审批人姓名") + private String nextApproverName; + /** * 评价等级 未评价 */ @@ -270,7 +288,7 @@ public class FmProjectMilestoneEntity extends BaseEntity { */ public static Short CHECK_RESULT_NO = 3; - public static Map checkResultMap = new HashMap<>(3); + public static Map checkResultMap = new HashMap<>(4); static { checkResultMap.put(CHECK_RESULT_NULL, "未核查"); diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/IFmProjectApplicationService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/IFmProjectApplicationService.java index b88088fa7..e7784544a 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/IFmProjectApplicationService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/IFmProjectApplicationService.java @@ -28,6 +28,7 @@ package org.springblade.desk.process.service; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseService; +import org.springblade.core.tool.api.R; import org.springblade.desk.process.excel.FmProjectApplicationExcel; import org.springblade.desk.process.pojo.entity.FmProjectApplicationEntity; import org.springblade.desk.process.pojo.vo.FmProjectApplicationVO; @@ -59,4 +60,29 @@ public interface IFmProjectApplicationService extends BaseService exportFmProjectApplication(Wrapper queryWrapper); + /** + * 项目立项(新增) + * 立项后状态设置为待审批,不立即进入审批环节 + * + * @param fmProjectApplication 项目申请实体 + * @return 是否成功 + */ + boolean createApplication(FmProjectApplicationEntity fmProjectApplication); + + /** + * 提交审批 + * 仅对待审批状态的项目生效,提交后进入审批环节 + * + * @param id 项目ID + * @return 是否成功 + */ + void submitApproval(Long id,Long approverId,String approverName); + + String nextCode(); + + R updateOrSave(FmProjectApplicationEntity fmProjectApplication); + + + void approval(FmProjectApplicationEntity fmProjectApplication); + } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/impl/FmProjectApplicationServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/impl/FmProjectApplicationServiceImpl.java index 974821f6b..d43a073e0 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/impl/FmProjectApplicationServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/impl/FmProjectApplicationServiceImpl.java @@ -25,17 +25,43 @@ */ package org.springblade.desk.process.service.impl; +import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import jakarta.annotation.Resource; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseEntity; import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.Func; +import org.springblade.desk.common.feign.MesNotifyMessageClient; +import org.springblade.desk.common.pojo.entity.MesNotifyMessageEntity; +import org.springblade.desk.oem.pojo.entity.OemSettlementApprovalEntity; import org.springblade.desk.process.excel.FmProjectApplicationExcel; import org.springblade.desk.process.mapper.FmProjectApplicationMapper; import org.springblade.desk.process.pojo.entity.FmProjectApplicationEntity; +import org.springblade.desk.process.pojo.entity.FmProjectMilestoneEntity; import org.springblade.desk.process.pojo.vo.FmProjectApplicationVO; import org.springblade.desk.process.service.IFmProjectApplicationService; +import org.springblade.desk.process.service.IFmProjectMilestoneService; +import org.springblade.system.feign.IUserClient; +import org.springblade.system.pojo.entity.User; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; /** * 项目管理 服务实现类 @@ -43,21 +69,242 @@ import java.util.List; * @author BladeX * @since 2026-01-07 */ +@Slf4j @Service +@AllArgsConstructor public class FmProjectApplicationServiceImpl extends BaseServiceImpl implements IFmProjectApplicationService { - @Override - public IPage selectFmProjectApplicationPage(IPage page, FmProjectApplicationVO fmProjectApplication) { - return page.setRecords(baseMapper.selectFmProjectApplicationPage(page, fmProjectApplication)); - } + private final IFmProjectMilestoneService fmProjectMilestoneService; + private final IUserClient userClient; + private final MesNotifyMessageClient mesNotifyMessageClient; + + @Override + public IPage selectFmProjectApplicationPage(IPage page, FmProjectApplicationVO fmProjectApplication) { + return page.setRecords(baseMapper.selectFmProjectApplicationPage(page, fmProjectApplication)); + } + + + @Override + public List exportFmProjectApplication(Wrapper queryWrapper) { + List fmProjectApplicationList = baseMapper.exportFmProjectApplication(queryWrapper); + //fmProjectApplicationList.forEach(fmProjectApplication -> { + // fmProjectApplication.setTypeName(DictCache.getValue(DictEnum.YES_NO, FmProjectApplication.getType())); + //}); + return fmProjectApplicationList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean createApplication(FmProjectApplicationEntity fmProjectApplication) { + if (fmProjectApplication == null) { + return false; + } + // 新增时生成单据号 + if (fmProjectApplication.getId() == null || fmProjectApplication.getId() == 0) { + fmProjectApplication.setPaCode(nextCode()); + } + // 设置制单时间 + if (fmProjectApplication.getTouchingTime() == null) { + fmProjectApplication.setTouchingTime(new Date()); + } + // 获取当前用户信息 + BladeUser bladeUser = AuthUtil.getUser(); + if (bladeUser != null) { + User user = userClient.userInfoById(bladeUser.getUserId()).getData(); + if (user != null) { + fmProjectApplication.setTouchingMan(user.getRealName()); + fmProjectApplication.setTouchingManId(String.valueOf(bladeUser.getUserId())); + } + } + // 设置状态为待审批(0) + fmProjectApplication.setApprovalStatus(FmProjectApplicationEntity.ApprovalStatusEnum.STATUS_DRAFT.getCode()); + + // 保存主表 + boolean flag = this.saveOrUpdate(fmProjectApplication); + if (flag) { + // 处理子表(里程碑) + List stoneList = fmProjectApplication.getStoneList(); + if (CollectionUtils.isNotEmpty(stoneList)) { + // 先删除旧的子表数据 + fmProjectMilestoneService.remove(Wrappers.lambdaQuery(FmProjectMilestoneEntity.class) + .eq(FmProjectMilestoneEntity::getPaId, fmProjectApplication.getId())); + // 设置关联ID并批量保存 + stoneList.forEach(x -> { + x.setId(null); + x.setPaId(fmProjectApplication.getId()); + }); + return fmProjectMilestoneService.saveBatch(stoneList); + } + return true; + } + return false; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void submitApproval(Long id,Long approverId,String approverName) { + // 查询项目信息 + FmProjectApplicationEntity application = this.getById(id); + if (BeanUtil.isEmpty(application)) { + throw new RuntimeException("项目信息不存在"); + } + // 判断是否为待审批状态 + if (Objects.isNull(application.getApprovalStatus()) || + !application.getApprovalStatus().equals(FmProjectApplicationEntity.ApprovalStatusEnum.STATUS_DRAFT.getCode())) { + throw new RuntimeException("项目信息不是待审批状态"); + } + // 用户所选审批人 + // TODO: 2026/5/27 是否校验是否为节点配置审批人 + R userR = userClient.userInfoById(approverId); + if (!userR.isSuccess() || Objects.isNull(userR.getData())) { + throw new RuntimeException("审批人信息不存在"); + } + User user = userR.getData(); + if (!Objects.equals(user.getName(), approverName)) { + throw new RuntimeException("审批人信息不一致"); + } + application.setApprovalMan(approverId); + application.setApprovalManName(approverName); + + application.setApprovalStatus(FmProjectApplicationEntity.ApprovalStatusEnum.STATUS_PENDING.getCode()); + + //向审批人发送通知 + sendNotificationToAuditLeader(application); + this.updateById(application); + + } + + /** + * 生成下一个单据号 + */ @Override - public List exportFmProjectApplication(Wrapper queryWrapper) { - List fmProjectApplicationList = baseMapper.exportFmProjectApplication(queryWrapper); - //fmProjectApplicationList.forEach(fmProjectApplication -> { - // fmProjectApplication.setTypeName(DictCache.getValue(DictEnum.YES_NO, FmProjectApplication.getType())); - //}); - return fmProjectApplicationList; - } + public String nextCode() { + // 自增总长度 + int len = 3; + // 自增值 + int num = 0; + // 编码模式 + String codePattern = new SimpleDateFormat("yyyyMMdd").format(new Date()); + // 当前模式下最大编码 + List pgrList = this.list( + new QueryWrapper().lambda() + .likeRight(FmProjectApplicationEntity::getPaCode, codePattern) + .orderByDesc(FmProjectApplicationEntity::getPaCode)); + FmProjectApplicationEntity pgr = pgrList.size() > 0 ? pgrList.get(0) : null; + if (pgr != null) { + num = Integer.parseInt(pgr.getPaCode().substring(codePattern.length(), codePattern.length() + len)); + } + num++; + // 下个编码 + return codePattern + prefix(String.valueOf(num), "0", len); + } + + @Override + public R updateOrSave(FmProjectApplicationEntity fmProjectApplication) { + //针对审批校验 + if (Objects.isNull(fmProjectApplication.getId())) { + throw new RuntimeException("项目信息不存在"); + } + FmProjectApplicationEntity entity = getById(fmProjectApplication.getId()); + if (Objects.isNull(entity) || + !FmProjectApplicationEntity.ApprovalStatusEnum.STATUS_DRAFT.getCode().equals(entity.getApprovalStatus()) || + !FmProjectApplicationEntity.ApprovalStatusEnum.STATUS_REJECTED.getCode().equals(entity.getApprovalStatus()) ) { + throw new RuntimeException("项目信息状态异常"); + } + + List stoneList = fmProjectApplication.getStoneList(); + if(CollectionUtils.isNotEmpty(stoneList)){ + //子项全删全增 + List oldStoneList = fmProjectMilestoneService.list(Wrappers.lambdaQuery().eq(FmProjectMilestoneEntity::getPaId,fmProjectApplication.getId())); + List stoneIdList = oldStoneList.stream().map(BaseEntity::getId).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(stoneIdList)){ + fmProjectMilestoneService.deleteLogic(stoneIdList); + } + stoneList.forEach(item -> { + item.setId(null); + item.setPaId(fmProjectApplication.getId()); + }); + fmProjectMilestoneService.saveBatch(stoneList); + } + return R.status(updateById(fmProjectApplication)); + } + + @Override + public void approval(FmProjectApplicationEntity fmProjectApplication) { + /** + * 前端审批传参 + * { + * "id": "2059190659557314562", + * "approvalStatus": 3 + * } + * */ + FmProjectApplicationEntity application = getByIdAndCheck(fmProjectApplication); + + application.setApprovalStatus(fmProjectApplication.getApprovalStatus()); + + updateById(application); + } + + private FmProjectApplicationEntity getByIdAndCheck(FmProjectApplicationEntity fmProjectApplication) { + if (BeanUtil.isEmpty(fmProjectApplication) || + Objects.isNull(fmProjectApplication.getId()) || + Objects.isNull(fmProjectApplication.getApprovalStatus())) { + throw new RuntimeException("参数错误"); + } + if (!fmProjectApplication.getApprovalStatus().equals(FmProjectApplicationEntity.ApprovalStatusEnum.STATUS_REJECTED.getCode()) || + !fmProjectApplication.getApprovalStatus().equals(FmProjectApplicationEntity.ApprovalStatusEnum.STATUS_IN_PROGRESS.getCode())) { + throw new RuntimeException("审批结果参数错误"); + } + // 查询项目信息 + FmProjectApplicationEntity application = this.getById(fmProjectApplication.getId()); + if (BeanUtil.isEmpty(application)) { + throw new RuntimeException("项目信息不存在"); + } + + // 判断是否为待审批状态 + if (Objects.isNull(application.getApprovalStatus()) || + !application.getApprovalStatus().equals(FmProjectApplicationEntity.ApprovalStatusEnum.STATUS_PENDING.getCode())) { + throw new RuntimeException("项目信息不是待审批状态"); + } + Long userId = AuthUtil.getUserId(); + if (Objects.isNull(application.getApprovalMan()) || !application.getApprovalMan().equals(userId)) { + throw new RuntimeException("项目信息不是当前审批人"); + } + + return application; + + } + + /** + * 前缀补零 + */ + private static String prefix(String stringToFix, String fixChar, int targetLen) { + int len = stringToFix.length(); + for (int i = 0; i < targetLen - len; i += fixChar.length()) { + stringToFix = fixChar + stringToFix; + } + return stringToFix; + } + + + private void sendNotificationToAuditLeader(FmProjectApplicationEntity application) { + try { + // 构建通知消息 + String title = String.format("立项申请审批提醒 - %s", application.getPaCode()); + + String content = String.format("立项申请审批详情:- 审批单号:%s", application.getPaCode()); + + // 创建通知消息实体 + MesNotifyMessageEntity notifyMessage = MesNotifyMessageEntity.builder() + .title(title) + .content(content) + .receiveUserId(application.getApprovalMan()) + .build(); + mesNotifyMessageClient.save(notifyMessage); + } catch (Exception e) { + log.error("发送外协结算审批提醒时发生异常,审批单号: {}", application.getPaCode(), e); + } + } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/impl/FmProjectMilestoneServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/impl/FmProjectMilestoneServiceImpl.java index c5c90a458..1e39472fb 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/impl/FmProjectMilestoneServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/impl/FmProjectMilestoneServiceImpl.java @@ -25,32 +25,43 @@ */ package org.springblade.desk.process.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import jakarta.annotation.Resource; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.mp.support.Condition; import org.springblade.core.secure.BladeUser; import org.springblade.core.secure.utils.AuthUtil; -import org.springblade.core.tool.utils.BeanUtil; +import org.springblade.core.tool.api.R; +import org.springblade.desk.common.feign.MesNotifyMessageClient; +import org.springblade.desk.common.pojo.entity.MesNotifyMessageEntity; import org.springblade.desk.process.excel.FmProjectMilestoneExcel; import org.springblade.desk.process.mapper.FmProjectMilestoneMapper; import org.springblade.desk.process.pojo.entity.FmProjectApplicationEntity; import org.springblade.desk.process.pojo.entity.FmProjectMilestoneEntity; import org.springblade.desk.process.pojo.vo.FmProjectMilestoneVO; import org.springblade.desk.process.service.IFmProjectApplicationService; +import org.springblade.desk.process.service.IFmProjectApprovalConfigService; import org.springblade.desk.process.service.IFmProjectMilestoneService; import org.springblade.resource.feign.IAttachClient; import org.springblade.resource.pojo.entity.Attach; import org.springblade.system.feign.IUserClient; import org.springblade.system.pojo.entity.User; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; +import java.util.Objects; /** * 项目里程碑 服务实现类 @@ -58,173 +69,310 @@ import java.util.List; * @author BladeX * @since 2026-01-07 */ +@Slf4j @Service @RequiredArgsConstructor public class FmProjectMilestoneServiceImpl extends BaseServiceImpl implements IFmProjectMilestoneService { + @Lazy + @Resource + IFmProjectApplicationService fmProjectApplicationService; - private final IFmProjectApplicationService fmProjectApplicationService; - - private final IAttachClient attachClient; - private final IUserClient userClient; - @Override - public IPage selectFmProjectMilestonePage(IPage page, FmProjectMilestoneVO fmProjectMilestone) { - return page.setRecords(baseMapper.selectFmProjectMilestonePage(page, fmProjectMilestone)); - } - - - @Override - public List exportFmProjectMilestone(Wrapper queryWrapper) { - List fmProjectMilestoneList = baseMapper.exportFmProjectMilestone(queryWrapper); - //fmProjectMilestoneList.forEach(fmProjectMilestone -> { - // fmProjectMilestone.setTypeName(DictCache.getValue(DictEnum.YES_NO, FmProjectMilestone.getType())); - //}); - return fmProjectMilestoneList; - } - - @Override - public boolean sendCheck(FmProjectMilestoneEntity fmProjectMilestone) { - if (fmProjectMilestone != null && fmProjectMilestone.getId() != null) { - // 如果是项目执行发送 - if (FmProjectMilestoneEntity.CHECK_RESULT_TREAT.equals(fmProjectMilestone.getCheckResult())) { - fmProjectMilestone.setCheckMan(String.valueOf(AuthUtil.getUser().getUserId())); - if (StringUtils.isBlank(fmProjectMilestone.getMilestoneMemo())) { - throw new ServiceException("请先维护节点信息"); - } - } - // 如果是项目核查 - if (FmProjectMilestoneEntity.CHECK_RESULT_OK.equals(fmProjectMilestone.getCheckResult()) || FmProjectMilestoneEntity.CHECK_RESULT_NO.equals(fmProjectMilestone.getCheckResult())) { -// fmProjectMilestone.setCheckMan(pfUserInfo); - if (FmProjectMilestoneEntity.CHECK_RESULT_OK.equals(fmProjectMilestone.getCheckResult())) { - fmProjectMilestone.setGrade(FmProjectMilestoneEntity.GRADE_TREAT); - fmProjectMilestone.setGradeMan(String.valueOf(AuthUtil.getUser().getUserId())); - } - fmProjectMilestone.setCheckTime(new Date()); - } - baseMapper.updateById(fmProjectMilestone); - return true; - } - return false; - } - - @Override - public boolean gradeSubmit(FmProjectMilestoneEntity fmProjectMilestone) { - if (fmProjectMilestone != null && fmProjectMilestone.getId() != null) { - BladeUser bladeUser = AuthUtil.getUser(); - User user = userClient.userInfoById(bladeUser.getUserId()).getData(); - fmProjectMilestone.setGradeMan(user.getRealName()); - Double score= fmProjectMilestone.getScore(); - fmProjectMilestone.setScore(score); - - if (score > 95) { - fmProjectMilestone.setGrade(FmProjectMilestoneEntity.GRADE_Y); - } else if (score >= 85 && score <= 95) { - fmProjectMilestone.setGrade(FmProjectMilestoneEntity.GRADE_L); - } else if (score >= 75 && score <= 84) { - fmProjectMilestone.setGrade(FmProjectMilestoneEntity.GRADE_Z); - } else { - fmProjectMilestone.setGrade(FmProjectMilestoneEntity.GRADE_C); - } - fmProjectMilestone.setOkTime(new Date()); - fmProjectMilestone.setEvaluate(fmProjectMilestone.getEvolve()); - // 如果评价分数在75分以上,并且执行类型不是延期。则代表本节点已经完成 - if (score < 75 && !FmProjectMilestoneEntity.EXECUTE_RESULT_YQ.equals(fmProjectMilestone.getExecuteResult())) { - fmProjectMilestone.setCheckResult(FmProjectMilestoneEntity.CHECK_RESULT_TREAT); - baseMapper.updateById(fmProjectMilestone); - return true; - } - baseMapper.updateById(fmProjectMilestone); - // 如果选择的是延期,则生成一条新的里程碑,此里程碑关闭 - if (FmProjectMilestoneEntity.EXECUTE_RESULT_YQ.equals(fmProjectMilestone.getExecuteResult())) { - FmProjectMilestoneEntity projectMilestoneClone = BeanUtil.copyProperties(fmProjectMilestone, FmProjectMilestoneEntity.class); - projectMilestoneClone.setId(null); - projectMilestoneClone.setDelayDate(Boolean.TRUE); - String paIndex = fmProjectMilestone.getPaIndex(); - Double paIndexDou = Double.valueOf(paIndex) + 0.01; - String format = "0"; - if (paIndexDou >= 2) { - paIndexDou = paIndexDou + 0.001; - format = String.format("%.2f",paIndexDou); - }else { - format = String.format("%.3f",paIndexDou); - } - projectMilestoneClone.setPaIndex(format); - - projectMilestoneClone.setMilestoneNode(fmProjectMilestone.getDelayTime()); - projectMilestoneClone.setGrade((short) 0); - projectMilestoneClone.setScore((double) 0); - projectMilestoneClone.setExecuteResult((short) 0); - projectMilestoneClone.setDelayTime(null); - projectMilestoneClone.setCheckResult((short) 0); - projectMilestoneClone.setCheckMan(null); - projectMilestoneClone.setCheckTime(null); - projectMilestoneClone.setGradeMan(null); - projectMilestoneClone.setEvaluate(null); - projectMilestoneClone.setOkTime(null); - projectMilestoneClone.setUpdateTime(new Date()); - baseMapper.insert(projectMilestoneClone); - } else { - // 获取所有得节点信息,看是否都已经完成 - FmProjectApplicationEntity fmProjectApplication = new FmProjectApplicationEntity(); - List fmProjectMilestoneList = baseMapper - .selectList(new QueryWrapper().lambda() - .eq(FmProjectMilestoneEntity::getPaId,fmProjectMilestone.getPaId())); - Boolean isOk = Boolean.TRUE; - if (fmProjectMilestoneList != null && fmProjectMilestoneList.size() > 0) { - for (FmProjectMilestoneEntity projectMilestone : fmProjectMilestoneList) { - if (FmProjectMilestoneEntity.GRADE_NO.equals(projectMilestone.getGrade())) { - isOk = Boolean.FALSE; - } - } - if (isOk) { - fmProjectApplication.setId(fmProjectMilestone.getPaId()); - fmProjectApplication.setProjectEnd(new Date()); - fmProjectApplication.setApprovalStatus(8L); - fmProjectApplicationService.updateById(fmProjectApplication); - } - } - } - return true; - } - return false; - } - - @Override - public boolean projectExecute(FmProjectMilestoneEntity fmProjectMilestone) { - if (fmProjectMilestone != null && fmProjectMilestone.getId() != null) { - fmProjectMilestone.setUpdateTime(new Date()); - baseMapper.updateById(fmProjectMilestone); - //如果类型选择终止,则后面的里程碑就不需要继续执行 - if(fmProjectMilestone.getExecuteResult().equals(FmProjectMilestoneEntity.EXECUTE_RESULT_ZZ)){ - FmProjectApplicationEntity fmProjectApplication = fmProjectMilestone.getFmProjectApplication(); - String paIndex = fmProjectMilestone.getPaIndex(); - List fmProjectMilestoneList = baseMapper - .selectList(new QueryWrapper().lambda() - .eq(FmProjectMilestoneEntity::getPaId,fmProjectApplication.getId())); - for (FmProjectMilestoneEntity projectMilestone : fmProjectMilestoneList) { - if(Double.valueOf(projectMilestone.getPaIndex())>Double.valueOf(paIndex)){ - projectMilestone.setExecuteResult(FmProjectMilestoneEntity.EXECUTE_RESULT_ZZ); - baseMapper.updateById(projectMilestone); - } - } - } - return true; - } - return false; - } - - @Override - public FmProjectMilestoneEntity getDetail(FmProjectMilestoneEntity fmProjectMilestone) { - FmProjectMilestoneEntity detail=baseMapper.selectOne(Condition.getQueryWrapper(fmProjectMilestone)); - if(detail==null){ - detail=baseMapper.selectById(fmProjectMilestone.getId()); - } - FmProjectApplicationEntity fmProjectApplication=fmProjectApplicationService.getById(detail.getPaId()); - if(StringUtils.isNotEmpty(detail.getFileId())){ - List attachList=attachClient.listByIds(detail.getFileId()).getData(); - detail.setAttachList(attachList); - } - detail.setFmProjectApplication(fmProjectApplication); - return detail; - } + private final IAttachClient attachClient; + private final IUserClient userClient; + private final MesNotifyMessageClient mesNotifyMessageClient; + + @Override + public IPage selectFmProjectMilestonePage(IPage page, FmProjectMilestoneVO fmProjectMilestone) { + return page.setRecords(baseMapper.selectFmProjectMilestonePage(page, fmProjectMilestone)); + } + + + @Override + public List exportFmProjectMilestone(Wrapper queryWrapper) { + List fmProjectMilestoneList = baseMapper.exportFmProjectMilestone(queryWrapper); + //fmProjectMilestoneList.forEach(fmProjectMilestone -> { + // fmProjectMilestone.setTypeName(DictCache.getValue(DictEnum.YES_NO, FmProjectMilestone.getType())); + //}); + return fmProjectMilestoneList; + } + + @Override + public boolean sendCheck(FmProjectMilestoneEntity fmProjectMilestone) { + if (BeanUtil.isEmpty(fmProjectMilestone) || Objects.isNull(fmProjectMilestone.getId())) { + throw new ServiceException("参数错误"); + } + // TODO: 2026/5/27 是否手动更新 + FmProjectMilestoneEntity entity = getById(fmProjectMilestone.getId()); + if (BeanUtil.isEmpty(entity)) { + throw new ServiceException("里程碑信息获取失败"); + } + if (Objects.isNull(fmProjectMilestone.getCheckResult())) { + throw new ServiceException("请选择核查结果"); + } + if (!FmProjectMilestoneEntity.CHECK_RESULT_OK.equals(fmProjectMilestone.getCheckResult()) || + !FmProjectMilestoneEntity.CHECK_RESULT_NO.equals(fmProjectMilestone.getCheckResult())) { + throw new ServiceException("请选择核查结果"); + } + + + //设置核查人为上一节点选择的审批人,校验当前登录人与上一节点所选审批人是否一致 + if (!entity.getNextApproverId().equals(AuthUtil.getUserId())) { + throw new ServiceException("您不是当前里程碑的核查人"); + } + fmProjectMilestone.setCheckMan(entity.getNextApproverId().toString()); + + // 如果核查通过,需要流转到核准节点 + if (FmProjectMilestoneEntity.CHECK_RESULT_OK.equals(fmProjectMilestone.getCheckResult())) { + // 检查是否选择了下一节点审批人(核准人) + if (Objects.isNull(fmProjectMilestone.getNextApproverId())) { + throw new ServiceException("请选择下一节点(核准)的审批人"); + } + R userR = userClient.userInfoById(fmProjectMilestone.getNextApproverId()); + if (!userR.isSuccess() || BeanUtil.isEmpty(userR.getData())) { + throw new RuntimeException("下一节点(核准)的审批人不存在"); + } + + // 设置核准人为选择的审批人 + fmProjectMilestone.setGradeMan(userR.getData().getRealName()); + fmProjectMilestone.setGradeManId(fmProjectMilestone.getNextApproverId()); + // 设置评价状态为待评价 + fmProjectMilestone.setGrade(FmProjectMilestoneEntity.GRADE_TREAT); + + //向下一节点审批人发送消息 + sendNotificationToNextApproverA(fmProjectMilestone); + } + + fmProjectMilestone.setCheckTime(new Date()); + + baseMapper.updateById(fmProjectMilestone); + return true; + + } + // 与旧mes一致 + @Override + public boolean gradeSubmit(FmProjectMilestoneEntity fmProjectMilestone) { + if (BeanUtil.isEmpty(fmProjectMilestone) || Objects.isNull(fmProjectMilestone.getId())) { + throw new ServiceException("参数错误"); + } + + BladeUser bladeUser = AuthUtil.getUser(); + User user = userClient.userInfoById(bladeUser.getUserId()).getData(); + //检查当前登录人与评价人一致 + if (!user.getId().equals(fmProjectMilestone.getNextApproverId())) { + throw new ServiceException("您不是当前里程碑的评价人"); + } + + fmProjectMilestone.setGradeMan(user.getRealName()); + Double score = fmProjectMilestone.getScore(); + fmProjectMilestone.setScore(score); + + if (score > 95.0) { + fmProjectMilestone.setGrade(FmProjectMilestoneEntity.GRADE_Y); + } else if (score >= 85.0) { + fmProjectMilestone.setGrade(FmProjectMilestoneEntity.GRADE_L); + } else if (score >= 75.0 && score <= 84.0) { + fmProjectMilestone.setGrade(FmProjectMilestoneEntity.GRADE_Z); + } else { + fmProjectMilestone.setGrade(FmProjectMilestoneEntity.GRADE_C); + } + + fmProjectMilestone.setOkTime(new Date()); + fmProjectMilestone.setEvaluate(fmProjectMilestone.getEvolve()); + + // 如果评价分数在75分以上,并且执行类型不是延期。则代表本节点已经完成 + if (score < 75 && !FmProjectMilestoneEntity.EXECUTE_RESULT_YQ.equals(fmProjectMilestone.getExecuteResult())) { + fmProjectMilestone.setCheckResult(FmProjectMilestoneEntity.CHECK_RESULT_TREAT); + baseMapper.updateById(fmProjectMilestone); + return true; + } + baseMapper.updateById(fmProjectMilestone); + + // 如果选择的是延期,则生成一条新的里程碑,此里程碑关闭 + if (FmProjectMilestoneEntity.EXECUTE_RESULT_YQ.equals(fmProjectMilestone.getExecuteResult())) { + FmProjectMilestoneEntity projectMilestoneClone = BeanUtil.copyProperties(fmProjectMilestone, FmProjectMilestoneEntity.class); + projectMilestoneClone.setId(null); + projectMilestoneClone.setDelayDate(Boolean.TRUE); + String paIndex = fmProjectMilestone.getPaIndex(); + Double paIndexDou = Double.parseDouble(paIndex) + 0.01; + String format = "0"; + if (paIndexDou >= 2) { + paIndexDou = paIndexDou + 0.001; + format = String.format("%.2f", paIndexDou); + } else { + format = String.format("%.3f", paIndexDou); + } + projectMilestoneClone.setPaIndex(format); + + projectMilestoneClone.setMilestoneNode(fmProjectMilestone.getDelayTime()); + projectMilestoneClone.setGrade((short) 0); + projectMilestoneClone.setScore((double) 0); + projectMilestoneClone.setExecuteResult((short) 0); + projectMilestoneClone.setDelayTime(null); + projectMilestoneClone.setCheckResult((short) 0); + projectMilestoneClone.setCheckMan(null); + projectMilestoneClone.setCheckTime(null); + projectMilestoneClone.setGradeMan(null); + projectMilestoneClone.setEvaluate(null); + projectMilestoneClone.setOkTime(null); + projectMilestoneClone.setUpdateTime(new Date()); + baseMapper.insert(projectMilestoneClone); + } else { + // 获取所有得节点信息,看是否都已经完成 + FmProjectApplicationEntity fmProjectApplication = new FmProjectApplicationEntity(); + List fmProjectMilestoneList = baseMapper + .selectList(Wrappers.lambdaQuery(FmProjectMilestoneEntity.class) + .eq(FmProjectMilestoneEntity::getPaId, fmProjectMilestone.getPaId())); + + Boolean isOk = Boolean.TRUE; + if (fmProjectMilestoneList != null && fmProjectMilestoneList.size() > 0) { + for (FmProjectMilestoneEntity projectMilestone : fmProjectMilestoneList) { + if (FmProjectMilestoneEntity.GRADE_NO.equals(projectMilestone.getGrade())) { + isOk = Boolean.FALSE; + } + } + if (isOk) { + fmProjectApplication.setId(fmProjectMilestone.getPaId()); + fmProjectApplication.setProjectEnd(new Date()); + fmProjectApplication.setApprovalStatus(8L); + fmProjectApplicationService.updateById(fmProjectApplication); + } + } + } + return true; + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean projectExecute(FmProjectMilestoneEntity fmProjectMilestone) { + check(fmProjectMilestone); + + // 如果执行结果为完成或延期,需要选择下一节点审批人 + if (FmProjectMilestoneEntity.EXECUTE_RESULT_JXSQ.equals(fmProjectMilestone.getExecuteResult()) + || FmProjectMilestoneEntity.EXECUTE_RESULT_YQ.equals(fmProjectMilestone.getExecuteResult())) { + if (Objects.nonNull(fmProjectMilestone.getNextApproverId())) { + R userR = userClient.userInfoById(fmProjectMilestone.getNextApproverId()); + if (!userR.isSuccess() || BeanUtil.isEmpty(userR.getData())) { + throw new RuntimeException("请检查下一节点(核查)的审批人"); + } + } + if (Objects.isNull(fmProjectMilestone.getNextApproverId())) { + fmProjectMilestone.setNextApproverId(AuthUtil.getUserId()); + fmProjectMilestone.setNextApproverName(AuthUtil.getNickName()); + } + } + + FmProjectMilestoneEntity entity = getById(fmProjectMilestone.getId()); + entity.setMilestoneMemo(fmProjectMilestone.getMilestoneMemo()); + entity.setEvolve(fmProjectMilestone.getEvolve()); + entity.setLastPlan(fmProjectMilestone.getLastPlan()); + entity.setExecuteResult(fmProjectMilestone.getExecuteResult()); + entity.setDelayTime(fmProjectMilestone.getDelayTime()); + entity.setUpdateTime(new Date()); + updateById(entity); + //如果类型选择终止,则后面的里程碑就不需要继续执行 + if (fmProjectMilestone.getExecuteResult().equals(FmProjectMilestoneEntity.EXECUTE_RESULT_ZZ)) { + FmProjectApplicationEntity fmProjectApplication = fmProjectMilestone.getFmProjectApplication(); + String paIndex = fmProjectMilestone.getPaIndex(); + List fmProjectMilestoneList = baseMapper + .selectList(new QueryWrapper().lambda() + .eq(FmProjectMilestoneEntity::getPaId, fmProjectApplication.getId())); + for (FmProjectMilestoneEntity projectMilestone : fmProjectMilestoneList) { + if (Double.parseDouble(projectMilestone.getPaIndex()) > Double.parseDouble(paIndex)) { + projectMilestone.setExecuteResult(FmProjectMilestoneEntity.EXECUTE_RESULT_ZZ); + baseMapper.updateById(projectMilestone); + } + } + } + //向下一节点审批人发送消息 + sendNotificationToNextApprover(fmProjectMilestone); + return true; + } + + private void sendNotificationToNextApprover(FmProjectMilestoneEntity fmProjectMilestone) { + try { + // 构建通知消息 + String title = String.format("里程碑计划核查提醒 - %s", fmProjectMilestone.getMilestonePlan()); + + String content = String.format("里程碑计划核查详情, 里程碑计划:%s", fmProjectMilestone.getMilestonePlan()); + + // 创建通知消息实体 + MesNotifyMessageEntity notifyMessage = MesNotifyMessageEntity.builder() + .title(title) + .content(content) + .receiveUserId(fmProjectMilestone.getNextApproverId()) + .build(); + mesNotifyMessageClient.save(notifyMessage); + } catch (Exception e) { + log.error("发送里程碑计划审批提醒异常,里程碑计划: {}", fmProjectMilestone.getMilestonePlan(), e); + } + } + private void sendNotificationToNextApproverA(FmProjectMilestoneEntity fmProjectMilestone) { + try { + // 构建通知消息 + String title = String.format("里程碑计划核准提醒 - %s", fmProjectMilestone.getMilestonePlan()); + + String content = String.format("里程碑计划核准详情 , 里程碑计划:%s", fmProjectMilestone.getMilestonePlan()); + + // 创建通知消息实体 + MesNotifyMessageEntity notifyMessage = MesNotifyMessageEntity.builder() + .title(title) + .content(content) + .receiveUserId(fmProjectMilestone.getNextApproverId()) + .build(); + mesNotifyMessageClient.save(notifyMessage); + } catch (Exception e) { + log.error("发送里程碑计划审批提醒异常,里程碑计划: {}", fmProjectMilestone.getMilestonePlan(), e); + } + } + private void check(FmProjectMilestoneEntity fmProjectMilestone) { + + if (BeanUtil.isEmpty(fmProjectMilestone) || Objects.isNull(fmProjectMilestone.getId())) { + throw new RuntimeException("参数异常"); + } + if (Objects.isNull(fmProjectMilestone.getExecuteResult())) { + throw new RuntimeException("请选择执行结果"); + } + // 剔除`无`选项 + if (!FmProjectMilestoneEntity.executeResultMap.containsKey(fmProjectMilestone.getExecuteResult()) && !fmProjectMilestone.getExecuteResult().equals(FmProjectMilestoneEntity.EXECUTE_RESULT_NO)) { + throw new RuntimeException("请选择正确的执行结果"); + } + + if (StrUtil.isEmpty(fmProjectMilestone.getMilestoneMemo())) { + throw new RuntimeException("请填写里程碑描述"); + } + if (StrUtil.isEmpty(fmProjectMilestone.getEvolve())) { + throw new RuntimeException("请填写进展情况"); + } + if (StrUtil.isEmpty(fmProjectMilestone.getLastPlan())) { + throw new RuntimeException("请填写下一步计划"); + } + if (Objects.isNull(fmProjectMilestone.getExecuteResult())) { + throw new RuntimeException("请选择执行结果"); + } + if (StrUtil.isEmpty(fmProjectMilestone.getPaIndex())) { + throw new RuntimeException("请填写序号"); + } + FmProjectApplicationEntity fmProjectApplication = fmProjectMilestone.getFmProjectApplication(); + if (BeanUtil.isEmpty(fmProjectApplication) || Objects.isNull(fmProjectApplication.getId())) { + throw new RuntimeException("参数异常"); + } + + } + + @Override + public FmProjectMilestoneEntity getDetail(FmProjectMilestoneEntity fmProjectMilestone) { + FmProjectMilestoneEntity detail = baseMapper.selectOne(Condition.getQueryWrapper(fmProjectMilestone)); + if (detail == null) { + detail = baseMapper.selectById(fmProjectMilestone.getId()); + } + FmProjectApplicationEntity fmProjectApplication = fmProjectApplicationService.getById(detail.getPaId()); + if (StringUtils.isNotEmpty(detail.getFileId())) { + List attachList = attachClient.listByIds(detail.getFileId()).getData(); + detail.setAttachList(attachList); + } + detail.setFmProjectApplication(fmProjectApplication); + return detail; + } }