package com.ruoyi.safe.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.dto.StorageBlobVO;
import com.ruoyi.basic.enums.ApplicationTypeEnum;
import com.ruoyi.basic.enums.RecordTypeEnum;
import com.ruoyi.basic.utils.FileUtil;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.safe.mapper.SafeLineInspectionHazardMapper;
import com.ruoyi.safe.mapper.SafeLineInspectionMapper;
import com.ruoyi.safe.pojo.SafeHidden;
import com.ruoyi.safe.pojo.SafeLineInspection;
import com.ruoyi.safe.pojo.SafeLineInspectionHazard;
import com.ruoyi.safe.service.SafeHiddenService;
import com.ruoyi.safe.service.SafeLineInspectionHazardService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 安全生产--线路巡检隐患 服务实现类
*
*
* @author 芯导软件(江苏)有限公司
* @since 2026-06-29
*/
@Service
public class SafeLineInspectionHazardServiceImpl extends ServiceImpl implements SafeLineInspectionHazardService {
@Autowired
private SysUserMapper sysUserMapper;
@Autowired
private SafeHiddenService safeHiddenService;
@Autowired
private SafeLineInspectionMapper safeLineInspectionMapper;
@Autowired
private FileUtil fileUtil;
@Override
public IPage pageSafeLineInspectionHazard(Page page, SafeLineInspectionHazard safeLineInspectionHazard) {
IPage result = this.lambdaQuery()
.eq(safeLineInspectionHazard.getInspectionId() != null, SafeLineInspectionHazard::getInspectionId, safeLineInspectionHazard.getInspectionId())
.like(StringUtils.isNotBlank(safeLineInspectionHazard.getHazardCode()), SafeLineInspectionHazard::getHazardCode, safeLineInspectionHazard.getHazardCode())
.like(StringUtils.isNotBlank(safeLineInspectionHazard.getHazardDesc()), SafeLineInspectionHazard::getHazardDesc, safeLineInspectionHazard.getHazardDesc())
.eq(StringUtils.isNotBlank(safeLineInspectionHazard.getStatus()), SafeLineInspectionHazard::getStatus, safeLineInspectionHazard.getStatus())
.orderByDesc(SafeLineInspectionHazard::getCreateTime)
.page(page);
fillRectifyUserName(result.getRecords());
fillInspectionInfo(result.getRecords());
fillRectifyAttachments(result.getRecords());
return result;
}
@Override
public SafeLineInspectionHazard getById(Serializable id) {
SafeLineInspectionHazard record = super.getById(id);
if (record != null) {
fillRectifyUserName(Collections.singletonList(record));
fillInspectionInfo(Collections.singletonList(record));
fillRectifyAttachments(Collections.singletonList(record));
}
return record;
}
@Override
public List listByInspectionId(Integer inspectionId) {
List records = this.lambdaQuery()
.eq(SafeLineInspectionHazard::getInspectionId, inspectionId)
.orderByDesc(SafeLineInspectionHazard::getCreateTime)
.list();
fillRectifyUserName(records);
fillInspectionInfo(records);
fillRectifyAttachments(records);
return records;
}
@Override
public boolean save(SafeLineInspectionHazard entity) {
if (entity.getHazardCode() == null || entity.getHazardCode().isEmpty()) {
entity.setHazardCode(generateHazardCode());
}
return super.save(entity);
}
@Override
public boolean updateById(SafeLineInspectionHazard entity) {
SafeLineInspectionHazard oldRecord = entity.getId() == null ? null : this.getById(entity.getId());
if (oldRecord == null) {
throw new IllegalArgumentException("整改记录不存在");
}
Integer safeHiddenId = entity.getSafeHiddenId() != null
? entity.getSafeHiddenId()
: oldRecord.getSafeHiddenId();
if ("已整改".equals(entity.getStatus())) {
validateRectify(entity, oldRecord);
entity.setRectifyUserId(oldRecord.getRectifyUserId());
entity.setRectifyTime(LocalDateTime.now());
}
boolean updated = super.updateById(entity);
if (updated && "已整改".equals(entity.getStatus())) {
syncRectifyAttachments(entity);
}
if (updated && "已整改".equals(entity.getStatus()) && safeHiddenId != null) {
SafeHidden hidden = new SafeHidden();
hidden.setId(safeHiddenId);
hidden.setRectifyMeasures(entity.getRectifyDesc());
hidden.setRectifyActualTime(LocalDate.now());
safeHiddenService.updateById(hidden);
}
if (updated && "已整改".equals(entity.getStatus())) {
Integer inspectionId = entity.getInspectionId() != null
? entity.getInspectionId()
: oldRecord.getInspectionId();
completeInspectionIfAllRectified(inspectionId);
}
return updated;
}
private void validateRectify(SafeLineInspectionHazard entity, SafeLineInspectionHazard oldRecord) {
if ("已整改".equals(oldRecord.getStatus())) {
throw new IllegalArgumentException("该隐患已整改,请勿重复操作");
}
Long currentUserId = SecurityUtils.getUserId();
if (oldRecord.getRectifyUserId() == null || currentUserId == null
|| !oldRecord.getRectifyUserId().equals(currentUserId.intValue())) {
throw new IllegalArgumentException("只有整改责任人可以进行整改");
}
if (StringUtils.isBlank(entity.getRectifyDesc())) {
throw new IllegalArgumentException("请输入整改说明");
}
if (entity.getStorageBlobDTOs() == null || entity.getStorageBlobDTOs().isEmpty()) {
throw new IllegalArgumentException("请上传整改后照片");
}
}
private void syncRectifyAttachments(SafeLineInspectionHazard entity) {
if (entity.getId() == null || entity.getStorageBlobDTOs() == null) {
return;
}
fileUtil.saveStorageAttachment(
ApplicationTypeEnum.IMAGE,
RecordTypeEnum.SAFE_LINE_INSPECTION_HAZARD,
entity.getId().longValue(),
entity.getStorageBlobDTOs()
);
}
private String generateHazardCode() {
long count = this.count() + 1;
return "YH" + String.format("%05d", count);
}
private void fillRectifyUserName(List records) {
if (records == null || records.isEmpty()) {
return;
}
List userIds = records.stream()
.map(SafeLineInspectionHazard::getRectifyUserId)
.filter(Objects::nonNull)
.map(Integer::longValue)
.distinct()
.collect(Collectors.toList());
if (userIds.isEmpty()) {
return;
}
Map userMap = sysUserMapper.selectUserByIds(userIds).stream()
.collect(Collectors.toMap(SysUser::getUserId, SysUser::getNickName, (v1, v2) -> v1));
records.forEach(record -> {
if (record.getRectifyUserId() != null) {
record.setRectifyUserName(userMap.getOrDefault(record.getRectifyUserId().longValue(), "未知用户"));
}
});
}
private void fillInspectionInfo(List records) {
if (records == null || records.isEmpty()) {
return;
}
List inspectionIds = records.stream()
.map(SafeLineInspectionHazard::getInspectionId)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
if (inspectionIds.isEmpty()) {
return;
}
Map inspectionMap = safeLineInspectionMapper.selectBatchIds(inspectionIds).stream()
.collect(Collectors.toMap(SafeLineInspection::getId, item -> item, (v1, v2) -> v1));
records.forEach(record -> {
SafeLineInspection inspection = inspectionMap.get(record.getInspectionId());
if (inspection != null) {
record.setInspectionCode(inspection.getInspectionCode());
record.setInspectionName(inspection.getInspectionName());
record.setLineName(inspection.getLineName());
}
});
}
private void fillRectifyAttachments(List records) {
if (records == null || records.isEmpty()) {
return;
}
records.forEach(record -> {
if (record.getId() == null) {
return;
}
List attachments = fileUtil.getStorageBlobVOsByRecordTypeAndRecordId(
RecordTypeEnum.SAFE_LINE_INSPECTION_HAZARD,
record.getId().longValue()
);
record.setStorageBlobVOs(attachments == null ? Collections.emptyList() : attachments);
});
}
private void completeInspectionIfAllRectified(Integer inspectionId) {
if (inspectionId == null) {
return;
}
long unrectifiedCount = this.lambdaQuery()
.eq(SafeLineInspectionHazard::getInspectionId, inspectionId)
.ne(SafeLineInspectionHazard::getStatus, "已整改")
.count();
if (unrectifiedCount > 0) {
return;
}
SafeLineInspection inspection = safeLineInspectionMapper.selectById(inspectionId);
if (inspection == null || "已完成".equals(inspection.getStatus())) {
return;
}
Long currentUserId = SecurityUtils.getUserId();
inspection.setStatus("已完成");
inspection.setUpdateTime(LocalDateTime.now());
inspection.setUpdateUser(currentUserId == null ? null : currentUserId.intValue());
safeLineInspectionMapper.updateById(inspection);
}
}