Commit 085c9877 authored by 鲁鸿波's avatar 鲁鸿波

危险作业检查统计开发

parent 73f926a0
......@@ -142,6 +142,11 @@ t_hazard_work_plan_monitoring_record_project
ALTER TABLE t_contractor_person ADD COLUMN contract_period varchar(200) NULL; -- 合同期限
COMMENT ON COLUMN public.t_contractor_person.contract_period IS '合同期限';
INSERT INTO "public"."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 ('72610276671d42089eb558880528269f', '42a87414a06a4f57b9d3ffb1907284b4', '20', '筒仓清仓', '7', '0', '1510a285c7134b39a3d7615835301f21', '2025-11-03 09:25:11', '1510a285c7134b39a3d7615835301f21', '2025-11-03 09:25:58', '', 'b5309e01475d4e93bb0ffb6ec7060265', '0,1a78e1f109904448bda810f2b66a653a,b5309e01475d4e93bb0ffb6ec7060265,');
INSERT INTO "public"."t_sys_resource" ("resource_id", "parent_id", "parent_ids", "resource_name", "resource_sort", "resource_level", "resource_type", "is_show", "resource_url", "photo_url", "permission", "status", "create_by", "create_date", "update_by", "update_date", "remarks", "router_mapping", "resource_auth_type") VALUES ('b7637e7a899e436e8aad2bfaa47d94f1', '98dda60d04bb453192d908afcb07ba61', '0,98dda60d04bb453192d908afcb07ba61,', '危险作业合规率', '5', '2', '2', '0', '/dangerous-work/statistics/complianceRate', 'el-icon-finished', NULL, '0', '1242684364872761344', '2025-11-04 10:39:33', '1242684364872761344', '2025-11-04 10:41:52', NULL, NULL, '2');
......@@ -193,7 +198,8 @@ create_by varchar(64) NULL, -- 创建者
create_date sys."timestamp" NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
update_by varchar(64) NULL, -- 更新者
update_date sys."timestamp" NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 更新时间
"type" varchar(50) NULL -- 修改项(1:人员 2:工器具 3:防护用品数量 4:防护用品数量)
"type" varchar(50) NULL, -- 修改项(1:人员 2:工器具 3:防护用品数量 4:防护用品数量)
historical_content text NULL -- 历史内容
);
COMMENT ON TABLE public.t_contractor_access_log IS '承包商准入管理访问日志';
......@@ -241,12 +247,14 @@ COMMENT ON COLUMN public.t_contractor_access_log.create_date IS '创建时间';
COMMENT ON COLUMN public.t_contractor_access_log.update_by IS '更新者';
COMMENT ON COLUMN public.t_contractor_access_log.update_date IS '更新时间';
COMMENT ON COLUMN public.t_contractor_access_log."type" IS '修改项(1:人员 2:工器具 3:防护用品数量 4:防护用品数量)';
COMMENT ON COLUMN public.t_contractor_access_log.historical_content IS '历史内容';
-- public.t_contractor_access_log foreign keys
-- public.t_contractor_access_log_approval definition
-- Drop table
......@@ -267,9 +275,10 @@ update_by varchar(64) NULL, -- 更新者
update_date sys."timestamp" NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 更新时间
"type" varchar(50) NULL, -- 修改项(1:人员 2:工器具 3:防护用品数量 4:防护用品数量)
contractor_allow_id varchar(64) NULL, -- 准入管理对象ID
name_by varchar(500) NULL
name_by varchar(500) NULL,
approval_time varchar(200) NULL -- 审批时间
);
COMMENT ON TABLE public.t_contractor_access_log_approval IS '承包商准入管理访问日志审批表';
COMMENT ON TABLE public.t_contractor_access_log_approval IS '危险作业监测记录表';
-- Column comments
......@@ -285,26 +294,35 @@ COMMENT ON COLUMN public.t_contractor_access_log_approval.update_by IS '更新
COMMENT ON COLUMN public.t_contractor_access_log_approval.update_date IS '更新时间';
COMMENT ON COLUMN public.t_contractor_access_log_approval."type" IS '修改项(1:人员 2:工器具 3:防护用品数量 4:防护用品数量)';
COMMENT ON COLUMN public.t_contractor_access_log_approval.contractor_allow_id IS '准入管理对象ID';
COMMENT ON COLUMN public.t_contractor_access_log_approval.approval_time IS '审批时间';
-- public.t_contractor_access_log_approval foreign keys
-- public.t_hazard_work_plan_monitoring_record definition
-- Drop table
-- DROP TABLE public.t_hazard_work_plan_monitoring_record;
CREATE TABLE public.t_hazard_work_plan_monitoring_record (
id varchar(64) NOT NULL,
plan_id varchar(64) NULL,
detection_position varchar(500) NULL,
conclusion varchar(500) NULL,
scene_photo varchar(500) NULL,
id varchar(64) NOT NULL, -- 主键ID
plan_id varchar(64) NULL, -- 危险作业id
detection_position varchar(500) NULL, -- 检测位置
conclusion varchar(500) NULL, -- 结论
scene_photo varchar(500) NULL, -- 现场照片
status varchar(1) NULL DEFAULT '0'::varchar,
inspector_signature varchar(500) NULL,
inspector_time timestamp,
inspector_signature varchar(500) NULL, -- 检测人签字
inspector_time sys."timestamp" NULL, -- 检测时间
create_by varchar(64) NULL,
create_date sys."timestamp" NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_by varchar(64) NULL,
update_date sys."timestamp" NOT NULL DEFAULT CURRENT_TIMESTAMP
update_date sys."timestamp" NOT NULL DEFAULT CURRENT_TIMESTAMP,
remarks varchar(255) NULL -- 备注
);
COMMENT ON TABLE public.t_contractor_access_log_approval IS '危险作业监测记录表';
-- Column comments
......@@ -315,13 +333,24 @@ COMMENT ON COLUMN public.t_hazard_work_plan_monitoring_record.conclusion IS '结
COMMENT ON COLUMN public.t_hazard_work_plan_monitoring_record.scene_photo IS '现场照片';
COMMENT ON COLUMN public.t_hazard_work_plan_monitoring_record.inspector_signature IS '检测人签字';
COMMENT ON COLUMN public.t_hazard_work_plan_monitoring_record.inspector_time IS '检测时间';
COMMENT ON COLUMN public.t_hazard_work_plan_monitoring_record.remarks IS '备注';
-- public.t_hazard_work_plan_monitoring_record foreign keys
-- public.t_hazard_work_plan_monitoring_record_project definition
-- Drop table
-- DROP TABLE public.t_hazard_work_plan_monitoring_record_project;
CREATE TABLE public.t_hazard_work_plan_monitoring_record_project (
id varchar(64) NOT NULL,
project_name varchar(200) NULL,
project_value varchar(500) NULL,
hazard_work_plan_monitoring_record_id varchar(64) NULL,
project_name varchar(200) NULL, -- 项目名称
project_value varchar(500) NULL, -- 项目值
hazard_work_plan_monitoring_record_id varchar(64) NULL, -- 危险作业监测记录表id
status varchar(1) NULL DEFAULT '0'::varchar,
create_by varchar(64) NULL,
create_date sys."timestamp" NOT NULL DEFAULT CURRENT_TIMESTAMP,
......@@ -330,6 +359,8 @@ update_date sys."timestamp" NOT NULL DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE public.t_hazard_work_plan_monitoring_record_project IS '危险作业监测记录项目表';
-- Column comments
COMMENT ON COLUMN public.t_hazard_work_plan_monitoring_record_project.project_name IS '项目名称';
COMMENT ON COLUMN public.t_hazard_work_plan_monitoring_record_project.project_value IS '项目值';
COMMENT ON COLUMN public.t_hazard_work_plan_monitoring_record_project.hazard_work_plan_monitoring_record_id IS '危险作业监测记录表id';
\ No newline at end of file
package com.testor.module.hazard.controller;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.testor.module.hazard.model.domain.THazardWorkPlanCheck;
import com.testor.module.hazard.model.dto.*;
import com.testor.module.hazard.model.vo.HazardWorkPlanCheckComplianceStatisticsVO;
import com.testor.module.hazard.model.vo.HazardWorkPlanCheckProblemCountStatisticsVO;
import com.testor.module.hazard.model.vo.HazardWorkPlanCheckProblemTypeStatisticsVO;
import com.testor.module.hazard.service.THazardWorkPlanCheckService;
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.models.supers.SuperController;
import com.tongtech.tfw.backend.core.helper.ObjectHelper;
import com.tongtech.tfw.backend.core.helper.StringHelper;
import com.tongtech.tfw.backend.core.helper.TypeHelper;
import com.tongtech.tfw.backend.core.helper.bean.BeanHelper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 危险作业计划监督检查统计Controller
*
* @author testor-framework
* @date 2025-04-16 10:09:22
*/
@RestController
@RequestMapping("/hazard/checkStatistics")
@Api(value = "THazardWorkPlanCheckStatistics", tags = "危险作业计划监督检查统计")
@Slf4j
public class THazardWorkPlanCheckStatisticsController extends SuperController
{
@Autowired
private THazardWorkPlanCheckService tHazardWorkPlanCheckService;
@ApiOperation(value = "企业总数,合规数,不合规数,问题数,合规企业数,合规比例 ")
@GetMapping(value = "/selectHazardWorkPlanCheckStats")
public BaseResponse<HazardWorkPlanCheckStatsDTO> selectHazardWorkPlanCheckStats(THazardWorkPlanCheckParam tHazardWorkPlanCheckParam){
BaseResponse<HazardWorkPlanCheckStatsDTO> baseResponse=new BaseResponse<>();
tHazardWorkPlanCheckParam.setUserId(getUserId());
HazardWorkPlanCheckStatsDTO data= tHazardWorkPlanCheckService.selectHazardWorkPlanCheckStats(tHazardWorkPlanCheckParam);
baseResponse.setData(data);
return baseResponse;
}
@ApiOperation(value = "企业合规数")
@GetMapping(value = "/enterpriseComplianceNumber")
public BaseResponse<List<HazardWorkPlanCheckEnterpriseComplianceDto>> enterpriseComplianceNumber(THazardWorkPlanCheckParam tHazardWorkPlanCheckParam){
BaseResponse<List<HazardWorkPlanCheckEnterpriseComplianceDto>> baseResponse=new BaseResponse<>();
tHazardWorkPlanCheckParam.setUserId(getUserId());
List<HazardWorkPlanCheckEnterpriseComplianceDto> data= tHazardWorkPlanCheckService.enterpriseComplianceNumber(tHazardWorkPlanCheckParam);
baseResponse.setData(data);
return baseResponse;
}
@ApiOperation(value = "问题数量统计")
@GetMapping(value = "/selectProblemCountStatistics")
public BaseResponse<List<HazardWorkPlanCheckProblemCountStatisticsVO>> selectProblemCountStatistics(THazardWorkPlanCheckParam tHazardWorkPlanCheckParam){
BaseResponse<List<HazardWorkPlanCheckProblemCountStatisticsVO>> baseResponse=new BaseResponse<>();
tHazardWorkPlanCheckParam.setUserId(getUserId());
List<HazardWorkPlanCheckProblemCountStatisticsVO> data= tHazardWorkPlanCheckService.selectProblemCountStatistics(tHazardWorkPlanCheckParam);
baseResponse.setData(data);
return baseResponse;
}
@ApiOperation(value = "企业合规率")
@GetMapping(value = "/corporateComplianceRate")
public BaseResponse<BaseResponseList<HazardWorkPlanCheckProblemCountStatisticsVO>> corporateComplianceRate(THazardWorkPlanCheckParam tHazardWorkPlanCheckParam){
BaseResponse<BaseResponseList<HazardWorkPlanCheckProblemCountStatisticsVO>>baseResponse=new BaseResponse<>();
tHazardWorkPlanCheckParam.setUserId(getUserId());
Page<HazardWorkPlanCheckProblemCountStatisticsVO> resultList= tHazardWorkPlanCheckService.corporateComplianceRate(tHazardWorkPlanCheckParam);
BaseResponseList<HazardWorkPlanCheckProblemCountStatisticsVO> baseResponseList=new BaseResponseList<>();
baseResponseList.setData(resultList.getRecords());
baseResponseList.setTotal(resultList.getTotal());
baseResponse.setData(baseResponseList);
return baseResponse;
}
}
......@@ -3,6 +3,7 @@ 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.domain.THazardWorkPlanCheck;
import com.testor.module.hazard.model.dto.HazardWorkPlanCheckStatsDTO;
import com.testor.module.hazard.model.dto.THazardWorkPlanCheckParam;
import com.testor.module.hazard.model.vo.HazardWorkPlanCheckComplianceStatisticsVO;
import com.testor.module.hazard.model.vo.HazardWorkPlanCheckProblemCountStatisticsVO;
......@@ -93,5 +94,38 @@ public interface THazardWorkPlanCheckDao extends SuperDao<THazardWorkPlanCheck>
List<HazardWorkPlanCheckProblemCountStatisticsVO> selectCheckProblemCountStatistics(@Param("param") THazardWorkPlanCheckParam tHazardWorkPlanCheckParam);
/**
* 获取危险作业计划检查统计
*/
HazardWorkPlanCheckStatsDTO selectHazardWorkPlanCheckStats(@Param("param") THazardWorkPlanCheckParam tHazardWorkPlanCheckParam);
/**
* 查询符合条件的危险作业计划检查数量
* @param orgId
* @param startTime
* @param endTime
* @return
*/
Integer selectComplianceCount(@Param("param") THazardWorkPlanCheckParam tHazardWorkPlanCheckParam);
/**
* 查询不符合条件的危险作业计划检查数量
* @param orgId
* @param startTime
* @param endTime
* @return
*/
Double selectNoComplianceCount(@Param("param") THazardWorkPlanCheckParam tHazardWorkPlanCheckParam,@Param("problemType") String problemType);
/**
* 企业合规率
* @param orgId
* @param startTime
* @param endTime
* @param basicId
* @return
*/
Page<HazardWorkPlanCheckProblemCountStatisticsVO> corporateComplianceRate(@Param("page") IPage page,@Param("param") THazardWorkPlanCheckParam tHazardWorkPlanCheckParam);
}
......@@ -7,6 +7,7 @@ import com.tongtech.tfw.backend.common.models.supers.SuperDao;
import com.tongtech.tfw.workflow.apis.task.model.dto.TodoTask;
import com.tongtech.tfw.workflow.apis.task.model.dto.TodoTaskSqlParam;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
/**
* 危险作业计划Mapper接口
......@@ -17,4 +18,7 @@ import org.apache.ibatis.annotations.Param;
public interface THazardWorkPlanDao extends SuperDao<THazardWorkPlan>
{
IPage<TodoTask> selectToDoList(Page<TodoTask> resultPage,@Param("todo") TodoTaskSqlParam todoTaskSqlParam);
@Update("UPDATE t_hazard_work_plan SET actual_start_time = NOW() WHERE id = #{id}")
void updateActualStartTime(@Param("id") Long id);
}
package com.testor.module.hazard.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "HazardWorkPlanCheckStatsDTO", description = "危险作业计划检查企业合规数")
public class HazardWorkPlanCheckEnterpriseComplianceDto {
@ApiModelProperty("企业名称")
private String name;
@ApiModelProperty("合规数量")
private Integer count;
public HazardWorkPlanCheckEnterpriseComplianceDto(String name, Integer count) {
this.name = name;
this.count = count;
}
public HazardWorkPlanCheckEnterpriseComplianceDto() {
}
}
package com.testor.module.hazard.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "HazardWorkPlanCheckStatsDTO", description = "危险作业计划检查统计结果")
public class HazardWorkPlanCheckStatsDTO {
@ApiModelProperty(value = "企业总数")
private Integer basicUnitCount;
@ApiModelProperty(value = "合规企业数")
private Integer complianceBasicUnitCount;
@ApiModelProperty(value = "不合规企业数")
private Integer noComplianceBasicUnitCount;
@ApiModelProperty(value = "问题数")
private Integer numberCount;
@ApiModelProperty(value = "危险作业数量")
private Integer workCount;
@ApiModelProperty(value = "合规比例")
private double complianceRatio;
}
\ No newline at end of file
......@@ -54,4 +54,7 @@ public class THazardWorkPlanCheckParam extends THazardWorkPlanCheck {
@ApiModelProperty(value = "orgId(下钻条件传)")
private String orgId;
@ApiModelProperty(value = "用户id")
private String userId;
}
......@@ -11,8 +11,6 @@ import lombok.NoArgsConstructor;
* @return
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class HazardWorkPlanCheckProblemCountStatisticsVO {
@ApiModelProperty(value = "问题日期")
......@@ -21,7 +19,32 @@ public class HazardWorkPlanCheckProblemCountStatisticsVO {
@ApiModelProperty(value = "问题数量")
private Double problemCount;
@ApiModelProperty(value = "问题名称")
private String problemName;
@ApiModelProperty(value = "合规率")
private Double complianceRate;
@ApiModelProperty(value = "是否合规")
private String isCompliant;
@ApiModelProperty(value = "问题单位id")
private String basicId;
@ApiModelProperty(value = "问题单位")
private String basicUnit;
public HazardWorkPlanCheckProblemCountStatisticsVO() {
}
public HazardWorkPlanCheckProblemCountStatisticsVO(String problemDate, Double problemCount, String problemName) {
this.problemDate = problemDate;
this.problemCount = problemCount;
this.problemName = problemName;
}
public HazardWorkPlanCheckProblemCountStatisticsVO(String problemName,Double problemCount) {
this.problemCount = problemCount;
this.problemName = problemName;
}
}
......@@ -5,6 +5,8 @@ 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.vo.HazardWorkPlanCheckComplianceStatisticsVO;
import com.testor.module.hazard.model.vo.HazardWorkPlanCheckProblemCountStatisticsVO;
......@@ -94,4 +96,40 @@ public interface THazardWorkPlanCheckService extends SuperService<THazardWorkPla
*/
List<HazardWorkPlanCheckProblemCountStatisticsVO> selectCheckProblemCountStatistics(THazardWorkPlanCheckParam tHazardWorkPlanCheckParam);
/**
* 获取危险作业计划检查统计
*/
HazardWorkPlanCheckStatsDTO selectHazardWorkPlanCheckStats(THazardWorkPlanCheckParam tHazardWorkPlanCheckParam);
/**
* 企业合规数
* @param userId
* @param startTime
* @param endTime
* @return
*/
List<HazardWorkPlanCheckEnterpriseComplianceDto> enterpriseComplianceNumber(THazardWorkPlanCheckParam tHazardWorkPlanCheckParam);
/**
* 问题数量统计
* @param userId
* @param startTime
* @param endTime
* @return
*/
List<HazardWorkPlanCheckProblemCountStatisticsVO> selectProblemCountStatistics(THazardWorkPlanCheckParam tHazardWorkPlanCheckParam);
/**
* 企业合规率
* @param userId
* @param startTime
* @param endTime
* @param basicId
* @return
*/
Page<HazardWorkPlanCheckProblemCountStatisticsVO> corporateComplianceRate(THazardWorkPlanCheckParam tHazardWorkPlanCheckParam);
}
......@@ -141,8 +141,8 @@ public class THazardConditionConfirmationServiceImpl extends SuperServiceImpl<TH
todayStr = today.format(DateTimeFormatter.ISO_DATE);
}
//查询所有未完成的工作计划,且状态不为关闭或取消或已超时(关闭时判断结束时间在当前时间之前设置的状态)
THazardWorkPlanParam tHazardWorkPlanParam = new THazardWorkPlanParam();
tHazardWorkPlanParam.setActualStartTime(new Date());
/*THazardWorkPlanParam tHazardWorkPlanParam = new THazardWorkPlanParam();
tHazardWorkPlanParam.setActualStartTime(new Date());*/
QueryWrapper<THazardWorkPlan> query = new QueryWrapper<>();
query.le(THazardWorkPlan.ACTUAL_START_TIME, new Date());
query.isNotNull(THazardWorkPlan.ACTUAL_START_TIME);
......
......@@ -10,23 +10,33 @@ import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy
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.vo.HazardWorkPlanCheckComplianceStatisticsVO;
import com.testor.module.hazard.model.vo.HazardWorkPlanCheckProblemCountStatisticsVO;
import com.testor.module.hazard.model.vo.HazardWorkPlanCheckProblemTypeStatisticsVO;
import com.testor.module.hazard.model.vo.HazardWorkPlanCheckVO;
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.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;
......@@ -71,6 +81,13 @@ public class THazardWorkPlanCheckServiceImpl extends SuperServiceImpl<THazardWor
@Autowired
private SysOrgService sysOrgService;
@Autowired
private SysUserService userService;
@Autowired
private NewSysDictDataService dictDataService;
@Override
public Page<THazardWorkPlanCheck> selectTHazardWorkPlanCheckList(THazardWorkPlanCheckParam tHazardWorkPlanCheckParam) {
IPage<THazardWorkPlanCheck> page = new Page<>(Long.valueOf(tHazardWorkPlanCheckParam.getPage()), Long.valueOf(tHazardWorkPlanCheckParam.getLimit()));
......@@ -258,6 +275,92 @@ public class THazardWorkPlanCheckServiceImpl extends SuperServiceImpl<THazardWor
return this.baseMapper.selectCheckProblemCountStatistics(tHazardWorkPlanCheckParam);
}
@Override
public HazardWorkPlanCheckStatsDTO selectHazardWorkPlanCheckStats(THazardWorkPlanCheckParam tHazardWorkPlanCheckParam) {
// 参数验证
if (StringUtils.isBlank(tHazardWorkPlanCheckParam.getUserId())) {
throw new IllegalArgumentException("用户ID不能为空");
}
SysUser user = userService.getById(tHazardWorkPlanCheckParam.getUserId());
if (user == null) {
throw new RuntimeException("用户不存在");
}
tHazardWorkPlanCheckParam.setOrgId(user.getOrgId());
//tHazardWorkPlanCheckParam.setOrgId("69223d5d1fa84ff29a0c11863d1b00b7");
HazardWorkPlanCheckStatsDTO hazardWorkPlanCheckStatsDTO = baseMapper.selectHazardWorkPlanCheckStats(tHazardWorkPlanCheckParam);
// 计算合规率(基于危险作业数量和问题数)
if (hazardWorkPlanCheckStatsDTO.getWorkCount() != null && hazardWorkPlanCheckStatsDTO.getWorkCount() > 0) {
// 使用公式 C = (B - A) / B × 100
// B = workCount(危险作业数量)
// A = numberCount(问题数)
double complianceRate = (hazardWorkPlanCheckStatsDTO.getWorkCount() - hazardWorkPlanCheckStatsDTO.getNumberCount()) * 100.0 / hazardWorkPlanCheckStatsDTO.getWorkCount();
hazardWorkPlanCheckStatsDTO.setComplianceRatio(Math.round(complianceRate * 100.0) / 100.0); // 四舍五入保留两位小数
} else {
hazardWorkPlanCheckStatsDTO.setComplianceRatio(0.0);
}
return hazardWorkPlanCheckStatsDTO;
}
@Override
public List<HazardWorkPlanCheckEnterpriseComplianceDto> enterpriseComplianceNumber(THazardWorkPlanCheckParam tHazardWorkPlanCheckParam) {
if (StringUtils.isBlank(tHazardWorkPlanCheckParam.getUserId())) {
throw new IllegalArgumentException("用户ID不能为空");
}
SysUser user = userService.getById(tHazardWorkPlanCheckParam.getUserId());
if (user == null) {
throw new RuntimeException("用户不存在");
}
tHazardWorkPlanCheckParam.setOrgId(user.getOrgId());
List<HazardWorkPlanCheckEnterpriseComplianceDto> hazardWorkPlanCheckEnterpriseComplianceDtos = new ArrayList<>();
List<TSysOrg> tSysOrgs = orgDao.selectOrgNameByParentId(user.getOrgId());
for (TSysOrg sysOrg:tSysOrgs){
hazardWorkPlanCheckEnterpriseComplianceDtos.add(new HazardWorkPlanCheckEnterpriseComplianceDto(sysOrg.getOrgName(),baseMapper.selectComplianceCount(tHazardWorkPlanCheckParam)));
}
return hazardWorkPlanCheckEnterpriseComplianceDtos;
}
@Override
public List<HazardWorkPlanCheckProblemCountStatisticsVO> selectProblemCountStatistics(THazardWorkPlanCheckParam tHazardWorkPlanCheckParam) {
if (StringUtils.isBlank(tHazardWorkPlanCheckParam.getUserId())) {
throw new IllegalArgumentException("用户ID不能为空");
}
SysUser user = userService.getById(tHazardWorkPlanCheckParam.getUserId());
if (user == null) {
throw new RuntimeException("用户不存在");
}
tHazardWorkPlanCheckParam.setOrgId(user.getOrgId());
List<HazardWorkPlanCheckProblemCountStatisticsVO> problemCountStatistics = new ArrayList<>();
for (SysDictData sysDictData : dictDataService.getDictId("736049b40cb04b1fb5c2ef5385655ee3")) {
problemCountStatistics.add(new HazardWorkPlanCheckProblemCountStatisticsVO(sysDictData.getDictValue(),baseMapper.selectNoComplianceCount(tHazardWorkPlanCheckParam,sysDictData.getDictDataId())));
}
return problemCountStatistics;
}
@Override
public Page<HazardWorkPlanCheckProblemCountStatisticsVO> corporateComplianceRate(THazardWorkPlanCheckParam tHazardWorkPlanCheckParam) {
if (StringUtils.isBlank(tHazardWorkPlanCheckParam.getUserId())) {
throw new IllegalArgumentException("用户ID不能为空");
}
SysUser user = userService.getById(tHazardWorkPlanCheckParam.getUserId());
if (user == null) {
throw new RuntimeException("用户不存在");
}
Long page =
StringHelper.isEmpty(tHazardWorkPlanCheckParam.getPage()) ? BizConstants.PAGE : Long.valueOf(tHazardWorkPlanCheckParam.getPage());
Long limit =
StringHelper.isEmpty(tHazardWorkPlanCheckParam.getLimit()) ? BizConstants.LIMIT : Long.valueOf(tHazardWorkPlanCheckParam.getLimit());
Page<THazardWorkPlan> resultPage = new Page<>(page, limit);
tHazardWorkPlanCheckParam.setOrgId(user.getOrgId());
return baseMapper.corporateComplianceRate(resultPage,tHazardWorkPlanCheckParam);
}
public String montageStartTime(String startTime){
if(startTime !=null && !"".equals(startTime) ){
startTime = startTime+" 00:00:00";
......
......@@ -5,6 +5,7 @@ import cn.afterturn.easypoi.word.WordExportUtil;
import cn.afterturn.easypoi.word.entity.MyXWPFDocument;
import cn.hutool.core.convert.Convert;
import com.alibaba.fastjson.JSON;
import com.aliyun.core.utils.IOUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
......@@ -89,6 +90,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
......@@ -548,6 +550,10 @@ public class THazardWorkPlanServiceImpl extends SuperServiceImpl<THazardWorkPlan
//如果为安全许可证申请
if (WorkPlanStatusEnum.PERMIT.getValue().equals(workStatus) || "99".equals(workStatus)) {
//更新实际开始时间
if (null != id) {
tHazardWorkPlanDao.updateActualStartTime(Long.parseLong(id));
}
SysDictData escalatedLevel = sysDictDataService.getDictTypeDetail(tHazardWorkPlan.getEscalatedLevel(), null, null);
String escalatedLevelValue = escalatedLevel.getDictKey();
map.put("level", escalatedLevelValue);
......@@ -567,8 +573,6 @@ public class THazardWorkPlanServiceImpl extends SuperServiceImpl<THazardWorkPlan
THazardWorkPlan updWorkPlan = new THazardWorkPlan();
updWorkPlan.setId(id);
//更新实际开始时间
updWorkPlan.setActualStartTime(new Date());
this.updateById(updWorkPlan);
}
......@@ -1394,7 +1398,9 @@ public class THazardWorkPlanServiceImpl extends SuperServiceImpl<THazardWorkPlan
// 加载模板(可优化到循环外)
Resource resource = resourceLoader.getResource("classpath:word/hazardousWorkPermit/disclosure.docx");
InputStream inputStream = resource.getInputStream();
if (inputStream == null) return;
if (inputStream == null) {
return;
}
XWPFDocument document = new MyXWPFDocument(inputStream);
WordExportUtil.exportWord07(document, datas);
......@@ -1554,7 +1560,7 @@ public class THazardWorkPlanServiceImpl extends SuperServiceImpl<THazardWorkPlan
// 填充风险分析的模板
@SneakyThrows
private Integer buildConditionConfirmation(List<XWPFDocument> wordList, THazardWorkPlanDTO planDTO, SimpleDateFormat sdf, Integer index) {
/*private Integer buildConditionConfirmation(List<XWPFDocument> wordList, THazardWorkPlanDTO planDTO, SimpleDateFormat sdf, Integer index) {
Map<String, Object> datas = new HashMap<>();
populatePlanDetails(planDTO, sdf, datas);
......@@ -1584,6 +1590,66 @@ public class THazardWorkPlanServiceImpl extends SuperServiceImpl<THazardWorkPlan
}
}
return index;
}*/
private Integer buildConditionConfirmation(List<XWPFDocument> wordList, THazardWorkPlanDTO planDTO, SimpleDateFormat sdf, Integer index) {
// 获取基础数据(不变的部分)
Map<String, Object> baseDatas = new HashMap<>();
populatePlanDetails(planDTO, sdf, baseDatas);
// 获取条件确认
List<THazardConditionConfirmation> tHazardConditionConfirmations = tHazardConditionConfirmationService.list(
new QueryWrapper<THazardConditionConfirmation>()
.eq(THazardConditionConfirmation.PLAN_ID, planDTO.getId()));
if (tHazardConditionConfirmations == null || tHazardConditionConfirmations.isEmpty()) {
return index;
}
// 按批次分组
Map<Integer, List<THazardConditionConfirmation>> listMap = tHazardConditionConfirmations.stream()
.collect(Collectors.groupingBy(THazardConditionConfirmation::getBatch));
// 预加载模板到字节数组,避免多次IO
byte[] templateBytes;
try (InputStream templateStream = resourceLoader.getResource("classpath:word/hazardousWorkPermit/conditionConfirmation.docx").getInputStream()) {
templateBytes = IOUtils.toByteArray(templateStream);
} catch (IOException e) {
log.error("加载Word模板失败", e);
return index;
}
for (Map.Entry<Integer, List<THazardConditionConfirmation>> entry : listMap.entrySet()) {
Integer batch = entry.getKey();
String format = String.format("第%s次", Convert.numberToChinese(batch, false));
// 循环当前批次的数据
for (THazardConditionConfirmation tHazardConditionConfirmation : entry.getValue()) {
if (tHazardConditionConfirmation == null) {
continue;
}
try {
// 为每个文档创建独立的数据Map
Map<String, Object> datas = new HashMap<>(baseDatas);
// 填充当前记录的特有数据
populateHazardConditionConfirmationDetails(tHazardConditionConfirmation, sdf, datas, format);
datas.put("index", index);
index++;
// 从字节数组创建文档,避免文件IO
try (ByteArrayInputStream inputStream = new ByteArrayInputStream(templateBytes)) {
XWPFDocument document = new MyXWPFDocument(inputStream);
WordExportUtil.exportWord07(document, datas);
wordList.add(document);
}
} catch (Exception e) {
log.error("生成Word文档失败,记录ID: {}", tHazardConditionConfirmation.getId(), e);
// 继续处理下一条记录,不中断整个流程
}
}
}
return index;
}
private void populateHazardConditionConfirmationDetails(THazardConditionConfirmation tHazardConditionConfirmation, SimpleDateFormat sdf, Map<String, Object> datas, String batch) {
......
......@@ -38,6 +38,17 @@ public interface TSysOrgDao extends SuperDao<TSysOrg> {
*/
List<TSysOrg> selectIsRentDept();
@Select("select * from t_sys_org\n" +
"where parent_id = #{orgId} and status = '0'")
List<TSysOrg> selectOrgNameByParentId(@Param("orgId") String orgId);
/**
* 查询父级下所有子级组织id
* @param orgId
* @return
*/
List<String> selectOrgIdByParentId(@Param("orgId") String orgId);
}
......@@ -91,4 +91,13 @@ public interface NewSysDictDataService {
* @return
*/
SysDictData getDictDataById(String dictDataId);
/**
* 根据字典id获取字典数据
* @param dictId 字典id
* @return
*/
List<SysDictData> getDictId(String dictId);
}
......@@ -161,4 +161,13 @@ public class NewSysDictDataServiceImpl implements NewSysDictDataService {
public SysDictData getDictDataById(String dictDataId) {
return sysDictDataService.getById(dictDataId);
}
@Override
public List<SysDictData> getDictId(String dictId) {
List<SysDictType> list = this.sysDictTypeService.list(new QueryWrapper<SysDictType>().eq("dict_id", dictId));
if (ObjectHelper.isNotEmpty(list)) {
return sysDictDataService.list(new QueryWrapper<SysDictData>().eq("dict_id", dictId));
}
return Collections.emptyList();
}
}
......@@ -99,6 +99,6 @@ tiny:
# 人员资质定时任务,打166包时设为false
service:
taskEnabled: true
taskEnabled: false
......@@ -61,4 +61,9 @@
)
</select>
<select id="selectOrgIdByParentId" resultType="string">
select org_id from t_sys_org
where status = '0' and parent_ids like concat('%',#{orgId},'%') or org_id =#{orgId}
</select>
</mapper>
\ No newline at end of file
......@@ -288,4 +288,146 @@
dates.timeStr
</select>
<sql id="orgIdFilter">
AND basic_id IN (
SELECT org_id FROM t_sys_org
WHERE org_id = #{param.orgId} OR parent_ids LIKE CONCAT('%', #{param.orgId}, '%')
)
</sql>
<sql id="checkTimeFilter">
<if test="param.startTime != null and param.startTime != '' and param.endTime != null and param.endTime != ''">
AND check_time BETWEEN #{param.startTime} AND #{param.endTime}
</if>
</sql>
<select id="selectHazardWorkPlanCheckStats" resultType="com.testor.module.hazard.model.dto.HazardWorkPlanCheckStatsDTO">
SELECT
<!-- 企业总数(有检查记录的企业)-->
(SELECT COUNT(DISTINCT basic_unit)
FROM t_hazard_work_plan_check
WHERE status = '0'
AND check_status = '2'
<include refid="orgIdFilter" />
<include refid="checkTimeFilter" />
) AS basicUnitCount,
<!-- 合规企业数(企业合规率 >= 95%)-->
(SELECT COUNT(*)
FROM (
SELECT basic_unit
FROM t_hazard_work_plan_check
WHERE status = '0'
AND check_status = '2'
<include refid="orgIdFilter" />
<include refid="checkTimeFilter" />
GROUP BY basic_unit
HAVING
CASE
WHEN COUNT(*) = 0 THEN 0
ELSE (SUM(CASE WHEN is_compliant = '1' THEN 1 ELSE 0 END) * 100.0 / COUNT(*))
END <![CDATA[ >= ]]> 95
) AS compliant_enterprises) AS complianceBasicUnitCount,
<!-- 不合规企业数(企业合规率 < 95%)-->
(SELECT COUNT(*)
FROM (
SELECT basic_unit
FROM t_hazard_work_plan_check
WHERE status = '0'
AND check_status = '2'
<include refid="orgIdFilter" />
<include refid="checkTimeFilter" />
GROUP BY basic_unit
HAVING
CASE
WHEN COUNT(*) = 0 THEN 0
ELSE (SUM(CASE WHEN is_compliant = '1' THEN 1 ELSE 0 END) * 100.0 / COUNT(*))
END <![CDATA[ < ]]> 95
) AS non_compliant_enterprises) AS noComplianceBasicUnitCount,
<!-- 问题数-->
(SELECT COUNT(*)
FROM t_hazard_work_plan_check
WHERE status = '0'
AND check_status = '2'
AND is_compliant = '0'
<include refid="orgIdFilter" />
<include refid="checkTimeFilter" />
) AS numberCount,
<!--危险作业数量-->
(select count(1) from t_hazard_work_plan
where work_status!='0'
AND 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 create_date BETWEEN #{param.startTime} AND #{param.endTime}
</if>) As workCount
FROM DUAL
</select>
<select id="selectComplianceCount" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM (
SELECT basic_unit
FROM t_hazard_work_plan_check
WHERE status = '0'
AND check_status = '2'
<include refid="orgIdFilter" />
<include refid="checkTimeFilter" />
GROUP BY basic_unit
HAVING
CASE
WHEN COUNT(*) = 0 THEN 0
ELSE (SUM(CASE WHEN is_compliant = '1' THEN 1 ELSE 0 END) * 100.0 / COUNT(*))
END <![CDATA[ >= ]]> 95
order by complianceRate desc
) AS compliant_enterprises
</select>
<select id="selectNoComplianceCount" resultType="java.lang.Double">
SELECT COUNT(1)
FROM t_hazard_work_plan_check
WHERE status = '0'
AND check_status = '2'
AND is_compliant = '0'
<include refid="orgIdFilter" />
<include refid="checkTimeFilter" />
<if test="problemType!=null and problemType!=''">
AND problem_type = #{problemType}
</if>
</select>
<select id="corporateComplianceRate" resultType="com.testor.module.hazard.model.vo.HazardWorkPlanCheckProblemCountStatisticsVO">
SELECT
t.basic_id,
t.basic_unit,
<!-- 计算合规率(数值)-->
ROUND(
(SUM(CASE WHEN is_compliant = '1' THEN 1 ELSE 0 END) * 100.0 / COUNT(*)),
2
) AS complianceRate,
<!-- 判断是否合规(合规率 >= 95%)-->
CASE
WHEN COUNT(*) = 0 THEN '无数据'
WHEN (SUM(CASE WHEN is_compliant = '1' THEN 1 ELSE 0 END) * 100.0 / COUNT(*)) <![CDATA[ >= ]]> 95 THEN '合规'
ELSE '不合规'
END AS isCompliant
FROM t_hazard_work_plan_check t
WHERE status = '0'
AND check_status = '2'
<include refid="orgIdFilter" />
<if test="param.basicId != null and param.basicId != ''">
AND t.basic_id = #{param.basicId}
</if>
<include refid="checkTimeFilter" />
GROUP BY t.basic_id, t.basic_unit
ORDER BY complianceRate DESC
</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