luotaiqian 2026-07-21 19:02:09 +08:00
parent 1289bd0cc7
commit 7bb48050e8
7 changed files with 103 additions and 55 deletions

View File

@ -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<EvalProjectCO> convertEListToCOList(List<EvalProjectEntity> 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<EvalProjectProgressCO> convertEListToProgressCOList(List<EvalProjectEntity> 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
* 33 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<EvalProjectParticipantItemCO> participants) {
if (participants == null) {
return null;

View File

@ -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<EvalProjectProgressCO> progressPage(EvalProjectProgressPageQuery query) {
EvalProjectQuery domainQuery = evalProjectCmdConvertor.convertProgressPageQueryToQ(query);
domainQuery.setOrgId( ThreadLocalUserInfoAdapter.getOrgId());
PageResult<EvalProjectEntity> pageResult = evalProjectDomainService.page(domainQuery);
return PageResponse.of(
evalProjectCmdConvertor.convertEListToProgressCOList(pageResult.getRecords()),
pageResult.getTotal());
domainQuery.setOrgId(ThreadLocalUserInfoAdapter.getOrgId());
Page<EvalProjectProgressCO> page = new Page<>(domainQuery.getPageNum(), domainQuery.getPageSize());
IPage<EvalProjectProgressCO> result = evalProjectMapper.selectProgressPage(page, domainQuery);
if (result.getRecords() != null) {
result.getRecords().forEach(this::fillProgressStatus);
}
return PageResponse.of(result.getRecords(), result.getTotal());
}
/**
*
*
* - = planEndDate -
* - &lt; 0DELAY
* - 0 &le; &le; 3NEAR
* - &gt; 3NORMAL
*/
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) {

View File

@ -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;

View File

@ -15,6 +15,9 @@ public class EvalProjectProgressPageQuery extends BasePageQuery {
@ApiModelProperty("项目名称")
private String projectName;
@ApiModelProperty("客户名称")
private String customerName;
@ApiModelProperty("项目进度状态NORMAL正常 NEAR临期 DELAY延期")
private String progressStatus;
}

View File

@ -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;

View File

@ -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<EvalProjectDO> {
@Select("SELECT MAX(project_no) FROM eval_project WHERE project_no LIKE CONCAT(#{prefix}, '%')")
String selectMaxProjectNoByPrefix(@Param("prefix") String prefix);
/**
* eval_customer EvalProjectProgressCO
*/
IPage<EvalProjectProgressCO> selectProgressPage(Page<EvalProjectProgressCO> page, @Param("query") EvalProjectQuery query);
}

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.qinan.safetyeval.infrastructure.mapper.EvalProjectMapper">
<!-- 项目进度管理分页查询(关联 eval_customer 获取客户名称;进度状态/剩余天数由业务代码计算) -->
<select id="selectProgressPage"
resultType="org.qinan.safetyeval.client.co.institution.EvalProjectProgressCO">
SELECT
p.id,
p.project_no,
p.project_name,
c.customer_name,
p.customer_contact_name,
p.project_leader_name,
p.plan_end_date
FROM eval_project p
LEFT JOIN eval_customer c
ON c.id = p.customer_id
AND c.delete_enum = 'false'
WHERE p.delete_enum = 'false'
<if test="query.orgId != null">
AND p.org_id = #{query.orgId}
</if>
<if test="query.projectName != null and query.projectName != ''">
AND p.project_name LIKE CONCAT('%', #{query.projectName}, '%')
</if>
<if test="query.customerName != null and query.customerName != ''">
AND c.customer_name LIKE CONCAT('%', #{query.customerName}, '%')
</if>
<if test="query.progressStatus != null and query.progressStatus == 'DELAY'">
AND p.plan_end_date &lt; CURDATE()
</if>
<if test="query.progressStatus != null and query.progressStatus == 'NEAR'">
AND p.plan_end_date &gt;= CURDATE()
AND p.plan_end_date &lt;= DATE_ADD(CURDATE(), INTERVAL 3 DAY)
</if>
<if test="query.progressStatus != null and query.progressStatus == 'NORMAL'">
AND p.plan_end_date &gt; DATE_ADD(CURDATE(), INTERVAL 3 DAY)
</if>
ORDER BY p.id DESC
</select>
</mapper>