From 7bb48050e8da735edf5ae761f9d6252d05fffba0 Mon Sep 17 00:00:00 2001 From: luotaiqian <1147642922@qq.com> Date: Tue, 21 Jul 2026 19:02:09 +0800 Subject: [PATCH] init --- .../convertor/EvalProjectCmdConvertor.java | 49 ------------------- .../institution/EvalProjectExecutor.java | 47 +++++++++++++++--- .../co/institution/EvalProjectProgressCO.java | 6 +++ .../EvalProjectProgressPageQuery.java | 3 ++ .../domain/query/EvalProjectQuery.java | 1 + .../mapper/EvalProjectMapper.java | 9 ++++ .../resources/mapper/EvalProjectMapper.xml | 43 ++++++++++++++++ 7 files changed, 103 insertions(+), 55 deletions(-) create mode 100644 safety-eval-infrastructure/src/main/resources/mapper/EvalProjectMapper.xml diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/convertor/EvalProjectCmdConvertor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/convertor/EvalProjectCmdConvertor.java index a1db0e9a..110df9ff 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/convertor/EvalProjectCmdConvertor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/convertor/EvalProjectCmdConvertor.java @@ -10,12 +10,10 @@ import org.qinan.safetyeval.client.co.institution.EnumOptionCO; import org.qinan.safetyeval.client.co.institution.EvalProjectCO; import org.qinan.safetyeval.client.co.institution.EvalProjectEnumsCO; import org.qinan.safetyeval.client.co.institution.EvalProjectParticipantItemCO; -import org.qinan.safetyeval.client.co.institution.EvalProjectProgressCO; import org.qinan.safetyeval.client.dto.institution.EvalProjectAddCmd; import org.qinan.safetyeval.client.dto.institution.EvalProjectPageQuery; import org.qinan.safetyeval.client.dto.institution.EvalProjectProgressPageQuery; import org.qinan.safetyeval.domain.constant.ChongqingDistrictEnum; -import org.qinan.safetyeval.domain.constant.EvalProjectProgressStatEnum; import org.qinan.safetyeval.domain.constant.EvalTypeEnum; import org.qinan.safetyeval.domain.entity.EvalProjectEntity; import org.qinan.safetyeval.domain.query.EvalProjectQuery; @@ -64,14 +62,6 @@ public interface EvalProjectCmdConvertor { List convertEListToCOList(List list); - @Mapping(target = "id", expression = "java(entity.getId() == null ? null : String.valueOf(entity.getId()))") - @Mapping(target = "evalTypeName", ignore = true) - @Mapping(target = "progressStatusCode", ignore = true) - @Mapping(target = "progressStatusName", ignore = true) - EvalProjectProgressCO convertEToProgressCO(EvalProjectEntity entity); - - List convertEListToProgressCOList(List list); - @AfterMapping default void fillDisplayFields(EvalProjectEntity entity, @MappingTarget EvalProjectCO co) { if (entity == null || co == null) { @@ -103,45 +93,6 @@ public interface EvalProjectCmdConvertor { } } - @AfterMapping - default void fillProgressDisplayFields(EvalProjectEntity entity, @MappingTarget EvalProjectProgressCO co) { - if (entity == null || co == null) { - return; - } - EvalTypeEnum evalType = EvalTypeEnum.ofCode(entity.getEvalTypeCode()); - if (evalType != null) { - co.setEvalTypeName(evalType.getValue()); - } - String statusCode = computeProgressStatus(entity.getPlanEndDate()); - co.setProgressStatusCode(statusCode); - co.setProgressStatusName(progressStatusNameOf(statusCode)); - } - - /** - * 项目进度状态规则(参考原型页面): - * 超过项目结束日期为 DELAY(延期); - * 距离结束日期3天以内(含3天)为 NEAR(临期); - * 距离结束日期超过3天为 NORMAL(正常)。 - */ - default String computeProgressStatus(LocalDate planEndDate) { - if (planEndDate == null) { - return null; - } - LocalDate today = LocalDate.now(); - if (today.isAfter(planEndDate)) { - return EvalProjectProgressStatEnum.DELAY.getCode(); - } - if (planEndDate.isAfter(today.plusDays(3))) { - return EvalProjectProgressStatEnum.NORMAL.getCode(); - } - return EvalProjectProgressStatEnum.NEAR.getCode(); - } - - default String progressStatusNameOf(String code) { - EvalProjectProgressStatEnum statEnum = EvalProjectProgressStatEnum.ofCode(code); - return statEnum == null ? null : statEnum.getValue(); - } - default String toParticipantsJson(List participants) { if (participants == null) { return null; diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/EvalProjectExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/EvalProjectExecutor.java index 1b7a3aba..86eede0b 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/EvalProjectExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/EvalProjectExecutor.java @@ -18,8 +18,8 @@ import org.qinan.safetyeval.domain.exception.ErrorCode; import org.qinan.safetyeval.domain.query.EvalProjectQuery; import org.qinan.safetyeval.domain.query.PageResult; import org.qinan.safetyeval.domain.service.EvalProjectDomainService; -import org.qinan.safetyeval.infrastructure.mapper.EvalProjectMapper; import org.qinan.safetyeval.infrastructure.adapter.ThreadLocalUserInfoAdapter; +import org.qinan.safetyeval.infrastructure.mapper.EvalProjectMapper; import org.qinan.safetyeval.infrastructure.support.InstitutionOrgSupport; import org.qinan.safetyeval.infrastructure.support.ProjectNoGenerator; import org.springframework.beans.factory.annotation.Autowired; @@ -27,8 +27,12 @@ import org.springframework.context.annotation.Lazy; import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; +import java.time.LocalDate; import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + @Service public class EvalProjectExecutor implements EvalProjectApi { @@ -47,6 +51,7 @@ public class EvalProjectExecutor implements EvalProjectApi { @Lazy @Autowired(required = false) private EvalProjectCmdConvertor evalProjectCmdConvertor; + @Autowired private EvalProjectMapper evalProjectMapper; @@ -100,11 +105,41 @@ public class EvalProjectExecutor implements EvalProjectApi { @Override public PageResponse progressPage(EvalProjectProgressPageQuery query) { EvalProjectQuery domainQuery = evalProjectCmdConvertor.convertProgressPageQueryToQ(query); - domainQuery.setOrgId( ThreadLocalUserInfoAdapter.getOrgId()); - PageResult pageResult = evalProjectDomainService.page(domainQuery); - return PageResponse.of( - evalProjectCmdConvertor.convertEListToProgressCOList(pageResult.getRecords()), - pageResult.getTotal()); + domainQuery.setOrgId(ThreadLocalUserInfoAdapter.getOrgId()); + Page page = new Page<>(domainQuery.getPageNum(), domainQuery.getPageSize()); + IPage result = evalProjectMapper.selectProgressPage(page, domainQuery); + if (result.getRecords() != null) { + result.getRecords().forEach(this::fillProgressStatus); + } + return PageResponse.of(result.getRecords(), result.getTotal()); + } + + /** + * 根据项目结束日期计算剩余天数、进度状态码、进度状态名称。 + * 规则(参考原型页面): + * - 剩余天数 = planEndDate - 今天 + * - 剩余天数 < 0:DELAY(延期) + * - 0 ≤ 剩余天数 ≤ 3:NEAR(临期) + * - 剩余天数 > 3:NORMAL(正常) + */ + private void fillProgressStatus(EvalProjectProgressCO co) { + if (co == null || co.getPlanEndDate() == null) { + return; + } + LocalDate today = LocalDate.now(); + long days = today.until(co.getPlanEndDate()).getDays(); + co.setRemainingDays((int) days); + + EvalProjectProgressStatEnum statEnum; + if (days < 0) { + statEnum = EvalProjectProgressStatEnum.DELAY; + } else if (days <= 3) { + statEnum = EvalProjectProgressStatEnum.NEAR; + } else { + statEnum = EvalProjectProgressStatEnum.NORMAL; + } + co.setProgressStatusCode(statEnum.getCode()); + co.setProgressStatusName(statEnum.getValue()); } private EvalProjectEntity saveWithProjectNo(EvalProjectEntity entity, Long orgId) { diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/institution/EvalProjectProgressCO.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/institution/EvalProjectProgressCO.java index 7069cea6..6891b28a 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/institution/EvalProjectProgressCO.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/institution/EvalProjectProgressCO.java @@ -20,6 +20,9 @@ public class EvalProjectProgressCO { @ApiModelProperty("项目名称") private String projectName; + @ApiModelProperty("客户名称") + private String customerName; + @ApiModelProperty("客户负责人") private String customerContactName; @@ -32,6 +35,9 @@ public class EvalProjectProgressCO { @ApiModelProperty("项目结束日期") private LocalDate planEndDate; + @ApiModelProperty("剩余天数(截止日期-当前日期,负数表示已超期)") + private Integer remainingDays; + @ApiModelProperty("项目进度状态码:NORMAL正常 NEAR临期 DELAY延期") private String progressStatusCode; diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/EvalProjectProgressPageQuery.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/EvalProjectProgressPageQuery.java index affc00a5..f9622abd 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/EvalProjectProgressPageQuery.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/EvalProjectProgressPageQuery.java @@ -15,6 +15,9 @@ public class EvalProjectProgressPageQuery extends BasePageQuery { @ApiModelProperty("项目名称") private String projectName; + @ApiModelProperty("客户名称") + private String customerName; + @ApiModelProperty("项目进度状态:NORMAL正常 NEAR临期 DELAY延期") private String progressStatus; } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/query/EvalProjectQuery.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/query/EvalProjectQuery.java index 31e83371..2891222c 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/query/EvalProjectQuery.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/query/EvalProjectQuery.java @@ -14,6 +14,7 @@ public class EvalProjectQuery { private Long pageSize; private Long orgId; private String projectName; + private String customerName; private String projectLeaderName; private String customerContactName; private Long customerId; diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/EvalProjectMapper.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/EvalProjectMapper.java index 72c4aabf..bdaa9b8e 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/EvalProjectMapper.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/EvalProjectMapper.java @@ -1,9 +1,13 @@ package org.qinan.safetyeval.infrastructure.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; +import org.qinan.safetyeval.client.co.institution.EvalProjectProgressCO; +import org.qinan.safetyeval.domain.query.EvalProjectQuery; import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectDO; @Mapper @@ -11,4 +15,9 @@ public interface EvalProjectMapper extends BaseMapper { @Select("SELECT MAX(project_no) FROM eval_project WHERE project_no LIKE CONCAT(#{prefix}, '%')") String selectMaxProjectNoByPrefix(@Param("prefix") String prefix); + + /** + * 项目进度管理分页查询(关联 eval_customer 获取客户名称,直接返回 EvalProjectProgressCO) + */ + IPage selectProgressPage(Page page, @Param("query") EvalProjectQuery query); } diff --git a/safety-eval-infrastructure/src/main/resources/mapper/EvalProjectMapper.xml b/safety-eval-infrastructure/src/main/resources/mapper/EvalProjectMapper.xml new file mode 100644 index 00000000..7d4d5f55 --- /dev/null +++ b/safety-eval-infrastructure/src/main/resources/mapper/EvalProjectMapper.xml @@ -0,0 +1,43 @@ + + + + + + + +