luotaiqian 2026-07-27 10:25:01 +08:00
parent 0f4e2aafcf
commit 38d3bff093
8 changed files with 226 additions and 0 deletions

View File

@ -5,10 +5,13 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.qinan.safetyeval.client.api.regulator.RegulatorEvalProjectMonitorApi;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectMonitorCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectMonitorPageCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectMonitorStatCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectNodeOverviewCO;
import org.qinan.safetyeval.client.dto.PageResponse;
import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.regulator.RegulatorEvalProjectMonitorPageQuery;
import org.qinan.safetyeval.client.dto.regulator.RegulatorEvalProjectMonitorRealtimePageQuery;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -44,5 +47,16 @@ public class RegulatorEvalProjectMonitorController {
return regulatorEvalProjectMonitorApi.nodeOverview(projectId);
}
@ApiOperation("实时监控统计")
@GetMapping("/stat")
public SingleResponse<RegulatorEvalProjectMonitorStatCO> stat() {
return regulatorEvalProjectMonitorApi.stat();
}
@ApiOperation("实时监控分页")
@GetMapping("/realtime-page")
public PageResponse<RegulatorEvalProjectMonitorPageCO> realtimePage(@Validated RegulatorEvalProjectMonitorRealtimePageQuery query) {
return regulatorEvalProjectMonitorApi.realtimePage(query);
}
}

View File

@ -1,19 +1,27 @@
package org.qinan.safetyeval.app.executor.regulator;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.qinan.safetyeval.app.executor.support.EvalProjectNodeOverviewAssembler;
import org.qinan.safetyeval.app.executor.support.RegulatorMonitorCoConverter;
import org.qinan.safetyeval.client.api.regulator.RegulatorEvalProjectMonitorApi;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectMonitorCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectMonitorPageCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectMonitorStatCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectNodeOverviewCO;
import org.qinan.safetyeval.client.dto.PageResponse;
import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.regulator.RegulatorEvalProjectMonitorPageQuery;
import org.qinan.safetyeval.client.dto.regulator.RegulatorEvalProjectMonitorRealtimePageQuery;
import org.qinan.safetyeval.domain.constant.EvalTypeEnum;
import org.qinan.safetyeval.domain.constant.IndustryEnum;
import org.qinan.safetyeval.domain.entity.EvalProjectEntity;
import org.qinan.safetyeval.domain.exception.BizException;
import org.qinan.safetyeval.domain.exception.ErrorCode;
import org.qinan.safetyeval.domain.gateway.EvalProjectGateway;
import org.qinan.safetyeval.domain.query.EvalProjectQuery;
import org.qinan.safetyeval.domain.query.PageResult;
import org.qinan.safetyeval.infrastructure.mapper.EvalProjectMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@ -26,6 +34,8 @@ public class RegulatorEvalProjectMonitorExecutor implements RegulatorEvalProject
private EvalProjectGateway evalProjectGateway;
@Resource
private EvalProjectNodeOverviewAssembler evalProjectNodeOverviewAssembler;
@Resource
private EvalProjectMapper evalProjectMapper;
@Override
public PageResponse<RegulatorEvalProjectMonitorCO> page(RegulatorEvalProjectMonitorPageQuery query) {
@ -57,4 +67,23 @@ public class RegulatorEvalProjectMonitorExecutor implements RegulatorEvalProject
return SingleResponse.success(RegulatorMonitorCoConverter.toRegulatorOverview(
evalProjectNodeOverviewAssembler.buildForRegulator(Long.parseLong(projectId))));
}
@Override
public SingleResponse<RegulatorEvalProjectMonitorStatCO> stat() {
return SingleResponse.success(evalProjectMapper.selectRegulatorMonitorStat());
}
@Override
public PageResponse<RegulatorEvalProjectMonitorPageCO> realtimePage(RegulatorEvalProjectMonitorRealtimePageQuery query) {
Page<RegulatorEvalProjectMonitorPageCO> page = new Page<>(query.getCurrent(), query.getSize());
IPage<RegulatorEvalProjectMonitorPageCO> result = evalProjectMapper.selectRegulatorMonitorPage(page, query);
if (result.getRecords() != null) {
result.getRecords().forEach(this::fillDisplayFields);
}
return PageResponse.of(result.getRecords(), result.getTotal());
}
private void fillDisplayFields(RegulatorEvalProjectMonitorPageCO co) {
}
}

View File

