package cn.iocoder.yudao.module.mes.controller.admin.safety;
|
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.statistics.MesSafetyHazardExcelVO;
|
import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.statistics.MesSafetyStatisticsReqVO;
|
import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.statistics.MesSafetyStatisticsRespVO;
|
import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkshopDO;
|
import cn.iocoder.yudao.module.mes.dal.dataobject.safety.MesSafetyHazardDO;
|
import cn.iocoder.yudao.module.mes.dal.mysql.md.workstation.MesMdWorkshopMapper;
|
import cn.iocoder.yudao.module.mes.dal.mysql.safety.MesSafetyHazardMapper;
|
import cn.iocoder.yudao.module.mes.service.safety.MesSafetyStatisticsService;
|
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
import jakarta.annotation.Resource;
|
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.validation.Valid;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.validation.annotation.Validated;
|
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RestController;
|
|
import java.io.IOException;
|
import java.time.LocalDate;
|
import java.time.LocalDateTime;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
|
/**
|
* 安全生产 - 统计分析 Controller
|
*
|
* @author 超级管理员
|
*/
|
@Tag(name = "管理后台 - 安全生产-统计分析")
|
@RestController
|
@RequestMapping("/mes/safety/statistics")
|
@Validated
|
public class MesSafetyStatisticsController {
|
|
@Resource
|
private MesSafetyStatisticsService statisticsService;
|
|
@Resource
|
private MesSafetyHazardMapper hazardMapper;
|
|
@Resource
|
private MesMdWorkshopMapper workshopMapper;
|
|
@Resource
|
private AdminUserApi adminUserApi;
|
|
/** 隐患等级文本 */
|
private static final String[] HAZARD_LEVEL_NAMES = {null, "一般隐患", "重大隐患"};
|
/** 隐患来源文本 */
|
private static final String[] HAZARD_SOURCE_NAMES = {null, "日常排查", "专项检查", "上级检查", "员工上报", "其他"};
|
|
@GetMapping("/report")
|
@Operation(summary = "获得安全生产统计报表")
|
@PreAuthorize("@ss.hasPermission('mes:safety-statistics:query')")
|
public CommonResult<MesSafetyStatisticsRespVO> getReport(@Valid MesSafetyStatisticsReqVO reqVO) {
|
return success(statisticsService.getStatistics(reqVO));
|
}
|
|
@GetMapping("/export-hazard")
|
@Operation(summary = "导出隐患明细报表")
|
@PreAuthorize("@ss.hasPermission('mes:safety-statistics:export')")
|
public void exportHazard(@Valid MesSafetyStatisticsReqVO reqVO,
|
HttpServletResponse response) throws IOException {
|
List<MesSafetyHazardDO> list = hazardMapper.selectAllList().stream()
|
.filter(h -> inRange(h.getCreateTime(), reqVO))
|
.filter(h -> reqVO.getWorkshopId() == null
|
|| Objects.equals(h.getWorkshopId(), reqVO.getWorkshopId()))
|
.collect(Collectors.toList());
|
|
// 字典与关联名称在导出前转为中文,业务人员可直接查看
|
Map<Long, String> workshopNameMap = workshopMapper.selectList().stream()
|
.collect(Collectors.toMap(MesMdWorkshopDO::getId, MesMdWorkshopDO::getName, (a, b) -> a));
|
Set<Long> userIds = list.stream().map(MesSafetyHazardDO::getChargeUserId)
|
.filter(Objects::nonNull).collect(Collectors.toSet());
|
Map<Long, AdminUserRespDTO> userMap = userIds.isEmpty()
|
? Collections.emptyMap() : adminUserApi.getUserMap(userIds);
|
|
LocalDate today = LocalDate.now();
|
List<MesSafetyHazardExcelVO> excelList = new ArrayList<>(list.size());
|
for (MesSafetyHazardDO hazard : list) {
|
MesSafetyHazardExcelVO vo = BeanUtils.toBean(hazard, MesSafetyHazardExcelVO.class);
|
vo.setHazardLevelName(dictName(HAZARD_LEVEL_NAMES, hazard.getHazardLevel()));
|
vo.setSourceName(dictName(HAZARD_SOURCE_NAMES, hazard.getSource()));
|
vo.setWorkshopName(workshopNameMap.get(hazard.getWorkshopId()));
|
vo.setStatusName(hazardStatusName(hazard.getStatus()));
|
AdminUserRespDTO charge = hazard.getChargeUserId() == null
|
? null : userMap.get(hazard.getChargeUserId());
|
vo.setChargeUserName(charge == null ? null : charge.getNickname());
|
boolean overdue = hazard.getDeadline() != null
|
&& !MesSafetyHazardDO.STATUS_CLOSED.equals(hazard.getStatus())
|
&& hazard.getDeadline().isBefore(today);
|
vo.setOverdueText(overdue ? "是" : "否");
|
excelList.add(vo);
|
}
|
|
ExcelUtils.write(response, "隐患明细.xlsx", "隐患明细", MesSafetyHazardExcelVO.class, excelList);
|
}
|
|
// ==================== 工具 ====================
|
|
private String dictName(String[] names, Integer value) {
|
if (value == null || value < 0 || value >= names.length) {
|
return null;
|
}
|
return names[value];
|
}
|
|
private String hazardStatusName(Integer status) {
|
if (status == null) {
|
return null;
|
}
|
return switch (status) {
|
case 0 -> "待整改";
|
case 10 -> "整改中";
|
case 20 -> "待验收";
|
case 30 -> "已闭环";
|
default -> "未知";
|
};
|
}
|
|
private boolean inRange(LocalDateTime createTime, MesSafetyStatisticsReqVO reqVO) {
|
if (reqVO.getStartDate() == null && reqVO.getEndDate() == null) {
|
return true;
|
}
|
if (createTime == null) {
|
return false;
|
}
|
if (reqVO.getStartDate() != null && createTime.isBefore(reqVO.getStartDate().atStartOfDay())) {
|
return false;
|
}
|
return reqVO.getEndDate() == null || !createTime.isAfter(reqVO.getEndDate().atTime(23, 59, 59));
|
}
|
|
}
|