Commit fa871ca2 authored by 鲁鸿波's avatar 鲁鸿波

监督检查企业合规率详表开发

parent e082728b
......@@ -320,26 +320,6 @@ public class AccidentReportController extends SuperController {
return baseResponse;
}
/*@ApiOperation(value = "导出事故信息详情明细", notes = "导出事故信息详情明细")
@GetMapping(value = "/accidentReportDetailExport")
public BaseResponse<BizGeneralResponse> export(HttpServletResponse response, ReportDetailParam reportDetailParam){
BaseResponse<BizGeneralResponse> baseResponse=new BaseResponse<>();
Page<AccidentReportDetail> accidentReportDetailPage = accidentReportService.selectAccidentReportDetail(reportDetailParam);
if (org.apache.commons.collections4.CollectionUtils.isEmpty(accidentReportDetailPage.getRecords())) {
baseResponse.setData(BizGeneralResponse.builder().result("无事故信息详情明细数据").build());
return baseResponse;
}
List<AccidentReportDetailTemplate> accidentReportDetailTemplate = BeanConverUtil.converList(accidentReportDetailPage.getRecords(), AccidentReportDetailTemplate.class);
int index = 1;
for(AccidentReportDetailTemplate template : accidentReportDetailTemplate){
template.setNumber(String.valueOf(index++));
}
EasyExcelUtil.writeExcel(response, "事故信息详情明细", "事故信息详情明细", accidentReportDetailTemplate);
baseResponse.setData(
BizGeneralResponse.builder().result(TypeHelper.castToString(true)).build());
return baseResponse;
}*/
@ApiOperation(value = "导出事故信息详情明细", notes = "导出事故信息详情明细")
@GetMapping(value = "/accidentReportDetailExport")
public BaseResponse<BizGeneralResponse> export(HttpServletResponse response, ReportDetailParam reportDetailParam) {
......@@ -353,7 +333,7 @@ public class AccidentReportController extends SuperController {
}
// 使用扩展的转换工具
BeanConverExtensionUtil.converAccidentReportDetailList(accidentReportDetailPage.getRecords())
List<AccidentReportDetailTemplate> accidentReportDetailTemplate = BeanConverExtensionUtil.converAccidentReportDetailList(accidentReportDetailPage.getRecords());
// 设置序号
for (int i = 0; i < accidentReportDetailTemplate.size(); i++) {
......
......@@ -2,8 +2,10 @@ package com.testor.module.hazard.controller;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.testor.common.util.excel.EasyExcelUtil;
import com.testor.module.hazard.model.domain.THazardWorkPlanCheck;
import com.testor.module.hazard.model.dto.*;
import com.testor.module.hazard.model.template.HazardWorkPlanStatisticsExportTemplate;
import com.testor.module.hazard.model.vo.HazardWorkPlanCheckComplianceStatisticsVO;
import com.testor.module.hazard.model.vo.HazardWorkPlanCheckProblemCountStatisticsVO;
import com.testor.module.hazard.model.vo.HazardWorkPlanCheckProblemTypeStatisticsVO;
......@@ -12,6 +14,7 @@ import com.tongtech.tfw.backend.common.biz.constants.BizConstants;
import com.tongtech.tfw.backend.common.biz.models.BaseResponse;
import com.tongtech.tfw.backend.common.biz.models.BaseResponseList;
import com.tongtech.tfw.backend.common.biz.models.BizGeneralResponse;
import com.tongtech.tfw.backend.common.context.ContextUtils;
import com.tongtech.tfw.backend.common.models.supers.SuperController;
import com.tongtech.tfw.backend.core.helper.ObjectHelper;
import com.tongtech.tfw.backend.core.helper.StringHelper;
......@@ -87,7 +90,43 @@ public class THazardWorkPlanCheckStatisticsController extends SuperController
return baseResponse;
}
@ApiOperation(value = "企业合规率详表")
@GetMapping(value = "/detailsOfHazardousOperations")
public BaseResponse<BaseResponseList<HazardWorkPlanCheckDetailResult>> detailsOfHazardousOperations(THazardWorkPlanCheckParam tHazardWorkPlanCheckParam){
BaseResponse<BaseResponseList<HazardWorkPlanCheckDetailResult>>baseResponse=new BaseResponse<>();
if(StringHelper.isEmpty(tHazardWorkPlanCheckParam.getOrgId())){
tHazardWorkPlanCheckParam.setOrgId(ContextUtils.getLoginUser().getOrgId());
}
Page<HazardWorkPlanCheckDetailResult> resultList= tHazardWorkPlanCheckService.detailsOfHazardousOperations(tHazardWorkPlanCheckParam);
BaseResponseList<HazardWorkPlanCheckDetailResult> baseResponseList=new BaseResponseList<>();
baseResponseList.setData(resultList.getRecords());
baseResponseList.setTotal(resultList.getTotal());
baseResponse.setData(baseResponseList);
return baseResponse;
}
@GetMapping("/exportHazardStatistics")
@ApiOperation(value = "导出企业合规率详表")
public void exportHazardStatistics(HttpServletResponse response, THazardWorkPlanCheckParam param) {
// 设置不分页(获取所有数据)
param.setPage(String.valueOf(1));
param.setLimit(String.valueOf(Integer.MAX_VALUE));
if(StringHelper.isEmpty(param.getOrgId())){
param.setOrgId(ContextUtils.getLoginUser().getOrgId());
}
List<HazardWorkPlanCheckDetailResult> results = tHazardWorkPlanCheckService.detailsOfHazardousOperations(param).getRecords();
List<HazardWorkPlanStatisticsExportTemplate> templates = new ArrayList<>();
int index = 1;
for (HazardWorkPlanCheckDetailResult r : results) {
templates.add(HazardWorkPlanStatisticsExportTemplate.fromResult(r, index++));
}
EasyExcelUtil.writeExcel(response, "企业合规率详表明细", "企业合规率详表明细", templates);
}
}
......@@ -137,32 +137,20 @@ public interface THazardWorkPlanCheckDao extends SuperDao<THazardWorkPlanCheck>
List<HazardWorkPlanCheckDetail> workStatusStatistics(@Param("param") THazardWorkPlanCheckParam tHazardWorkPlanCheckParam);
/**
* 企业合规率详情之组织机构类型抽查率/合规率 统计
* 企业合规率详情之统计合规率
* @param tHazardWorkPlanCheckParam
* @return
*/
List<HazardWorkPlanCheckDetail> isRentSpotCheckStatistics(@Param("param") THazardWorkPlanCheckParam tHazardWorkPlanCheckParam);
List<HazardWorkPlanCheckDetail> comprehensiveStatistics(@Param("param") THazardWorkPlanCheckParam tHazardWorkPlanCheckParam);
/**
* 企业合规率详情之组织机构类型抽查率/合规率 统计
* 企业合规率详情之统计抽查率
* @param tHazardWorkPlanCheckParam
* @return
*/
List<HazardWorkPlanCheckDetail> comprehensiveStatistics(@Param("param") THazardWorkPlanCheckParam tHazardWorkPlanCheckParam);
List<HazardWorkPlanCheckDetail> isRentSpotCheckStatistics(@Param("param") THazardWorkPlanCheckParam tHazardWorkPlanCheckParam);
/**
* 企业合规率详情之作业级别合规率统计
* @param tHazardWorkPlanCheckParam
* @return
*//*
List<HazardWorkPlanCheckDetail> complianceRateStatistics(@Param("param") THazardWorkPlanCheckParam tHazardWorkPlanCheckParam);
*//**
* 企业合规率详情之组织机构类型合规率统计
* @param tHazardWorkPlanCheckParam
* @return
*//*
List<HazardWorkPlanCheckDetail> isRentComplianceRateStatistics(@Param("param") THazardWorkPlanCheckParam tHazardWorkPlanCheckParam);*/
......
......@@ -24,6 +24,6 @@ public class HazardWorkPlanCheckDetailResult {
private Map<String, Double> spotCheckRateStats;
@ApiModelProperty("危险作业状态")
private Map<String, Integer> workStatusStats; // 作业状态统计
private Map<String, Integer> workStatusStats;
}
package com.testor.module.hazard.model.template;
import com.alibaba.excel.annotation.ExcelProperty;
import com.testor.module.hazard.model.dto.HazardWorkPlanCheckDetailResult;
import lombok.Data;
import java.util.Map;
@Data
public class HazardWorkPlanStatisticsExportTemplate {
@ExcelProperty("序号")
private String number;
@ExcelProperty("大区")
private String regionName;
@ExcelProperty("经营部")
private String businessDeptName;
@ExcelProperty("企业名称")
private String currentOrgName;
// ========== 合规率 ==========
@ExcelProperty("全部作业合规率(%)")
private Double allComplianceRate;
@ExcelProperty("企业作业合规率(%)")
private Double enterpriseComplianceRate;
@ExcelProperty("相关方作业合规率(%)")
private Double relatedPartyComplianceRate;
@ExcelProperty("高度作业合规率(%)")
private Double highComplianceRate;
@ExcelProperty("较大作业合规率(%)")
private Double majorComplianceRate;
@ExcelProperty("一般作业合规率(%)")
private Double normalComplianceRate;
// ========== 抽查率 ==========
@ExcelProperty("企业作业抽查率(%)")
private Double enterpriseCheckRate;
@ExcelProperty("相关方作业抽查率(%)")
private Double relatedPartyCheckRate;
@ExcelProperty("高度作业抽查率(%)")
private Double highSpotCheckRate;
@ExcelProperty("较大作业抽查率(%)")
private Double majorSpotCheckRate;
@ExcelProperty("一般作业抽查率(%)")
private Double normalSpotCheckRate;
// ========== 危险作业状态 ==========
@ExcelProperty("五必须")
private Integer fiveMust;
@ExcelProperty("信息真实性")
private Integer informationTruth;
@ExcelProperty("违章作业")
private Integer illegalOperation;
@ExcelProperty("劳动组织")
private Integer laborOrganization;
@ExcelProperty("风险管理")
private Integer riskManagement;
@ExcelProperty("提级管理")
private Integer escalationManagement;
@ExcelProperty("变更管理")
private Integer changeManagement;
@ExcelProperty("其他")
private Integer otherStatus;
/**
* 从 HazardWorkPlanCheckDetailResult 填充模板
*/
public static HazardWorkPlanStatisticsExportTemplate fromResult(HazardWorkPlanCheckDetailResult result, int index) {
HazardWorkPlanStatisticsExportTemplate template = new HazardWorkPlanStatisticsExportTemplate();
template.setNumber(String.valueOf(index));
template.setRegionName(result.getRegionName());
template.setBusinessDeptName(result.getBusinessDeptName());
template.setCurrentOrgName(result.getCurrentOrgName());
Map<String, Double> compliance = result.getComplianceRateStats();
template.setAllComplianceRate(compliance.getOrDefault("全部作业", 0D));
template.setEnterpriseComplianceRate(compliance.getOrDefault("企业作业", 0D));
template.setRelatedPartyComplianceRate(compliance.getOrDefault("相关方作业", 0D));
template.setHighComplianceRate(compliance.getOrDefault("高度作业", 0D));
template.setMajorComplianceRate(compliance.getOrDefault("较大作业", 0D));
template.setNormalComplianceRate(compliance.getOrDefault("一般作业", 0D));
Map<String, Double> spotCheck = result.getSpotCheckRateStats();
template.setEnterpriseCheckRate(spotCheck.getOrDefault("企业作业", 0D));
template.setRelatedPartyCheckRate(spotCheck.getOrDefault("相关方作业", 0D));
template.setHighSpotCheckRate(spotCheck.getOrDefault("高度作业", 0D));
template.setMajorSpotCheckRate(spotCheck.getOrDefault("较大作业", 0D));
template.setNormalSpotCheckRate(spotCheck.getOrDefault("一般作业", 0D));
Map<String, Integer> status = result.getWorkStatusStats();
template.setFiveMust(status.getOrDefault("五必须", 0));
template.setInformationTruth(status.getOrDefault("信息真实性", 0));
template.setIllegalOperation(status.getOrDefault("违章作业", 0));
template.setLaborOrganization(status.getOrDefault("劳动组织", 0));
template.setRiskManagement(status.getOrDefault("风险管理", 0));
template.setEscalationManagement(status.getOrDefault("提级管理", 0));
template.setChangeManagement(status.getOrDefault("变更管理", 0));
template.setOtherStatus(status.getOrDefault("其他", 0));
return template;
}
}
......@@ -6,50 +6,55 @@ import lombok.Data;
@Data
public class HazardWorkPlanCheckDetail {
@ApiModelProperty(value = "大区名称")
@ApiModelProperty("大区名称")
private String regionName;
@ApiModelProperty(value = "经营部")
@ApiModelProperty("经营部名称")
private String businessDeptName;
@ApiModelProperty(value = "企业名称")
@ApiModelProperty("企业名称")
private String currentOrgName;
@ApiModelProperty(value = "合规率之全部作业比例")
private String totalProblemCount;
// ---------------- 合规率 ----------------
@ApiModelProperty("企业作业合规率")
private Double enterpriseComplianceRate;
@ApiModelProperty(value = "企业性质(企业/相关方)")
private String orgTypeName;
@ApiModelProperty("相关方作业合规率")
private Double relatedPartyComplianceRate;
@ApiModelProperty(value = "合规率之企业作业比例")
private String enterpriseComplianceRate;
@ApiModelProperty("高度危险作业合规率")
private Double complianceRateHigh;
@ApiModelProperty(value = "合规率之相关方作业比例")
private String relatedPartyComplianceRate;
@ApiModelProperty("较大危险作业合规率")
private Double complianceRateMajor;
@ApiModelProperty(value = "作业级别名称")
private String workLevelNameComplianceRate;
@ApiModelProperty("一般危险作业合规率")
private Double complianceRateNormal;
@ApiModelProperty(value = "合规率作业级别比例")
private String workLevelComplianceRate;
// ---------------- 抽查率 ----------------
@ApiModelProperty("企业作业抽查率")
private Double enterpriseCheckRate;
@ApiModelProperty(value = "抽查率作业级别比例")
private String workLevelCheckRate;
@ApiModelProperty("相关方作业抽查率")
private Double relatedPartySpotCheckRate;
@ApiModelProperty(value = "危险作业状态之问题名称")
private String problemName;
@ApiModelProperty(value = "危险作业状态之问题数量")
private Integer problemCount;
@ApiModelProperty("高度危险作业抽查率")
private Double spotCheckRateHigh;
@ApiModelProperty(value = "抽查率之企业作业比例")
private String enterpriseCheckRate;
@ApiModelProperty(value = "抽查率之相关方作业比例")
private String relatedPartySpotCheckRate;
@ApiModelProperty("较大危险作业抽查率")
private Double spotCheckRateMajor;
@ApiModelProperty("一般危险作业抽查率")
private Double spotCheckRateNormal;
// ---------------- 危险作业状态 ----------------
@ApiModelProperty("问题名称")
private String problemName;
@ApiModelProperty("问题数量")
private Integer problemCount;
@ApiModelProperty("是否租户(0:否,1:是)")
private String isRent;
}
package com.testor.module.hazard.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.testor.module.hazard.model.domain.THazardWorkPlan;
import com.testor.module.hazard.model.domain.THazardWorkPlanCheck;
import com.testor.module.hazard.model.dto.HazardWorkPlanCheckEnterpriseComplianceDto;
import com.testor.module.hazard.model.dto.HazardWorkPlanCheckStatsDTO;
import com.testor.module.hazard.model.dto.THazardWorkPlanCheckParam;
import com.testor.module.hazard.model.dto.*;
import com.testor.module.hazard.model.template.HazardWorkPlanStatisticsTemplate;
import com.testor.module.hazard.model.vo.HazardWorkPlanCheckComplianceStatisticsVO;
import com.testor.module.hazard.model.vo.HazardWorkPlanCheckDetail;
import com.testor.module.hazard.model.vo.HazardWorkPlanCheckProblemCountStatisticsVO;
import com.testor.module.hazard.model.vo.HazardWorkPlanCheckProblemTypeStatisticsVO;
import com.testor.module.safe.model.dto.TSafeHazardOrgParam;
import com.tongtech.tfw.backend.common.models.supers.SuperService;
import org.apache.ibatis.annotations.Param;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
......@@ -139,7 +133,6 @@ public interface THazardWorkPlanCheckService extends SuperService<THazardWorkPla
* @param tHazardWorkPlanCheckParam
* @return
*/
Page<HazardWorkPlanCheckDetail> detailsOfHazardousOperations(THazardWorkPlanCheckParam tHazardWorkPlanCheckParam);
Page<HazardWorkPlanCheckDetailResult> detailsOfHazardousOperations(THazardWorkPlanCheckParam tHazardWorkPlanCheckParam);
}
......@@ -3,6 +3,7 @@ package com.testor.module.hazard.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.testor.biz.sys.dict.data.dao.SysDictDataDao;
import com.testor.biz.sys.dict.data.service.SysDictDataService;
import com.testor.biz.sys.user.model.domain.SysUser;
import com.testor.common.core.utils.StringUtils;
import com.testor.module.hazard.dao.HazardWorkPlanStatisticsDao;
import com.testor.module.hazard.model.dto.HazardWorkPlanStatisticsDto;
......@@ -12,7 +13,9 @@ import com.testor.module.hazard.model.dto.THazardWorkPlanStatistics;
import com.testor.module.hazard.model.template.HazardWorkPlanStatisticsTemplate;
import com.testor.module.hazard.model.vo.HazardWorkPlanStatisticsVO;
import com.testor.module.hazard.service.HazardWorkPlanStatisticsService;
import com.testor.module.iam.service.SysUserService;
import com.testor.module.sys.service.NewSysDictDataService;
import com.testor.module.sys.service.TSysUserService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -27,6 +30,9 @@ public class HazardWorkPlanStatisticsServiceImpl implements HazardWorkPlanStatis
@Autowired
private NewSysDictDataService dictDataService;
@Autowired
private SysUserService userService;
/**
* 危险作业分布统计,根据单位
*
......@@ -89,6 +95,7 @@ public class HazardWorkPlanStatisticsServiceImpl implements HazardWorkPlanStatis
@Override
public Page<HazardWorkPlanStatisticsResult> selectWorkStatusDetailStatistics(HazardWorkPlanStatisticsDto query) {
// 0. 获取所有字典值
Map<String, List<String>> allDictValues = getAllDictValues();
......
package com.testor.module.hazard.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
......@@ -11,30 +10,22 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.testor.biz.sys.dict.data.model.domain.SysDictData;
import com.testor.biz.sys.dict.data.service.SysDictDataService;
import com.testor.biz.sys.org.model.domain.SysOrg;
import com.testor.biz.sys.org.service.SysOrgService;
import com.testor.biz.sys.user.model.domain.SysUser;
import com.testor.module.emergency.model.vo.TContingencyPlanVO;
import com.testor.module.hazard.dao.THazardWorkPlanCheckDao;
import com.testor.module.hazard.model.domain.THazardWorkPlan;
import com.testor.module.hazard.model.domain.THazardWorkPlanCheck;
import com.testor.module.hazard.model.dto.HazardWorkPlanCheckEnterpriseComplianceDto;
import com.testor.module.hazard.model.dto.HazardWorkPlanCheckStatsDTO;
import com.testor.module.hazard.model.dto.THazardWorkPlanCheckParam;
import com.testor.module.hazard.model.dto.*;
import com.testor.module.hazard.model.template.HazardWorkPlanStatisticsTemplate;
import com.testor.module.hazard.model.vo.*;
import com.testor.module.hazard.service.THazardWorkPlanCheckService;
import com.testor.module.iam.service.SysUserService;
import com.testor.module.notice.dao.TSysOrgDao;
import com.testor.module.notice.model.domain.TSysOrg;
import com.testor.module.safe.model.domain.TSafeHazardOrg;
import com.testor.module.safe.model.vo.TSafeHazardExportVO;
import com.testor.module.safe.model.vo.TSafeHazardOrgStatisticsVO;
import com.testor.module.safe.service.impl.TSafeHazardOrgServiceImpl;
import com.testor.module.sys.dao.NewSysOrgDao;
import com.testor.module.sys.model.domian.NewSysOrg;
import com.testor.module.sys.service.NewSysDictDataService;
import com.testor.module.sys.service.NewSysOrgService;
import com.tongtech.tfw.backend.common.biz.constants.BizConstants;
import com.tongtech.tfw.backend.common.context.ContextUtils;
import com.tongtech.tfw.backend.core.helper.IdHelper;
......@@ -53,10 +44,7 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.*;
import java.util.stream.Collectors;
/**
......@@ -89,6 +77,19 @@ public class THazardWorkPlanCheckServiceImpl extends SuperServiceImpl<THazardWor
@Autowired
private NewSysOrgDao newSysOrgDao;
// 业务字典
private static final List<String> COMPLIANCE_KEYS = Arrays.asList(
"全部作业", "企业作业", "相关方作业", "高度作业", "较大作业", "一般作业"
);
private static final List<String> SPOTCHECK_KEYS = Arrays.asList(
"企业作业", "相关方作业", "高度作业", "较大作业", "一般作业"
);
private static final List<String> WORKSTATUS_KEYS = Arrays.asList(
"五必须", "信息真实性", "违章作业", "劳动组织", "风险管理", "提级管理", "变更管理", "其他"
);
@Override
public Page<THazardWorkPlanCheck> selectTHazardWorkPlanCheckList(THazardWorkPlanCheckParam tHazardWorkPlanCheckParam) {
......@@ -404,10 +405,145 @@ public class THazardWorkPlanCheckServiceImpl extends SuperServiceImpl<THazardWor
}
@Override
public Page<HazardWorkPlanCheckDetail> detailsOfHazardousOperations(THazardWorkPlanCheckParam tHazardWorkPlanCheckParam) {
return null;
public Page<HazardWorkPlanCheckDetailResult> detailsOfHazardousOperations(THazardWorkPlanCheckParam param) {
// 1️⃣ 查询三类统计数据(不分页)
List<HazardWorkPlanCheckDetail> complianceList = baseMapper.comprehensiveStatistics(param);
List<HazardWorkPlanCheckDetail> spotCheckList = baseMapper.isRentSpotCheckStatistics(param);
List<HazardWorkPlanCheckDetail> workStatusList = baseMapper.workStatusStatistics(param);
// 2️⃣ 聚合为 Map(唯一 Key:大区|经营部|企业)
Map<String, HazardWorkPlanCheckDetailResult> resultMap = new LinkedHashMap<>();
buildComplianceStats(complianceList, resultMap);
buildSpotCheckStats(spotCheckList, resultMap);
buildWorkStatusStats(workStatusList, resultMap,WORKSTATUS_KEYS);
// 3️⃣ Map → List
List<HazardWorkPlanCheckDetailResult> allRecords = new ArrayList<>(resultMap.values());
// 4️⃣ 手动分页
return manualPage(allRecords, param);
}
// 手动分页
private Page<HazardWorkPlanCheckDetailResult> manualPage(List<HazardWorkPlanCheckDetailResult> allRecords, THazardWorkPlanCheckParam param) {
int pageNum = param.getPage() == null ? 1 : Integer.valueOf(param.getPage());
int pageSize = param.getLimit() == null ? 10 : Integer.valueOf(param.getLimit());
int total = allRecords.size();
int fromIndex = (pageNum - 1) * pageSize;
int toIndex = Math.min(fromIndex + pageSize, total);
List<HazardWorkPlanCheckDetailResult> pageRecords = fromIndex >= total ? Collections.emptyList() : allRecords.subList(fromIndex, toIndex);
Page<HazardWorkPlanCheckDetailResult> page = new Page<>();
page.setCurrent(pageNum);
page.setSize(pageSize);
page.setTotal(total);
page.setRecords(pageRecords);
return page;
}
// 获取或创建结果对象(初始化所有指标为0)
private HazardWorkPlanCheckDetailResult getOrCreate(HazardWorkPlanCheckDetail vo,
Map<String, HazardWorkPlanCheckDetailResult> map) {
String key = (vo.getRegionName() != null ? vo.getRegionName() : "") + "|"
+ (vo.getBusinessDeptName() != null ? vo.getBusinessDeptName() : "") + "|"
+ (vo.getCurrentOrgName() != null ? vo.getCurrentOrgName() : "");
return map.computeIfAbsent(key, k -> {
HazardWorkPlanCheckDetailResult r = new HazardWorkPlanCheckDetailResult();
r.setRegionName(vo.getRegionName());
r.setBusinessDeptName(vo.getBusinessDeptName());
r.setCurrentOrgName(vo.getCurrentOrgName());
// 初始化合规率
Map<String, Double> complianceMap = new LinkedHashMap<>();
COMPLIANCE_KEYS.forEach(k2 -> complianceMap.put(k2, 0D));
r.setComplianceRateStats(complianceMap);
// 初始化抽查率
Map<String, Double> spotCheckMap = new LinkedHashMap<>();
SPOTCHECK_KEYS.forEach(k2 -> spotCheckMap.put(k2, 0D));
r.setSpotCheckRateStats(spotCheckMap);
// 初始化危险作业状态
Map<String, Integer> statusMap = new LinkedHashMap<>();
WORKSTATUS_KEYS.forEach(k2 -> statusMap.put(k2, 0));
r.setWorkStatusStats(statusMap);
return r;
});
}
// 构建合规率
private void buildComplianceStats(List<HazardWorkPlanCheckDetail> list,
Map<String,HazardWorkPlanCheckDetailResult> resultMap){
for(HazardWorkPlanCheckDetail vo : list){
HazardWorkPlanCheckDetailResult r = getOrCreate(vo,resultMap);
r.getComplianceRateStats().put("全部作业", vo.getEnterpriseComplianceRate() != null ? vo.getEnterpriseComplianceRate() : 0D);
r.getComplianceRateStats().put("企业作业", vo.getEnterpriseComplianceRate() != null ? vo.getEnterpriseComplianceRate() : 0D);
r.getComplianceRateStats().put("相关方作业", vo.getRelatedPartyComplianceRate() != null ? vo.getRelatedPartyComplianceRate() : 0D);
r.getComplianceRateStats().put("高度作业", vo.getComplianceRateHigh() != null ? vo.getComplianceRateHigh() : 0D);
r.getComplianceRateStats().put("较大作业", vo.getComplianceRateMajor() != null ? vo.getComplianceRateMajor() : 0D);
r.getComplianceRateStats().put("一般作业", vo.getComplianceRateNormal() != null ? vo.getComplianceRateNormal() : 0D);
}
}
// 构建抽查率
private void buildSpotCheckStats(List<HazardWorkPlanCheckDetail> list,
Map<String,HazardWorkPlanCheckDetailResult> resultMap){
for(HazardWorkPlanCheckDetail vo : list){
HazardWorkPlanCheckDetailResult r = getOrCreate(vo,resultMap);
r.getSpotCheckRateStats().put("企业作业", vo.getEnterpriseCheckRate() != null ? vo.getEnterpriseCheckRate() : 0D);
r.getSpotCheckRateStats().put("相关方作业", vo.getRelatedPartySpotCheckRate() != null ? vo.getRelatedPartySpotCheckRate() : 0D);
r.getSpotCheckRateStats().put("高度作业", vo.getSpotCheckRateHigh() != null ? vo.getSpotCheckRateHigh() : 0D);
r.getSpotCheckRateStats().put("较大作业", vo.getSpotCheckRateMajor() != null ? vo.getSpotCheckRateMajor() : 0D);
r.getSpotCheckRateStats().put("一般作业", vo.getSpotCheckRateNormal() != null ? vo.getSpotCheckRateNormal() : 0D);
}
}
// 构建作业状态统计
private void buildWorkStatusStats(List<HazardWorkPlanCheckDetail> list,
Map<String,HazardWorkPlanCheckDetailResult> resultMap,
List<String> allStatuses){
for(HazardWorkPlanCheckDetail vo : list){
HazardWorkPlanCheckDetailResult r = getOrCreate(vo,resultMap);
Map<String,Integer> map = r.getWorkStatusStats();
String status = vo.getProblemName() != null && !vo.getProblemName().trim().isEmpty() ? vo.getProblemName() : "未知状态";
// 初始化字典
if(allStatuses != null){
for(String s : allStatuses){
map.putIfAbsent(s,0);
}
}
map.put(status, vo.getProblemCount() != null ? vo.getProblemCount() : 0);
}
}
// 获取所有字典值
private Map<String, List<String>> getAllDictValues() {
Map<String, List<String>> dictValues = new HashMap<>();
// 作业级别字典
List<String> workLevelDicts = dictDataService.getDictValuesByDictId("222842ea3bb4468bbbeaa3856a4f2731");
dictValues.put("workLevel", workLevelDicts != null ? workLevelDicts : new ArrayList<>());
// 作业状态字典
List<String> workStatusDicts = dictDataService.getDictValuesByDictId("60c11c98359b4cd09b7220202abf9e0b");
dictValues.put("workStatus", workStatusDicts != null ? workStatusDicts : new ArrayList<>());
return dictValues;
}
public String montageStartTime(String startTime){
if(startTime !=null && !"".equals(startTime) ){
startTime = startTime+" 00:00:00";
......
......@@ -456,15 +456,15 @@
region.org_name as regionName,
bd.org_name as businessDeptName,
so.org_name as currentOrgName,
sdd.dict_value problemType,
count(1) problemCount
sdd.dict_value as problemName,
COUNT(1) as problemCount
FROM t_hazard_work_plan_check hwpc
LEFT JOIN t_sys_org so ON so.org_id = hwpc.basic_id
LEFT JOIN t_sys_org bd ON bd.org_id = so.parent_id
LEFT JOIN t_sys_org region ON region.org_id = bd.parent_id
LEFT JOIN t_sys_org hq ON hq.org_id = region.parent_id
LEFT JOIN t_sys_dict_data sdd ON sdd.dict_data_id = hwpc.problem_type
WHERE hwpc.status = '0' and hwpc.is_compliant='0'
WHERE hwpc.status = '0'
AND hwpc.is_compliant='0'
AND hwpc.basic_id IN (
SELECT org_id FROM t_sys_org
WHERE org_id = #{param.orgId}
......@@ -473,148 +473,111 @@
<if test="param.startTime != null and param.startTime != '' and param.endTime != null and param.endTime != ''">
AND hwpc.create_date BETWEEN #{param.startTime} AND #{param.endTime}
</if>
GROUP BY hq.org_name, region.org_name, bd.org_name, so.org_name,sdd.dict_value
ORDER BY hq.org_name, region.org_name, bd.org_name, so.org_name,sdd.dict_value,problemCount desc
GROUP BY region.org_name, bd.org_name, so.org_name, sdd.dict_value
ORDER BY region.org_name, bd.org_name, so.org_name, problemCount DESC
</select>
<select id="comprehensiveStatistics" resultType="com.testor.module.hazard.model.vo.HazardWorkPlanCheckDetail">
SELECT
region.org_name as regionName,
bd.org_name as businessDeptName,
so.org_name as currentOrgName,
sdd.dict_value as workLevelNameComplianceRate,
so.is_rent as isRent,
CASE
WHEN so.is_rent = '0' THEN '企业作业'
WHEN so.is_rent = '1' THEN '相关方作业'
ELSE '未知'
END as orgTypeName,
region.org_name AS regionName,
bd.org_name AS businessDeptName,
so.org_name AS currentOrgName,
so.is_rent AS isRent,
COUNT(DISTINCT hwpl.id) as totalWorkCount,
COUNT(DISTINCT CASE WHEN hwpc.is_compliant = '0' THEN hwpl.id END) as totalProblemCount,
CASE
WHEN COUNT(DISTINCT hwpl.id) = 0 THEN 100.00
ELSE ROUND(
(COUNT(DISTINCT hwpl.id) - COUNT(DISTINCT CASE WHEN hwpc.is_compliant = '0' THEN hwpl.id END))
* 100.0 / COUNT(DISTINCT hwpl.id),
2
)
END as CONCAT(totalComplianceRate,'%'),
-- 企业/相关方合规率
ROUND(
(SUM(CASE WHEN so.is_rent='0' THEN 1 ELSE 0 END)
- SUM(CASE WHEN so.is_rent='0' AND hwpc.is_compliant='0' THEN 1 ELSE 0 END))
* 100.0 / NULLIF(SUM(CASE WHEN so.is_rent='0' THEN 1 ELSE 0 END), 0), 2
) AS enterpriseComplianceRate,
COUNT(DISTINCT CASE WHEN so.is_rent = '0' THEN hwpl.id END) as enterpriseWorkCount,
COUNT(DISTINCT CASE WHEN so.is_rent = '0' AND hwpc.is_compliant = '0' THEN hwpl.id END) as enterpriseProblemCount,
CASE
WHEN COUNT(DISTINCT CASE WHEN so.is_rent = '0' THEN hwpl.id END) = 0 THEN 100.00
ELSE ROUND(
(COUNT(DISTINCT CASE WHEN so.is_rent = '0' THEN hwpl.id END) -
COUNT(DISTINCT CASE WHEN so.is_rent = '0' AND hwpc.is_compliant = '0' THEN hwpl.id END))
* 100.0 / COUNT(DISTINCT CASE WHEN so.is_rent = '0' THEN hwpl.id END),
2
)
END as CONCAT(enterpriseComplianceRate,'%'),
ROUND(
(SUM(CASE WHEN so.is_rent='1' THEN 1 ELSE 0 END)
- SUM(CASE WHEN so.is_rent='1' AND hwpc.is_compliant='0' THEN 1 ELSE 0 END))
* 100.0 / NULLIF(SUM(CASE WHEN so.is_rent='1' THEN 1 ELSE 0 END), 0), 2
) AS relatedPartyComplianceRate,
COUNT(DISTINCT CASE WHEN so.is_rent = '1' THEN hwpl.id END) as relatedPartyWorkCount,
COUNT(DISTINCT CASE WHEN so.is_rent = '1' AND hwpc.is_compliant = '0' THEN hwpl.id END) as relatedPartyProblemCount,
CASE
WHEN COUNT(DISTINCT CASE WHEN so.is_rent = '1' THEN hwpl.id END) = 0 THEN 100.00
ELSE ROUND(
(COUNT(DISTINCT CASE WHEN so.is_rent = '1' THEN hwpl.id END) -
COUNT(DISTINCT CASE WHEN so.is_rent = '1' AND hwpc.is_compliant = '0' THEN hwpl.id END))
* 100.0 / COUNT(DISTINCT CASE WHEN so.is_rent = '1' THEN hwpl.id END),
2
)
END as CONCAT(relatedPartyComplianceRate,'%'),
-- 等级合规率
ROUND(
(SUM(CASE WHEN hwpl.work_level='27a3fcef809f4a5f9f138bd83b88eebc' THEN 1 ELSE 0 END)
- SUM(CASE WHEN hwpl.work_level='27a3fcef809f4a5f9f138bd83b88eebc' AND hwpc.is_compliant='0' THEN 1 ELSE 0 END))
* 100.0 / NULLIF(SUM(CASE WHEN hwpl.work_level='27a3fcef809f4a5f9f138bd83b88eebc' THEN 1 ELSE 0 END), 0), 2
) AS complianceRateHigh,
COUNT(DISTINCT hwpl.id) as workLevelTotalWorkCount,
COUNT(DISTINCT CASE WHEN hwpc.is_compliant = '0' THEN hwpl.id END) as workLevelProblemWorkCount,
CASE
WHEN COUNT(DISTINCT hwpl.id) = 0 THEN 100.00
ELSE ROUND(
(COUNT(DISTINCT hwpl.id) - COUNT(DISTINCT CASE WHEN hwpc.is_compliant = '0' THEN hwpl.id END))
* 100.0 / COUNT(DISTINCT hwpl.id),
2
)
END as CONCAT(workLevelComplianceRate,'%'),
ROUND(
(SUM(CASE WHEN hwpl.work_level='bbc120baa7474f5182dcf65b427deaf8' THEN 1 ELSE 0 END)
- SUM(CASE WHEN hwpl.work_level='bbc120baa7474f5182dcf65b427deaf8' AND hwpc.is_compliant='0' THEN 1 ELSE 0 END))
* 100.0 / NULLIF(SUM(CASE WHEN hwpl.work_level='bbc120baa7474f5182dcf65b427deaf8' THEN 1 ELSE 0 END), 0), 2
) AS complianceRateMajor,
COUNT(DISTINCT CASE WHEN hwpc.id IS NOT NULL THEN hwpl.id END) as workLevelCheckedCount,
CASE
WHEN COUNT(DISTINCT hwpl.id) = 0 THEN 0.00
ELSE ROUND(
COUNT(DISTINCT CASE WHEN hwpc.id IS NOT NULL THEN hwpl.id END) * 100.0 / COUNT(DISTINCT hwpl.id),
2
)
END as CONCAT(workLevelCheckRate,'%')
ROUND(
(SUM(CASE WHEN hwpl.work_level='81bbc09df7b941fd8851af1b4d25d309' THEN 1 ELSE 0 END)
- SUM(CASE WHEN hwpl.work_level='81bbc09df7b941fd8851af1b4d25d309' AND hwpc.is_compliant='0' THEN 1 ELSE 0 END))
* 100.0 / NULLIF(SUM(CASE WHEN hwpl.work_level='81bbc09df7b941fd8851af1b4d25d309' THEN 1 ELSE 0 END), 0), 2
) AS complianceRateNormal
FROM t_hazard_work_plan hwpl
LEFT JOIN t_hazard_work_plan_check hwpc ON hwpc.plan_id = hwpl.id
LEFT JOIN t_hazard_work_plan_check hwpc ON hwpc.plan_id = hwpl.id AND (hwpc.status='0' OR hwpc.status IS NULL)
LEFT JOIN t_sys_org so ON so.org_id = hwpl.org_id
LEFT JOIN t_sys_org bd ON bd.org_id = so.parent_id
LEFT JOIN t_sys_org region ON region.org_id = bd.parent_id
LEFT JOIN t_sys_org hq ON hq.org_id = region.parent_id
LEFT JOIN t_sys_dict_data sdd ON sdd.dict_data_id = hwpl.work_level
AND sdd.dict_id = '222842ea3bb4468bbbeaa3856a4f2731'
WHERE hwpl.status = '0'
AND (hwpc.status = '0' OR hwpc.status IS NULL)
AND hwpc.basic_id IN (
WHERE hwpl.status='0'
AND hwpl.org_id IN (
SELECT org_id FROM t_sys_org
WHERE org_id = #{param.orgId}
OR parent_ids LIKE CONCAT('%', #{param.orgId}, '%')
)
<if test="param.startTime != null and param.startTime != '' and param.endTime != null and param.endTime != ''">
AND hwpc.create_date BETWEEN #{param.startTime} AND #{param.endTime}
AND hwpl.create_date BETWEEN #{param.startTime} AND #{param.endTime}
</if>
GROUP BY region.org_name, bd.org_name, so.org_name, sdd.dict_value, so.is_rent
ORDER BY region.org_name, bd.org_name, so.org_name, sdd.dict_value, so.is_rent,
workLevelComplianceRate DESC, workLevelCheckRate DESC
GROUP BY region.org_name, bd.org_name, so.org_name, so.is_rent
ORDER BY region.org_name, bd.org_name, so.org_name
</select>
<select id="isRentSpotCheckStatistics" resultType="com.testor.module.hazard.model.vo.HazardWorkPlanCheckDetail">
<select id="isRentSpotCheckStatistics" resultType="com.testor.module.hazard.model.vo.HazardWorkPlanCheckDetail">
SELECT
region.org_name as regionName,
bd.org_name as businessDeptName,
so.org_name as currentOrgName,
region.org_name AS regionName,
bd.org_name AS businessDeptName,
so.org_name AS currentOrgName,
COUNT(DISTINCT CASE WHEN so.is_rent = '0' THEN hwpl.id END) as enterpriseTotalWork,
COUNT(DISTINCT CASE WHEN so.is_rent = '0' AND hwpc.id IS NOT NULL THEN hwpl.id END) as enterpriseCheckedWork,
CASE
WHEN COUNT(DISTINCT CASE WHEN so.is_rent = '0' THEN hwpl.id END) = 0 THEN 0.00
ELSE ROUND(
COUNT(DISTINCT CASE WHEN so.is_rent = '0' AND hwpc.id IS NOT NULL THEN hwpl.id END) * 100.0 /
COUNT(DISTINCT CASE WHEN so.is_rent = '0' THEN hwpl.id END),
2
)
END as CONCAT(enterpriseCheckRate,'%'),
COUNT(DISTINCT CASE WHEN so.is_rent = '1' THEN hwpl.id END) as relatedPartyTotalWork,
COUNT(DISTINCT CASE WHEN so.is_rent = '1' AND hwpc.id IS NOT NULL THEN hwpl.id END) as relatedPartyCheckedWork,
CASE
WHEN COUNT(DISTINCT CASE WHEN so.is_rent = '1' THEN hwpl.id END) = 0 THEN 0.00
ELSE ROUND(
COUNT(DISTINCT CASE WHEN so.is_rent = '1' AND hwpc.id IS NOT NULL THEN hwpl.id END) * 100.0 /
COUNT(DISTINCT CASE WHEN so.is_rent = '1' THEN hwpl.id END),
2
)
END as CONCAT(relatedPartyCheckRate,'%')
-- 企业/相关方抽查率
ROUND(SUM(CASE WHEN so.is_rent='0' AND hwpc.id IS NOT NULL THEN 1 ELSE 0 END) * 100.0 /
NULLIF(SUM(CASE WHEN so.is_rent='0' THEN 1 ELSE 0 END),2), 2) AS enterpriseCheckRate,
ROUND(SUM(CASE WHEN so.is_rent='1' AND hwpc.id IS NOT NULL THEN 1 ELSE 0 END) * 100.0 /
NULLIF(SUM(CASE WHEN so.is_rent='1' THEN 1 ELSE 0 END),2), 2) AS relatedPartySpotCheckRate,
-- 等级抽查率
ROUND(SUM(CASE WHEN hwpl.work_level='27a3fcef809f4a5f9f138bd83b88eebc' AND hwpc.id IS NOT NULL THEN 1 ELSE 0 END) * 100.0 /
NULLIF(SUM(CASE WHEN hwpl.work_level='27a3fcef809f4a5f9f138bd83b88eebc' THEN 1 ELSE 0 END),0),2) AS spotCheckRateHigh,
ROUND(SUM(CASE WHEN hwpl.work_level='bbc120baa7474f5182dcf65b427deaf8' AND hwpc.id IS NOT NULL THEN 1 ELSE 0 END) * 100.0 /
NULLIF(SUM(CASE WHEN hwpl.work_level='bbc120baa7474f5182dcf65b427deaf8' THEN 1 ELSE 0 END),0),2) AS spotCheckRateMajor,
ROUND(SUM(CASE WHEN hwpl.work_level='81bbc09df7b941fd8851af1b4d25d309' AND hwpc.id IS NOT NULL THEN 1 ELSE 0 END) * 100.0 /
NULLIF(SUM(CASE WHEN hwpl.work_level='81bbc09df7b941fd8851af1b4d25d309' THEN 1 ELSE 0 END),0),2) AS spotCheckRateNormal
FROM t_hazard_work_plan hwpl
LEFT JOIN t_hazard_work_plan_check hwpc ON hwpc.plan_id = hwpl.id
AND hwpc.status = '0'
LEFT JOIN t_hazard_work_plan_check hwpc ON hwpc.plan_id = hwpl.id AND hwpc.status='0'
LEFT JOIN t_sys_org so ON so.org_id = hwpl.org_id
LEFT JOIN t_sys_org bd ON bd.org_id = so.parent_id
LEFT JOIN t_sys_org region ON region.org_id = bd.parent_id
WHERE hwpl.status = '0'
AND hwpc.basic_id IN (
WHERE hwpl.status='0'
AND hwpl.org_id IN (
SELECT org_id FROM t_sys_org
WHERE org_id = #{param.orgId}
OR parent_ids LIKE CONCAT('%', #{param.orgId}, '%')
)
<if test="param.startTime != null and param.startTime != '' and param.endTime != null and param.endTime != ''">
AND hwpc.create_date BETWEEN #{param.startTime} AND #{param.endTime}
AND hwpl.create_date BETWEEN #{param.startTime} AND #{param.endTime}
</if>
GROUP BY region.org_name, bd.org_name, so.org_name
ORDER BY region.org_name, bd.org_name, so.org_name,enterpriseCheckRate desc,relatedPartyCheckRate desc;
ORDER BY region.org_name, bd.org_name, so.org_name
</select>
</mapper>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment