luotaiqian 2026-07-27 14:14:26 +08:00
parent 5f0b79bb05
commit 6ecc871fd5
8 changed files with 250 additions and 0 deletions

View File

@ -8,11 +8,14 @@ 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.co.regulator.RegulatorEvalProjectSurveyPageCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectSurveyStatCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalSurveyClockInCO;
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.client.dto.regulator.RegulatorEvalProjectSurveyPageQuery;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -20,6 +23,7 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
@Api(tags = "监管端-安评项目")
@RestController
@ -66,4 +70,17 @@ public class RegulatorEvalProjectMonitorController {
return regulatorEvalProjectMonitorApi.realtimePage(query);
}
@ApiOperation("项目踏勘监管分页")
@GetMapping("/survey-page")
public PageResponse<RegulatorEvalProjectSurveyPageCO> surveyPage(@Validated RegulatorEvalProjectSurveyPageQuery query) {
return regulatorEvalProjectMonitorApi.surveyPage(query);
}
@ApiOperation("人员打卡信息查询")
@GetMapping("/survey-clock-in")
public SingleResponse<List<RegulatorEvalSurveyClockInCO>> surveyClockInList(
@ApiParam("项目ID") @RequestParam String projectId) {
return regulatorEvalProjectMonitorApi.surveyClockInList(projectId);
}
}

View File

