Commit 856f0a73 authored by 鲁鸿波's avatar 鲁鸿波

危险作业统计开发

parent f2b6120b
...@@ -551,5 +551,5 @@ INSERT INTO "t_sys_dict_data" ("dict_data_id", "dict_id", "dict_key", "dict_valu ...@@ -551,5 +551,5 @@ INSERT INTO "t_sys_dict_data" ("dict_data_id", "dict_id", "dict_key", "dict_valu
INSERT INTO "t_sys_dict_data" ("dict_data_id", "dict_id", "dict_key", "dict_value", "tree_sort", "status", "create_by", "create_date", "update_by", "update_date", "remarks", "parent_id", "parent_ids") VALUES ('27', '4', '11', '不涉及', '11', '0', NULL, '2026-01-09 15:07:41', NULL, '2026-01-09 15:07:41', NULL, NULL, NULL); INSERT INTO "t_sys_dict_data" ("dict_data_id", "dict_id", "dict_key", "dict_value", "tree_sort", "status", "create_by", "create_date", "update_by", "update_date", "remarks", "parent_id", "parent_ids") VALUES ('27', '4', '11', '不涉及', '11', '0', NULL, '2026-01-09 15:07:41', NULL, '2026-01-09 15:07:41', NULL, NULL, NULL);
INSERT INTO "t_sys_dict_type" ("dict_id", "dict_name", "dict_type", "is_sys", "status", "create_by", "create_date", "update_by", "update_date", "remarks", "parent_id", "parent_ids", "tree_sort", "cascaded") VALUES ('5', '事故受伤部位', 'injured_area', NULL, NULL, NULL, '2026-01-09 15:10:48', NULL, '2026-01-09 15:10:48', NULL, NULL, NULL, NULL, NULL); INSERT INTO "t_sys_dict_type" ("dict_id", "dict_name", "dict_type", "is_sys", "status", "create_by", "create_date", "update_by", "update_date", "remarks", "parent_id", "parent_ids", "tree_sort", "cascaded") VALUES ('5', '事故受伤部位', 'injured_area', '1', '0', NULL, '2026-01-09 15:10:48', NULL, '2026-01-09 15:10:48', NULL, NULL, NULL, NULL, NULL);
INSERT INTO "t_sys_dict_data" ("dict_data_id", "dict_id", "dict_key", "dict_value", "tree_sort", "status", "create_by", "create_date", "update_by", "update_date", "remarks", "parent_id", "parent_ids") VALUES ('28', '5', '1', '手臂', '1', '0', NULL, '2026-01-09 15:11:09', NULL, '2026-01-09 15:11:09', NULL, NULL, NULL); INSERT INTO "t_sys_dict_data" ("dict_data_id", "dict_id", "dict_key", "dict_value", "tree_sort", "status", "create_by", "create_date", "update_by", "update_date", "remarks", "parent_id", "parent_ids") VALUES ('28', '5', '1', '手臂', '1', '0', NULL, '2026-01-09 15:11:09', NULL, '2026-01-09 15:11:09', NULL, NULL, NULL);
...@@ -11,7 +11,9 @@ import com.testor.biz.util.CacheDicUtils; ...@@ -11,7 +11,9 @@ import com.testor.biz.util.CacheDicUtils;
import com.testor.common.constant.DicTypeCode; import com.testor.common.constant.DicTypeCode;
import com.testor.common.constant.ProcessStatus; import com.testor.common.constant.ProcessStatus;
import com.testor.common.model.UpdateProcessStatusReq; import com.testor.common.model.UpdateProcessStatusReq;
import com.testor.common.util.BeanConverUtil;
import com.testor.common.util.EnumUtil; import com.testor.common.util.EnumUtil;
import com.testor.common.util.excel.EasyExcelUtil;
import com.testor.module.accident.model.domain.AccidentReport; import com.testor.module.accident.model.domain.AccidentReport;
import com.testor.module.accident.model.dto.AccidentReportDelParam; import com.testor.module.accident.model.dto.AccidentReportDelParam;
import com.testor.module.accident.model.dto.AccidentReportDetail; import com.testor.module.accident.model.dto.AccidentReportDetail;
...@@ -19,16 +21,20 @@ import com.testor.module.accident.model.req.*; ...@@ -19,16 +21,20 @@ import com.testor.module.accident.model.req.*;
import com.testor.module.accident.model.resp.*; import com.testor.module.accident.model.resp.*;
import com.testor.module.accident.model.vo.AccidentReportVO; import com.testor.module.accident.model.vo.AccidentReportVO;
import com.testor.module.accident.service.AccidentReportService; import com.testor.module.accident.service.AccidentReportService;
import com.testor.module.accident.template.AccidentReportDetailTemplate;
import com.testor.module.hazard.model.dto.ReportDetailParam; import com.testor.module.hazard.model.dto.ReportDetailParam;
import com.testor.module.hazard.model.dto.THazardWorkPlanCheckParam; import com.testor.module.hazard.model.dto.THazardWorkPlanCheckParam;
import com.testor.module.hazard.model.dto.THazardWorkPlanDTO; import com.testor.module.hazard.model.dto.THazardWorkPlanDTO;
import com.testor.module.hazard.model.dto.THazardWorkPlanParam; import com.testor.module.hazard.model.dto.THazardWorkPlanParam;
import com.testor.module.hazard.model.template.THazardWorkPlanTemplate;
import com.testor.module.hazard.model.vo.HazardWorkPlanCheckProblemCountStatisticsVO; import com.testor.module.hazard.model.vo.HazardWorkPlanCheckProblemCountStatisticsVO;
import com.tongtech.tfw.backend.common.biz.constants.BizConstants; 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.BaseResponse;
import com.tongtech.tfw.backend.common.biz.models.BaseResponseList; import com.tongtech.tfw.backend.common.biz.models.BaseResponseList;
import com.tongtech.tfw.backend.common.biz.models.BizGeneralResponse;
import com.tongtech.tfw.backend.common.models.supers.SuperController; import com.tongtech.tfw.backend.common.models.supers.SuperController;
import com.tongtech.tfw.backend.core.helper.StringHelper; import com.tongtech.tfw.backend.core.helper.StringHelper;
import com.tongtech.tfw.backend.core.helper.TypeHelper;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.SneakyThrows; import lombok.SneakyThrows;
...@@ -40,6 +46,7 @@ import org.springframework.http.ResponseEntity; ...@@ -40,6 +46,7 @@ import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
...@@ -312,4 +319,24 @@ public class AccidentReportController extends SuperController { ...@@ -312,4 +319,24 @@ public class AccidentReportController extends SuperController {
return baseResponse; 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;
}
} }
package com.testor.module.accident.template;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.fastjson.annotation.JSONField;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.testor.module.accident.model.domain.AccidentPersonnel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 事故统计详情表
*/
@Data
public class AccidentReportDetailTemplate {
@ExcelProperty("序号")
private String number;
@ExcelProperty("序号")
private String id;
@ExcelProperty("序号")
private String currentOrgName;
@ExcelProperty("序号")
private String businessDeptName;
@ExcelProperty("序号")
private String regionName;
/**
* 事故发生时间
*/
@ExcelProperty("事故发生时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date accidentTime;
/**
* 事故等级(国家)(字典:accident_level_country)
*/
@ExcelProperty("事故等级(国家)(字典:accident_level_country)")
private String accidentLevelCountry;
@ExcelProperty("事故等级(集团)")
private String accidentLevel;
@ExcelProperty("受伤人数")
private Integer reportCount;
/**
* 直接经济损失
*/
@ExcelProperty("直接经济损失")
private BigDecimal directEconomicLoss;
/**
* 损失工作日
*/
@ExcelProperty("损失工作日")
@TableField("lost_working_days")
private String lostWorkingDays;
/**
* 人员信息
*/
@ExcelProperty("人员信息")
private List<AccidentPersonnel> accidentPersonnelList;
@ExcelProperty("事故类型")
private String accidentType;
/**
* 涉及集团八大类风险(多选 字典:group_risk)
*/
@ExcelProperty("多选 涉及集团八大类风险(字典:group_risk)")
private String groupRiskDetail;
/**
* 涉及危险作业类型(多选 字典:dangerous_homework_category)
*/
@ExcelProperty("多选 涉及危险作业类型(字典:dangerous_homework_category)")
private String dangerousHomeworkCategoryDetail;
/**
* 受伤部位(多选 字典:injured_area)
*/
@ExcelProperty("多选 受伤部位(字典:injured_area)")
private String injuredAreaDetail;
/**
* 事故详细经过
*/
@ExcelProperty("事故详细经过")
private String accidentPassed;
/**
* 事故直接原因和间接原因
*/
@ExcelProperty("事故直接原因和间接原因")
private String accidentCause;
/**
* 改善措施
*/
@ExcelProperty("改善措施")
private String improvements;
/**
* 事故人员追责问责情况
*/
@ExcelProperty("事故人员追责问责情况")
private String personnelAccountabilityStatus;
/**
* 备注
*/
@ExcelProperty("备注")
private String remarks;
}
package com.testor.module.hazard.controller; package com.testor.module.hazard.controller;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.testor.module.accident.model.dto.AccidentReportDetail;
import com.testor.module.accident.template.AccidentReportDetailTemplate;
import com.testor.module.hazard.model.dto.*;
import com.testor.module.hazard.model.template.HazardWorkPlanStatisticsTemplate;
import com.tongtech.tfw.backend.common.biz.models.BaseResponse; import com.tongtech.tfw.backend.common.biz.models.BaseResponse;
import com.testor.common.core.enums.BaseStatusEnum; import com.testor.common.core.enums.BaseStatusEnum;
import com.testor.common.util.BeanConverUtil; import com.testor.common.util.BeanConverUtil;
import com.testor.common.util.excel.EasyExcelUtil; import com.testor.common.util.excel.EasyExcelUtil;
import com.testor.module.hazard.model.dto.HazardWorkPlanStatisticsDto;
import com.testor.module.hazard.model.dto.THazardWorkPlanDTO;
import com.testor.module.hazard.model.dto.THazardWorkPlanParam;
import com.testor.module.hazard.model.template.THazardWorkPlanTemplate; import com.testor.module.hazard.model.template.THazardWorkPlanTemplate;
import com.testor.module.hazard.model.vo.HazardWorkPlanStatisticsVO; import com.testor.module.hazard.model.vo.HazardWorkPlanStatisticsVO;
import com.testor.module.hazard.service.HazardWorkPlanStatisticsService; import com.testor.module.hazard.service.HazardWorkPlanStatisticsService;
import com.testor.module.hazard.service.THazardWorkPlanService; import com.testor.module.hazard.service.THazardWorkPlanService;
import com.tongtech.tfw.backend.common.biz.models.BaseResponseList;
import com.tongtech.tfw.backend.common.biz.models.BizGeneralResponse; import com.tongtech.tfw.backend.common.biz.models.BizGeneralResponse;
import com.tongtech.tfw.backend.common.context.ContextUtils; import com.tongtech.tfw.backend.common.context.ContextUtils;
import com.tongtech.tfw.backend.common.models.supers.SuperController; import com.tongtech.tfw.backend.common.models.supers.SuperController;
...@@ -152,4 +155,53 @@ public class HazardWorkPlanStatisticsController extends SuperController { ...@@ -152,4 +155,53 @@ public class HazardWorkPlanStatisticsController extends SuperController {
BizGeneralResponse.builder().result(TypeHelper.castToString(true)).build()); BizGeneralResponse.builder().result(TypeHelper.castToString(true)).build());
return baseResponse; return baseResponse;
} }
@GetMapping("/selectHazardWorkPlanStatistics")
@ApiOperation(value = "危险作业类型统计分布")
public BaseResponse<List<THazardWorkPlanStatistics>> selectHazardWorkPlanStatistics(HazardWorkPlanStatisticsDto param) {
BaseResponse<List<THazardWorkPlanStatistics>> response = new BaseResponse<>();
if(StringHelper.isEmpty(param.getOrgId())){
param.setOrgId(ContextUtils.getLoginUser().getOrgId());
}
List<THazardWorkPlanStatistics> dataList = hazardWorkPlanStatisticsService.selectHazardWorkPlanStatistics(param);
response.setData(dataList);
return response;
}
@GetMapping("/selectWorkStatusDetailStatistics")
@ApiOperation(value = "危险作业详情统计")
public BaseResponse<BaseResponseList<HazardWorkPlanStatisticsResult>> selectWorkStatusDetailStatistics(HazardWorkPlanStatisticsDto param) {
BaseResponse<BaseResponseList<HazardWorkPlanStatisticsResult>> response = new BaseResponse<>();
if(StringHelper.isEmpty(param.getOrgId())){
param.setOrgId(ContextUtils.getLoginUser().getOrgId());
}
BaseResponse<BaseResponseList<HazardWorkPlanStatisticsResult>>baseResponse=new BaseResponse<>();
Page<HazardWorkPlanStatisticsResult> resultList= hazardWorkPlanStatisticsService.selectWorkStatusDetailStatistics(param);
BaseResponseList<HazardWorkPlanStatisticsResult> baseResponseList=new BaseResponseList<>();
baseResponseList.setData(resultList.getRecords());
baseResponseList.setTotal(resultList.getTotal());
baseResponse.setData(baseResponseList);
return baseResponse;
}
@ApiOperation(value = "导出危险作业详情统计", notes = "导出危险作业详情统计")
@GetMapping(value = "/selectWorkStatusDetailStatisticsExport")
public BaseResponse<BizGeneralResponse> selectWorkStatusDetailStatisticsExport(HttpServletResponse response, HazardWorkPlanStatisticsDto param){
BaseResponse<BizGeneralResponse> baseResponse=new BaseResponse<>();
List<HazardWorkPlanStatisticsTemplate> hazardWorkPlanStatisticsTemplatePage = hazardWorkPlanStatisticsService.exportCompleteStatistics(param);
if (org.apache.commons.collections4.CollectionUtils.isEmpty(hazardWorkPlanStatisticsTemplatePage)) {
baseResponse.setData(BizGeneralResponse.builder().result("无危险作业详情数据").build());
return baseResponse;
}
List<HazardWorkPlanStatisticsTemplate> accidentReportDetailTemplate = BeanConverUtil.converList(hazardWorkPlanStatisticsTemplatePage, HazardWorkPlanStatisticsTemplate.class);
int index = 1;
for(HazardWorkPlanStatisticsTemplate template : hazardWorkPlanStatisticsTemplatePage){
template.setNumber(String.valueOf(index++));
}
EasyExcelUtil.writeExcel(response, "危险作业详情明细", "危险作业详情明细", accidentReportDetailTemplate);
baseResponse.setData(
BizGeneralResponse.builder().result(TypeHelper.castToString(true)).build());
return baseResponse;
}
} }
package com.testor.module.hazard.dao; package com.testor.module.hazard.dao;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.testor.module.hazard.model.dto.THazardWorkPlanDetailStatistics;
import com.testor.module.hazard.model.dto.THazardWorkPlanStatistics;
import com.testor.module.hazard.model.vo.HazardWorkPlanStatisticsVO; import com.testor.module.hazard.model.vo.HazardWorkPlanStatisticsVO;
import com.testor.module.hazard.model.dto.HazardWorkPlanStatisticsDto; import com.testor.module.hazard.model.dto.HazardWorkPlanStatisticsDto;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
...@@ -43,4 +47,41 @@ public interface HazardWorkPlanStatisticsDao { ...@@ -43,4 +47,41 @@ public interface HazardWorkPlanStatisticsDao {
* @return * @return
*/ */
public List<HazardWorkPlanStatisticsVO> statOperatorNum(@Param("query") HazardWorkPlanStatisticsDto param); public List<HazardWorkPlanStatisticsVO> statOperatorNum(@Param("query") HazardWorkPlanStatisticsDto param);
/**
* 危险作业类型统计图表
* @param hazardWorkPlanStatisticsDto
* @return
*/
List<THazardWorkPlanStatistics> selectHazardWorkPlanStatistics(@Param("query") HazardWorkPlanStatisticsDto hazardWorkPlanStatisticsDto);
/**
* 危险作业详情基础统计
* @param query
* @return
*/
List<THazardWorkPlanDetailStatistics> workBasicDetailStatistics(@Param("query") HazardWorkPlanStatisticsDto query);
/**
* 危险作业详情类别统计
* @param query
* @return
*/
List<THazardWorkPlanDetailStatistics> workTypeDetailStatistics(@Param("query") HazardWorkPlanStatisticsDto query);
/**
* 危险作业详情级别统计
* @param query
* @return
*/
List<THazardWorkPlanDetailStatistics> workLevelDetailStatistics(@Param("query") HazardWorkPlanStatisticsDto query);
/**
* 危险作业详情状态统计
* @param query
* @return
*/
List<THazardWorkPlanDetailStatistics> workStatusDetailStatistics(@Param("query") HazardWorkPlanStatisticsDto query);
} }
...@@ -3,8 +3,10 @@ package com.testor.module.hazard.dao; ...@@ -3,8 +3,10 @@ package com.testor.module.hazard.dao;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.testor.module.hazard.model.domain.THazardWorkPlan; import com.testor.module.hazard.model.domain.THazardWorkPlan;
import com.testor.module.hazard.model.dto.HazardWorkPlanStatisticsDto;
import com.testor.module.hazard.model.dto.THazardWorkPlanParam; import com.testor.module.hazard.model.dto.THazardWorkPlanParam;
import com.testor.module.hazard.model.dto.THazardWorkPlanRiverside; import com.testor.module.hazard.model.dto.THazardWorkPlanRiverside;
import com.testor.module.hazard.model.dto.THazardWorkPlanStatistics;
import com.testor.module.partner.model.dto.TJobStatisticsParam; import com.testor.module.partner.model.dto.TJobStatisticsParam;
import com.testor.module.partner.model.vo.RegionalStatisticsVO; import com.testor.module.partner.model.vo.RegionalStatisticsVO;
import com.tongtech.tfw.backend.common.models.supers.SuperDao; import com.tongtech.tfw.backend.common.models.supers.SuperDao;
...@@ -73,4 +75,6 @@ public interface THazardWorkPlanDao extends SuperDao<THazardWorkPlan> ...@@ -73,4 +75,6 @@ public interface THazardWorkPlanDao extends SuperDao<THazardWorkPlan>
*/ */
List<RegionalStatisticsVO> selectWorkTypeCount(@Param("tJobStatisticsParam") TJobStatisticsParam tJobStatisticsParam); List<RegionalStatisticsVO> selectWorkTypeCount(@Param("tJobStatisticsParam") TJobStatisticsParam tJobStatisticsParam);
} }
...@@ -47,4 +47,10 @@ public class HazardWorkPlanStatisticsDto { ...@@ -47,4 +47,10 @@ public class HazardWorkPlanStatisticsDto {
*/ */
@ApiModelProperty(value = "单位id") @ApiModelProperty(value = "单位id")
private String orgId; private String orgId;
@ApiModelProperty(value = "每页数量")
private Integer size;
@ApiModelProperty(value = "当前页数")
private Integer current;
} }
package com.testor.module.hazard.model.dto;
import lombok.Data;
import java.util.Map;
@Data
public class HazardWorkPlanStatisticsResult {
private String regionName; // 大区
private String businessDeptName; // 经营部
private String currentOrgName; // 企业名称
// 基础数量统计
private Integer workCount; // 危险作业总量
private Integer ownCount; // 自有员工作业数量
private Integer stakeholderCount; // 相关方作业数量
// 分类统计
private Map<String, Integer> workTypeStats; // 作业类别统计 <类别名称, 数量>
private Map<String, Integer> workLevelStats; // 作业级别统计 <级别名称, 数量>
private Map<String, Integer> workStatusStats; // 作业状态统计 <状态名称, 数量>
}
package com.testor.module.hazard.model.dto;
import lombok.Data;
import java.util.List;
@Data
public class HazardWorkPlanStatisticsResultVO {
private String regionName;
private String businessDeptName;
private String currentOrgName;
private Integer workCount;
private Integer ownCount;
private Integer stakeholderCount;
private List<WorkStatItem> workTypeStats; // 作业类别统计列表
private List<WorkStatItem> workLevelStats; // 作业级别统计列表
private List<WorkStatItem> workStatusStats; // 作业状态统计列表
}
package com.testor.module.hazard.model.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class THazardWorkPlanDetailStatistics {
@ApiModelProperty(value = "当前机构名称")
private String currentOrgName;
@ApiModelProperty(value = "经营部名称")
private String businessDeptName;
@ApiModelProperty(value = "大区名称")
private String regionName;
@ApiModelProperty(value = "危险作业总量")
private Integer workCount;
@ApiModelProperty(value = "自有员工作业数量")
private Integer ownCount;
@ApiModelProperty(value = "相关方作业数量")
private Integer stakeholderCount;
@ApiModelProperty(value = "作业类型")
private String workType;
@ApiModelProperty(value = "作业类型数量")
private Integer workTypeCount;
@ApiModelProperty(value = "作业级别")
private String workLevel;
@ApiModelProperty(value = "作业级别数量")
private Integer workLevelCount;
@ApiModelProperty(value = "作业状态")
private String workStatus;
@ApiModelProperty(value = "作业状态数量")
private Integer workStatusCount;
}
package com.testor.module.hazard.model.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class THazardWorkPlanStatistics {
/**
* 作业类型
*/
@ApiModelProperty(value = "作业类型")
private String workType;
/**
* 作业级别
*/
@ApiModelProperty(value = "作业级别")
private String workLevel;
/**
* 作业数量
*/
@ApiModelProperty(value = "作业数量")
private Integer count;
}
package com.testor.module.hazard.model.dto;
import lombok.Data;
@Data
public class WorkStatItem {
private String name; // 类别/级别/状态名称
private Integer count; // 数量
}
package com.testor.module.hazard.model.template;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@Data
public class HazardWorkPlanStatisticsTemplate {
@ExcelProperty("序号")
private String number;
@ExcelProperty("大区")
private String regionName;
@ExcelProperty("经营部")
private String businessDeptName;
@ExcelProperty("企业名称")
private String currentOrgName;
@ExcelProperty("危险作业总量")
private Integer workCount;
@ExcelProperty("自有员工作业数量")
private Integer ownCount;
@ExcelProperty("相关方作业数量")
private Integer stakeholderCount;
// ============== 作业类别统计 ==============
@ExcelProperty("进仓作业")
private Integer workTypeIn;
@ExcelProperty("出仓作业")
private Integer workTypeOut;
@ExcelProperty("动火作业")
private Integer workTypeFire;
@ExcelProperty("有限空间作业")
private Integer workTypeLimitedSpace;
@ExcelProperty("吊装作业")
private Integer workTypeHoisting;
@ExcelProperty("高处作业")
private Integer workTypeHigh;
@ExcelProperty("临时用电作业")
private Integer workTypeTempElectricity;
@ExcelProperty("动土作业")
private Integer workTypeExcavation;
@ExcelProperty("断路作业")
private Integer workTypeRoadClosure;
@ExcelProperty("环流熏蒸作业")
private Integer workTypeCirculationFumigation;
@ExcelProperty("熏蒸作业")
private Integer workTypeFumigation;
@ExcelProperty("平仓作业")
private Integer workTypeClosing;
@ExcelProperty("筒仓清仓作业")
private Integer workTypeSiloCleaning;
@ExcelProperty("液氨接卸作业")
private Integer workTypeLiquidAmmonia;
@ExcelProperty("未知类别")
private Integer workTypeUnknown;
// ============== 作业级别统计 ==============
@ExcelProperty("高度危险")
private Integer workLevelHigh;
@ExcelProperty("较大危险")
private Integer workLevelMedium;
@ExcelProperty("一般危险")
private Integer workLevelLow;
@ExcelProperty("未知级别")
private Integer workLevelUnknown;
// ============== 作业状态统计 ==============
@ExcelProperty("技术交底")
private Integer workStatusTechBriefing;
@ExcelProperty("草稿")
private Integer workStatusDraft;
@ExcelProperty("已关闭")
private Integer workStatusClosed;
@ExcelProperty("作业前(条件确认)")
private Integer workStatusPreCondition;
@ExcelProperty("作业前(风险分析)")
private Integer workStatusPreRiskAnalysis;
@ExcelProperty("已超时自动取消")
private Integer workStatusTimeoutCancel;
@ExcelProperty("已取消")
private Integer workStatusCancelled;
@ExcelProperty("作业前(许可证)")
private Integer workStatusPreLicense;
@ExcelProperty("未知状态")
private Integer workStatusUnknown;
}
package com.testor.module.hazard.service; 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.dto.HazardWorkPlanStatisticsDto; import com.testor.module.hazard.model.dto.HazardWorkPlanStatisticsDto;
import com.testor.module.hazard.model.dto.HazardWorkPlanStatisticsResult;
import com.testor.module.hazard.model.dto.THazardWorkPlanDetailStatistics;
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.model.vo.HazardWorkPlanStatisticsVO;
import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
...@@ -40,4 +47,26 @@ public interface HazardWorkPlanStatisticsService { ...@@ -40,4 +47,26 @@ public interface HazardWorkPlanStatisticsService {
* @return * @return
*/ */
public List<HazardWorkPlanStatisticsVO> statOperatorNum(HazardWorkPlanStatisticsDto param); public List<HazardWorkPlanStatisticsVO> statOperatorNum(HazardWorkPlanStatisticsDto param);
/**
* 危险作业类型统计图表
* @param hazardWorkPlanStatisticsDto
* @return
*/
List<THazardWorkPlanStatistics> selectHazardWorkPlanStatistics(HazardWorkPlanStatisticsDto hazardWorkPlanStatisticsDto);
/**
* 危险作业详情统计
* @param query
* @return
*/
Page<HazardWorkPlanStatisticsResult> selectWorkStatusDetailStatistics(HazardWorkPlanStatisticsDto query); // Changed from List to Page
/**
* 危险作业详情统计导出
* @param query
* @return
*/
List<HazardWorkPlanStatisticsTemplate> exportCompleteStatistics(HazardWorkPlanStatisticsDto query);
} }
...@@ -135,4 +135,7 @@ public interface THazardWorkPlanService extends SuperService<THazardWorkPlan> { ...@@ -135,4 +135,7 @@ public interface THazardWorkPlanService extends SuperService<THazardWorkPlan> {
*/ */
Integer unfinishedCount(List<String> orgIds); Integer unfinishedCount(List<String> orgIds);
} }
...@@ -2443,6 +2443,8 @@ public class THazardWorkPlanServiceImpl extends SuperServiceImpl<THazardWorkPlan ...@@ -2443,6 +2443,8 @@ public class THazardWorkPlanServiceImpl extends SuperServiceImpl<THazardWorkPlan
return baseMapper.unfinishedCount(orgIds); return baseMapper.unfinishedCount(orgIds);
} }
private void deleteDoneRecords(String bizId) { private void deleteDoneRecords(String bizId) {
try { try {
// 获取流程实例ID // 获取流程实例ID
......
...@@ -350,6 +350,7 @@ public class PortController { ...@@ -350,6 +350,7 @@ public class PortController {
accidentReportService.exports(response, request, accidentReportExportReq); accidentReportService.exports(response, request, accidentReportExportReq);
} }
@ApiOperation(value = "本单位值班记录下载", notes = "") @ApiOperation(value = "本单位值班记录下载", notes = "")
@PostMapping("/getDutyRecord") @PostMapping("/getDutyRecord")
public void getDutyRecord(@RequestBody DutyDownload dutyDownload) { public void getDutyRecord(@RequestBody DutyDownload dutyDownload) {
......
...@@ -100,4 +100,11 @@ public interface NewSysDictDataService { ...@@ -100,4 +100,11 @@ public interface NewSysDictDataService {
*/ */
List<SysDictData> getDictId(String dictId); List<SysDictData> getDictId(String dictId);
/**
* 根据字典id获取字典数据
* @param dictId 字典id
* @return
*/
List<String> getDictValuesByDictId(String dictId);
} }
...@@ -170,4 +170,28 @@ public class NewSysDictDataServiceImpl implements NewSysDictDataService { ...@@ -170,4 +170,28 @@ public class NewSysDictDataServiceImpl implements NewSysDictDataService {
} }
return Collections.emptyList(); return Collections.emptyList();
} }
/**
* 根据字典ID获取所有字典值(优化版)
* @param dictId 字典ID
* @return 字典值列表
*/
public List<String> getDictValuesByDictId(String dictId) {
// 直接查询字典数据表,不需要先检查字典类型表
List<SysDictData> dictDataList = sysDictDataService.list(
new QueryWrapper<SysDictData>()
.eq("dict_id", dictId)
.orderByAsc("tree_sort") // 按排序字段排序
);
if (ObjectHelper.isNotEmpty(dictDataList)) {
return dictDataList.stream()
.map(SysDictData::getDictValue)
.filter(value -> value != null && !value.trim().isEmpty())
.collect(Collectors.toList());
}
return Collections.emptyList();
}
} }
...@@ -233,9 +233,9 @@ ...@@ -233,9 +233,9 @@
COALESCE( COALESCE(
(SELECT COUNT(1) FROM t_accident_personnel WHERE ref_id = tar.id AND status = '0'), (SELECT COUNT(1) FROM t_accident_personnel WHERE ref_id = tar.id AND status = '0'),
0 0
) as reportCount, ) as reportCount
,
tar.* tar.id
FROM t_accident_report tar FROM t_accident_report tar
LEFT JOIN t_sys_dict_data sdd2 ON tar.accident_level = sdd2.dict_key LEFT JOIN t_sys_dict_data sdd2 ON tar.accident_level = sdd2.dict_key
......
...@@ -404,4 +404,191 @@ ...@@ -404,4 +404,191 @@
GROUP BY t.operator; GROUP BY t.operator;
</select> </select>
<select id="selectHazardWorkPlanStatistics" resultType="com.testor.module.hazard.model.dto.THazardWorkPlanStatistics">
SELECT
sdd.dict_value as workType,
sdd2.dict_value as workLevel,
COUNT(*) as count
FROM t_hazard_work_plan hwp
inner join t_sys_dict_data sdd on sdd.dict_data_id = hwp.work_type and sdd.dict_id = '42a87414a06a4f57b9d3ffb1907284b4'
inner join t_sys_dict_data sdd2 on sdd2.dict_data_id = hwp.work_level and sdd2.dict_id = '222842ea3bb4468bbbeaa3856a4f2731'
left join t_sys_org so on hwp.org_id = so.org_id
where hwp.status = '0' and hwp.work_type!='' and hwp.work_level !=''
<if test="query.workType!=null and query.workType != ''">
and hwp.work_type = #{query.workType}
</if>
<if test="query.workLevel!=null and query.workLevel != ''">
and hwp.work_level = #{query.workLevel}
</if>
<if test="query.isEscalated!=null and query.isEscalated != ''">
and hwp.is_escalated = #{query.isEscalated}
</if>
<if test="query.workStatus!=null and query.workStatus != ''">
and find_in_set(hwp.work_status, #{query.workStatus})
</if>
<if test="query.reportStartDate!=null and query.reportStartDate != '' and query.reportEndDate!=null and query.reportEndDate != ''">
and hwp.create_date <![CDATA[ >= ]]> #{query.reportStartDate} and hwp.create_date <![CDATA[ <= ]]> #{query.reportEndDate}
</if>
<if test="query.orgId != null and query.orgId != ''">
AND (
hwp.org_id = #{query.orgId}
OR so.parent_ids LIKE concat('%', #{query.orgId}, '%')
)
</if>
GROUP BY sdd.dict_value, sdd2.dict_value
order by sdd.dict_value, sdd2.dict_value
</select>
<select id="workBasicDetailStatistics" resultType="com.testor.module.hazard.model.dto.THazardWorkPlanDetailStatistics">
SELECT
region.org_name as regionName,
bd.org_name as businessDeptName,
so.org_name as currentOrgName,
COUNT(*) as workCount,
SUM(CASE WHEN so.is_rent = '0' THEN 1 ELSE 0 END) as ownCount,
SUM(CASE WHEN so.is_rent = '1' THEN 1 ELSE 0 END) as stakeholderCount
FROM t_hazard_work_plan hwp
LEFT JOIN t_sys_org so ON so.org_id = hwp.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
WHERE hwp.status = '0'
<if test="query.workType!=null and query.workType != ''">
and hwp.work_type = #{query.workType}
</if>
<if test="query.workLevel!=null and query.workLevel != ''">
and hwp.work_level = #{query.workLevel}
</if>
<if test="query.isEscalated!=null and query.isEscalated != ''">
and hwp.is_escalated = #{query.isEscalated}
</if>
<if test="query.workStatus!=null and query.workStatus != ''">
and find_in_set(hwp.work_status, #{query.workStatus})
</if>
<if test="query.reportStartDate!=null and query.reportStartDate != '' and query.reportEndDate!=null and query.reportEndDate != ''">
and hwp.create_date <![CDATA[ >= ]]> #{query.reportStartDate} and hwp.create_date <![CDATA[ <= ]]> #{query.reportEndDate}
</if>
<if test="query.orgId != null and query.orgId != ''">
AND (
hwp.org_id = #{query.orgId}
OR so.parent_ids LIKE concat('%', #{query.orgId}, '%')
)
</if>
GROUP BY hq.org_name, region.org_name, bd.org_name, so.org_name
ORDER BY hq.org_name, region.org_name, bd.org_name, so.org_name, workCount DESC
</select>
<select id="workTypeDetailStatistics" resultType="com.testor.module.hazard.model.dto.THazardWorkPlanDetailStatistics">
SELECT
region.org_name as regionName,
bd.org_name as businessDeptName,
so.org_name as currentOrgName,
sdd_type.dict_value as workType,
COUNT(*) as workTypeCount
FROM t_hazard_work_plan hwp
LEFT JOIN t_sys_org so ON so.org_id = hwp.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_type ON sdd_type.dict_data_id = hwp.work_type
AND sdd_type.dict_id = '42a87414a06a4f57b9d3ffb1907284b4'
WHERE hwp.status = '0'
<if test="query.workLevel!=null and query.workLevel != ''">
and hwp.work_level = #{query.workLevel}
</if>
<if test="query.isEscalated!=null and query.isEscalated != ''">
and hwp.is_escalated = #{query.isEscalated}
</if>
<if test="query.workStatus!=null and query.workStatus != ''">
and find_in_set(hwp.work_status, #{query.workStatus})
</if>
<if test="query.reportStartDate!=null and query.reportStartDate != '' and query.reportEndDate!=null and query.reportEndDate != ''">
and hwp.create_date <![CDATA[ >= ]]> #{query.reportStartDate} and hwp.create_date <![CDATA[ <= ]]> #{query.reportEndDate}
</if>
<if test="query.orgId != null and query.orgId != ''">
AND (
hwp.org_id = #{query.orgId}
OR so.parent_ids LIKE concat('%', #{query.orgId}, '%')
)
</if>
GROUP BY hq.org_name, region.org_name, bd.org_name, so.org_name, sdd_type.dict_value
ORDER BY hq.org_name, region.org_name, bd.org_name, so.org_name
</select>
<select id="workLevelDetailStatistics" resultType="com.testor.module.hazard.model.dto.THazardWorkPlanDetailStatistics">
SELECT
region.org_name as regionName,
bd.org_name as businessDeptName,
so.org_name as currentOrgName,
sdd_level.dict_value as workLevel,
COUNT(*) as workLevelCount
FROM t_hazard_work_plan hwp
LEFT JOIN t_sys_org so ON so.org_id = hwp.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_level ON sdd_level.dict_data_id = hwp.work_level
AND sdd_level.dict_id = '222842ea3bb4468bbbeaa3856a4f2731'
WHERE hwp.status = '0'
<if test="query.workType!=null and query.workType != ''">
and hwp.work_type = #{query.workType}
</if>
<if test="query.isEscalated!=null and query.isEscalated != ''">
and hwp.is_escalated = #{query.isEscalated}
</if>
<if test="query.workStatus!=null and query.workStatus != ''">
and find_in_set(hwp.work_status, #{query.workStatus})
</if>
<if test="query.reportStartDate!=null and query.reportStartDate != '' and query.reportEndDate!=null and query.reportEndDate != ''">
and hwp.create_date <![CDATA[ >= ]]> #{query.reportStartDate} and hwp.create_date <![CDATA[ <= ]]> #{query.reportEndDate}
</if>
<if test="query.orgId != null and query.orgId != ''">
AND (
hwp.org_id = #{query.orgId}
OR so.parent_ids LIKE concat('%', #{query.orgId}, '%')
)
</if>
GROUP BY hq.org_name, region.org_name, bd.org_name, so.org_name, sdd_level.dict_value
ORDER BY hq.org_name, region.org_name, bd.org_name, so.org_name
</select>
<select id="workStatusDetailStatistics" resultType="com.testor.module.hazard.model.dto.THazardWorkPlanDetailStatistics">
-- 按危险作业状态统计
SELECT
region.org_name as regionName,
bd.org_name as businessDeptName,
so.org_name as currentOrgName,
sdd_status.dict_value as workStatus,
COUNT(*) as workStatusCount
FROM t_hazard_work_plan hwp
LEFT JOIN t_sys_org so ON so.org_id = hwp.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_status ON sdd_status.dict_key = hwp.work_status
AND sdd_status.dict_id = '60c11c98359b4cd09b7220202abf9e0b'
WHERE hwp.status = '0'
<if test="query.workType!=null and query.workType != ''">
and hwp.work_type = #{query.workType}
</if>
<if test="query.workLevel!=null and query.workLevel != ''">
and hwp.work_level = #{query.workLevel}
</if>
<if test="query.isEscalated!=null and query.isEscalated != ''">
and hwp.is_escalated = #{query.isEscalated}
</if>
<if test="query.reportStartDate!=null and query.reportStartDate != '' and query.reportEndDate!=null and query.reportEndDate != ''">
and hwp.create_date <![CDATA[ >= ]]> #{query.reportStartDate} and hwp.create_date <![CDATA[ <= ]]> #{query.reportEndDate}
</if>
<if test="query.orgId != null and query.orgId != ''">
AND (
hwp.org_id = #{query.orgId}
OR so.parent_ids LIKE concat('%', #{query.orgId}, '%')
)
</if>
GROUP BY hq.org_name, region.org_name, bd.org_name, so.org_name, sdd_status.dict_value
ORDER BY hq.org_name, region.org_name, bd.org_name, so.org_name, workStatusCount DESC
</select>
</mapper> </mapper>
\ No newline at end of file
...@@ -181,4 +181,6 @@ ...@@ -181,4 +181,6 @@
</if> </if>
</select> </select>
</mapper> </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