@ -1,10 +1,13 @@
package org.qinan.safetyeval.client.api.regulator;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectMonitorCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectMonitorPageCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectMonitorStatCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectNodeOverviewCO;
import org.qinan.safetyeval.client.dto.PageResponse;
import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.regulator.RegulatorEvalProjectMonitorPageQuery;
import org.qinan.safetyeval.client.dto.regulator.RegulatorEvalProjectMonitorRealtimePageQuery;
public interface RegulatorEvalProjectMonitorApi {
@ -13,4 +16,8 @@ public interface RegulatorEvalProjectMonitorApi {
SingleResponse<RegulatorEvalProjectMonitorCO> get(Long id);
SingleResponse<RegulatorEvalProjectNodeOverviewCO> nodeOverview(String projectId);
SingleResponse<RegulatorEvalProjectMonitorStatCO> stat();
PageResponse<RegulatorEvalProjectMonitorPageCO> realtimePage(RegulatorEvalProjectMonitorRealtimePageQuery query);
}

View File

@ -0,0 +1,40 @@
package org.qinan.safetyeval.client.co.regulator;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDate;
/**
* -
*/
@Data
public class RegulatorEvalProjectMonitorPageCO {
@ApiModelProperty("项目ID")
private String id;
@ApiModelProperty("机构ID")
private String orgId;
@ApiModelProperty("项目编号")
private String projectNo;
@ApiModelProperty("项目名称")
private String projectName;
@ApiModelProperty("评价机构")
private String orgName;
@ApiModelProperty("评价类型编码")
private String evalTypeCode;
@ApiModelProperty("行业编码")
private String industryCode;
@ApiModelProperty("负责人")
private String leaderName;
@ApiModelProperty("计划完成日期")
private LocalDate planEndDate;
}

View File

@ -0,0 +1,23 @@
package org.qinan.safetyeval.client.co.regulator;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* -
*/
@Data
public class RegulatorEvalProjectMonitorStatCO {
@ApiModelProperty("在监项目数")
private Integer monitoringCount;
@ApiModelProperty("正常执行数(未归档)")
private Integer normalCount;
@ApiModelProperty("进度/人员预警数")
private Integer warningCount;
@ApiModelProperty("本月计划完成数")
private Integer monthPlanCompleteCount;
}

View File

@ -0,0 +1,40 @@
package org.qinan.safetyeval.client.dto.regulator;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.qinan.safetyeval.client.dto.BasePageQuery;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
/**
* -
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class RegulatorEvalProjectMonitorRealtimePageQuery extends BasePageQuery {
@ApiModelProperty("项目名称/编号")
private String projectNameOrNo;
@ApiModelProperty("评价机构ID")
private Long orgId;
@ApiModelProperty("评价类型编码PRE/ACCEPT/STATUS")
private String evalTypeCode;
@ApiModelProperty("行业类别编码")
private String industryCode;
@ApiModelProperty("项目负责人")
private String leaderName;
@ApiModelProperty("计划完成日期-起")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate planEndDateStart;
@ApiModelProperty("计划完成日期-止")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate planEndDateEnd;
}

View File

@ -8,6 +8,9 @@ import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.qinan.safetyeval.client.co.institution.EvalProjectProgressCO;
import org.qinan.safetyeval.client.co.institution.RiskWarningCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectMonitorPageCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectMonitorStatCO;
import org.qinan.safetyeval.client.dto.regulator.RegulatorEvalProjectMonitorRealtimePageQuery;
import org.qinan.safetyeval.domain.query.EvalProjectQuery;
import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectDO;
@ -31,4 +34,15 @@ public interface EvalProjectMapper extends BaseMapper<EvalProjectDO> {
long onSiteTaskSum(@Param("pIds") List<Long> pIds, @Param("val") String val);
/**
* -SQL
*/
RegulatorEvalProjectMonitorStatCO selectRegulatorMonitorStat();
/**
* - org_info
*/
IPage<RegulatorEvalProjectMonitorPageCO> selectRegulatorMonitorPage(
Page<RegulatorEvalProjectMonitorPageCO> page, @Param("query") RegulatorEvalProjectMonitorRealtimePageQuery query);
}

View File

@ -78,4 +78,63 @@
JSON_CONTAINS(project_node, JSON_OBJECT('type', #{val},'state', 0))
</select>
<!-- 监管端-安评项目实时监控统计:未删除且法定项目(is_statutory=1) -->
<select id="selectRegulatorMonitorStat"
resultType="org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectMonitorStatCO">
SELECT
COUNT(*) AS monitoringCount,
IFNULL(SUM(CASE WHEN archive_flag =0 THEN 1 ELSE 0 END), 0) AS normalCount,
0 AS warningCount,
IFNULL(SUM(CASE WHEN plan_end_date BETWEEN DATE_FORMAT(NOW(), '%Y-%m-01')
AND DATE_ADD(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 1 MONTH)
THEN 1 ELSE 0 END), 0) AS monthPlanCompleteCount
FROM eval_project
WHERE delete_enum = 'false'
AND is_statutory = 1
</select>
<!-- 监管端-安评项目实时监控分页:未删除且法定项目(is_statutory=1),关联 org_info 获取评价机构名称 -->
<select id="selectRegulatorMonitorPage"
resultType="org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectMonitorPageCO">
SELECT
p.id,
p.org_id,
p.project_no,
p.project_name,
o.unit_name AS org_name,
p.eval_type_code,
p.industry_code,
p.customer_contact_name AS leader_name,
p.plan_end_date
FROM eval_project p
LEFT JOIN org_info o
ON o.id = p.org_id
AND o.delete_enum = 'false'
WHERE p.delete_enum = 'false'
AND p.is_statutory = 1
<if test="query.projectNameOrNo != null and query.projectNameOrNo != ''">
AND (p.project_name LIKE CONCAT('%', #{query.projectNameOrNo}, '%')
OR p.project_no LIKE CONCAT('%', #{query.projectNameOrNo}, '%'))
</if>
<if test="query.orgId != null">
AND p.org_id = #{query.orgId}
</if>
<if test="query.evalTypeCode != null and query.evalTypeCode != ''">
AND p.eval_type_code = #{query.evalTypeCode}
</if>
<if test="query.industryCode != null and query.industryCode != ''">
AND p.industry_code = #{query.industryCode}
</if>
<if test="query.leaderName != null and query.leaderName != ''">
AND p.customer_contact_name LIKE CONCAT('%', #{query.leaderName}, '%')
</if>
<if test="query.planEndDateStart != null">
AND p.plan_end_date &gt;= #{query.planEndDateStart}
</if>
<if test="query.planEndDateEnd != null">
AND p.plan_end_date &lt;= #{query.planEndDateEnd}
</if>
ORDER BY p.id DESC
</select>
</mapper>