@ -9,11 +9,14 @@ 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.co.regulator.RegulatorEvalProjectSurveyPageCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectSurveyStatCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalSurveyClockInCO;
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.client.dto.regulator.RegulatorEvalProjectSurveyPageQuery;
import org.qinan.safetyeval.domain.constant.EvalTypeEnum;
import org.qinan.safetyeval.domain.constant.IndustryEnum;
import org.qinan.safetyeval.domain.constant.ProjectProcessWaringStatusEnum;
@ -28,11 +31,15 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.util.List;
import java.util.stream.Collectors;
@Service
public class RegulatorEvalProjectMonitorExecutor implements RegulatorEvalProjectMonitorApi {
/** 项目踏勘监管-应到人数固定为2 */
private static final int SURVEY_EXPECTED_COUNT = 2;
@Resource
private EvalProjectGateway evalProjectGateway;
@Resource
@ -91,6 +98,25 @@ public class RegulatorEvalProjectMonitorExecutor implements RegulatorEvalProject
return PageResponse.of(result.getRecords(), result.getTotal());
}
@Override
public PageResponse<RegulatorEvalProjectSurveyPageCO> surveyPage(RegulatorEvalProjectSurveyPageQuery query) {
Page<RegulatorEvalProjectSurveyPageCO> page = new Page<>(query.getCurrent(), query.getSize());
IPage<RegulatorEvalProjectSurveyPageCO> result = evalProjectMapper.selectRegulatorSurveyPage(page, query);
if (result.getRecords() != null) {
// 应到人数固定为2人脸识别直接复用签退统计结果
result.getRecords().forEach(co -> {
co.setExpectedCount(SURVEY_EXPECTED_COUNT);
co.setFaceCount(co.getSignOutCount());
});
}
return PageResponse.of(result.getRecords(), result.getTotal());
}
@Override
public SingleResponse<List<RegulatorEvalSurveyClockInCO>> surveyClockInList(String projectId) {
return SingleResponse.success(evalProjectMapper.selectRegulatorSurveyClockInList(Long.parseLong(projectId)));
}
private void fillDisplayFields(RegulatorEvalProjectMonitorPageCO co) {
LocalDate planEndDate = co.getPlanEndDate();
// 当前时间大于等于计划完成日期,则项目逾期:预警状态与过程预警状态置为异常

View File

@ -4,11 +4,16 @@ 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.co.regulator.RegulatorEvalProjectSurveyPageCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectSurveyStatCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalSurveyClockInCO;
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.client.dto.regulator.RegulatorEvalProjectSurveyPageQuery;
import java.util.List;
public interface RegulatorEvalProjectMonitorApi {
@ -23,4 +28,8 @@ public interface RegulatorEvalProjectMonitorApi {
SingleResponse<RegulatorEvalProjectSurveyStatCO> selectRegulatorSurveyStat();
PageResponse<RegulatorEvalProjectMonitorPageCO> realtimePage(RegulatorEvalProjectMonitorRealtimePageQuery query);
PageResponse<RegulatorEvalProjectSurveyPageCO> surveyPage(RegulatorEvalProjectSurveyPageQuery query);
SingleResponse<List<RegulatorEvalSurveyClockInCO>> surveyClockInList(String projectId);
}

View File

@ -0,0 +1,47 @@
package org.qinan.safetyeval.client.co.regulator;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* -
*/
@Data
public class RegulatorEvalProjectSurveyPageCO {
@ApiModelProperty("项目ID")
private String id;
@ApiModelProperty("机构ID")
private String orgId;
@ApiModelProperty("项目编号")
private String projectNo;
@ApiModelProperty("项目名称")
private String projectName;
@ApiModelProperty("评价机构")
private String orgName;
@ApiModelProperty("应到人数固定2")
private Integer expectedCount;
@ApiModelProperty("实到人数")
private Integer actualCount;
@ApiModelProperty("签到人数")
private Integer signInCount;
@ApiModelProperty("签退人数")
private Integer signOutCount;
@ApiModelProperty("人脸识别人数")
private Integer faceCount;
@ApiModelProperty("现场照片数")
private Integer scenePhotoCount;
@ApiModelProperty("告知书文件地址")
private String notificationFileUrl;
}

View File

@ -0,0 +1,40 @@
package org.qinan.safetyeval.client.co.regulator;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
* -
*/
@Data
public class RegulatorEvalSurveyClockInCO {
@ApiModelProperty("踏勘记录ID")
private Long id;
@ApiModelProperty("人员姓名org_personnel.user_name")
private String userName;
@ApiModelProperty("项目角色")
private String role;
@ApiModelProperty("人脸识别0未通过 1通过")
private Integer faceState;
@ApiModelProperty("GPS定位0未通过 1通过")
private Integer gpsState;
@ApiModelProperty("签到时间")
private LocalDateTime singInTime;
@ApiModelProperty("签退时间")
private LocalDateTime signOutTime;
@ApiModelProperty("现场照片")
private String sceneUrl;
@ApiModelProperty("签字")
private String signatureUrl;
}

View File

@ -0,0 +1,23 @@
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;
/**
* -
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class RegulatorEvalProjectSurveyPageQuery extends BasePageQuery {
@ApiModelProperty("项目名称/编号")
private String projectNameOrNo;
@ApiModelProperty("评价机构ID")
private Long orgId;
@ApiModelProperty("人员打卡状态")
private String clockInStatus;
}

View File

@ -10,8 +10,11 @@ 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.co.regulator.RegulatorEvalProjectSurveyPageCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectSurveyStatCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalSurveyClockInCO;
import org.qinan.safetyeval.client.dto.regulator.RegulatorEvalProjectMonitorRealtimePageQuery;
import org.qinan.safetyeval.client.dto.regulator.RegulatorEvalProjectSurveyPageQuery;
import org.qinan.safetyeval.domain.query.EvalProjectQuery;
import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectDO;
@ -51,4 +54,16 @@ public interface EvalProjectMapper extends BaseMapper<EvalProjectDO> {
IPage<RegulatorEvalProjectMonitorPageCO> selectRegulatorMonitorPage(
Page<RegulatorEvalProjectMonitorPageCO> page, @Param("query") RegulatorEvalProjectMonitorRealtimePageQuery query);
/**
* - org_info
* eval_survey //退/ eval_survey_attach
*/
IPage<RegulatorEvalProjectSurveyPageCO> selectRegulatorSurveyPage(
Page<RegulatorEvalProjectSurveyPageCO> page, @Param("query") RegulatorEvalProjectSurveyPageQuery query);
/**
* - org_personnel ID eval_survey
*/
List<RegulatorEvalSurveyClockInCO> selectRegulatorSurveyClockInList(@Param("projectId") Long projectId);
}

View File

@ -171,4 +171,77 @@
ORDER BY p.id DESC
</select>
<!-- 监管端-项目踏勘监管分页:未删除且法定项目(is_statutory=1),关联 org_info 获取评价机构名称;
实到/签到/签退/人脸识别取自 eval_survey按 personnel_id 去重);
现场照片取自 eval_survey_attachattach_type_code IN RECTIFICATION_REVIEW/SITE_INSPECTION_FORM 的 file_url 数量);
告知书取自 eval_survey_attachattach_type_code = PRACTICE_NOTIFICATION 的 file_url
应到人数固定为2由业务代码设置 -->
<select id="selectRegulatorSurveyPage"
resultType="org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectSurveyPageCO">
SELECT
p.id,
p.org_id,
p.project_no,
p.project_name,
o.unit_name AS org_name,
(SELECT COUNT(DISTINCT s.personnel_id) FROM eval_survey s
WHERE s.project_id = p.id
AND s.delete_enum = 'false'
AND s.sing_in_time IS NOT NULL
AND s.sign_out_time IS NOT NULL) AS actual_count,
(SELECT COUNT(DISTINCT s.personnel_id) FROM eval_survey s
WHERE s.project_id = p.id
AND s.delete_enum = 'false'
AND s.sing_in_time IS NOT NULL) AS sign_in_count,
(SELECT COUNT(DISTINCT s.personnel_id) FROM eval_survey s
WHERE s.project_id = p.id
AND s.delete_enum = 'false'
AND s.sign_out_time IS NOT NULL) AS sign_out_count,
(SELECT COUNT(*) FROM eval_survey_attach sa
WHERE sa.project_id = p.id
AND sa.attach_type_code IN ('RECTIFICATION_REVIEW', 'SITE_INSPECTION_FORM')) AS scene_photo_count,
(SELECT sa.file_url FROM eval_survey_attach sa
WHERE sa.project_id = p.id
AND sa.attach_type_code = 'PRACTICE_NOTIFICATION' LIMIT 1) AS notification_file_url
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.clockInStatus != null and query.clockInStatus != ''">
AND p.clock_in_status = #{query.clockInStatus}
</if>
ORDER BY p.id DESC
</select>
<!-- 监管端-项目踏勘人员打卡信息查询按项目ID查询 eval_survey关联 org_personnel 获取人员姓名 -->
<select id="selectRegulatorSurveyClockInList"
resultType="org.qinan.safetyeval.client.co.regulator.RegulatorEvalSurveyClockInCO">
SELECT
s.id,
op.user_name AS user_name,
s.role,
s.face_state,
s.gps_state,
s.sing_in_time,
s.sign_out_time,
s.scene_url,
s.signature_url
FROM eval_survey s
LEFT JOIN org_personnel op
ON op.id = s.personnel_id
AND op.delete_enum = 'false'
WHERE s.delete_enum = 'false'
AND s.project_id = #{projectId}
ORDER BY s.id ASC
</select>
</mapper>