luotaiqian 2026-07-27 14:37:22 +08:00
parent 6ecc871fd5
commit 4c159ba695
3 changed files with 72 additions and 28 deletions

View File

@ -32,6 +32,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
@ -102,14 +103,37 @@ public class RegulatorEvalProjectMonitorExecutor implements RegulatorEvalProject
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 -> {
List<RegulatorEvalProjectSurveyPageCO> records = result.getRecords();
if (records != null && !records.isEmpty()) {
List<Long> projectIds = records.stream()
.map(co -> Long.parseLong(co.getId()))
.collect(Collectors.toList());
// 按项目ID批量查询人员打卡统计与附件统计回填到分页结果
Map<String, RegulatorEvalProjectSurveyPageCO> personnelMap = evalProjectMapper
.selectSurveyPersonnelStatByProjectIds(projectIds).stream()
.collect(Collectors.toMap(RegulatorEvalProjectSurveyPageCO::getId, co -> co));
Map<String, RegulatorEvalProjectSurveyPageCO> attachMap = evalProjectMapper
.selectSurveyAttachStatByProjectIds(projectIds).stream()
.collect(Collectors.toMap(RegulatorEvalProjectSurveyPageCO::getId, co -> co));
records.forEach(co -> {
// 应到人数固定为2
co.setExpectedCount(SURVEY_EXPECTED_COUNT);
RegulatorEvalProjectSurveyPageCO personnel = personnelMap.get(co.getId());
if (personnel != null) {
co.setActualCount(personnel.getActualCount());
co.setSignInCount(personnel.getSignInCount());
co.setSignOutCount(personnel.getSignOutCount());
}
RegulatorEvalProjectSurveyPageCO attach = attachMap.get(co.getId());
if (attach != null) {
co.setScenePhotoCount(attach.getScenePhotoCount());
co.setNotificationFileUrl(attach.getNotificationFileUrl());
}
// 人脸识别直接复用签退统计结果
co.setFaceCount(co.getSignOutCount());
});
}
return PageResponse.of(result.getRecords(), result.getTotal());
return PageResponse.of(records, result.getTotal());
}
@Override

View File

@ -61,6 +61,16 @@ public interface EvalProjectMapper extends BaseMapper<EvalProjectDO> {
IPage<RegulatorEvalProjectSurveyPageCO> selectRegulatorSurveyPage(
Page<RegulatorEvalProjectSurveyPageCO> page, @Param("query") RegulatorEvalProjectSurveyPageQuery query);
/**
* ID eval_survey //退 personnel_id
*/
List<RegulatorEvalProjectSurveyPageCO> selectSurveyPersonnelStatByProjectIds(@Param("projectIds") List<Long> projectIds);
/**
* ID eval_survey_attach
*/
List<RegulatorEvalProjectSurveyPageCO> selectSurveyAttachStatByProjectIds(@Param("projectIds") List<Long> projectIds);
/**
* - org_personnel ID eval_survey
*/

View File

@ -172,10 +172,7 @@
</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由业务代码设置 -->
实到/签到/签退/现场照片/告知书等统计数据由业务代码按项目ID批量查询后回填 -->
<select id="selectRegulatorSurveyPage"
resultType="org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectSurveyPageCO">
SELECT
@ -183,26 +180,7 @@
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
o.unit_name AS org_name
FROM eval_project p
LEFT JOIN org_info o
ON o.id = p.org_id
@ -222,6 +200,38 @@
ORDER BY p.id DESC
</select>
<!-- 按项目ID批量统计 eval_survey 人员打卡数据(实到/签到/签退,按 personnel_id 去重) -->
<select id="selectSurveyPersonnelStatByProjectIds"
resultType="org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectSurveyPageCO">
SELECT
s.project_id AS id,
COUNT(DISTINCT CASE WHEN s.sing_in_time IS NOT NULL AND s.sign_out_time IS NOT NULL THEN s.personnel_id END) AS actual_count,
COUNT(DISTINCT CASE WHEN s.sing_in_time IS NOT NULL THEN s.personnel_id END) AS sign_in_count,
COUNT(DISTINCT CASE WHEN s.sign_out_time IS NOT NULL THEN s.personnel_id END) AS sign_out_count
FROM eval_survey s
WHERE s.delete_enum = 'false'
AND s.project_id IN
<foreach collection="projectIds" item="pid" open="(" separator="," close=")">
#{pid}
</foreach>
GROUP BY s.project_id
</select>
<!-- 按项目ID批量统计 eval_survey_attach 附件数据(现场照片数、告知书文件地址) -->
<select id="selectSurveyAttachStatByProjectIds"
resultType="org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectSurveyPageCO">
SELECT
sa.project_id AS id,
SUM(CASE WHEN sa.attach_type_code IN ('RECTIFICATION_REVIEW', 'SITE_INSPECTION_FORM') THEN 1 ELSE 0 END) AS scene_photo_count,
MAX(CASE WHEN sa.attach_type_code = 'PRACTICE_NOTIFICATION' THEN sa.file_url END) AS notification_file_url
FROM eval_survey_attach sa
WHERE sa.project_id IN
<foreach collection="projectIds" item="pid" open="(" separator="," close=")">
#{pid}
</foreach>
GROUP BY sa.project_id
</select>
<!-- 监管端-项目踏勘人员打卡信息查询按项目ID查询 eval_survey关联 org_personnel 获取人员姓名 -->
<select id="selectRegulatorSurveyClockInList"
resultType="org.qinan.safetyeval.client.co.regulator.RegulatorEvalSurveyClockInCO">