|
|
@@ -11,20 +11,34 @@ import org.dromara.common.core.utils.MapstructUtils;
|
|
|
import org.dromara.common.core.utils.StringUtils;
|
|
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
|
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
|
+import org.dromara.risk.domain.RiskEquipmentMaintenance;
|
|
|
import org.dromara.risk.domain.RiskSpecialEquipment;
|
|
|
import org.dromara.risk.domain.bo.RiskSpecialEquipmentBo;
|
|
|
+import org.dromara.risk.domain.vo.RiskEquipmentMaintenanceVo;
|
|
|
import org.dromara.risk.domain.vo.RiskSpecialEquipmentVo;
|
|
|
+import org.dromara.risk.mapper.RiskEquipmentMaintenanceMapper;
|
|
|
import org.dromara.risk.mapper.RiskSpecialEquipmentMapper;
|
|
|
import org.dromara.risk.service.IRiskSpecialEquipmentService;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.text.SimpleDateFormat;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Collection;
|
|
|
import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
+import java.util.Set;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 特种设备 业务层实现
|
|
|
+ * <p>
|
|
|
+ * 维护相关字段存取逻辑:
|
|
|
+ * - 维护记录全部存 risk_equipment_maintenance(多条记录,每次维护新增一条)
|
|
|
+ * - 设备主表 risk_special_equipment 冗余存:
|
|
|
+ * * next_maintenance_date: 下次维护时间(由用户在维护完成时录入)
|
|
|
+ * * maintenance_status: 维护状态,由 Service 动态计算 + 回写
|
|
|
+ * - 列表展示用最新一条维护记录的字段(fillLatestMaintenance 注入)
|
|
|
*
|
|
|
* @author ruoyi
|
|
|
*/
|
|
|
@@ -34,13 +48,26 @@ import java.util.Map;
|
|
|
public class RiskSpecialEquipmentServiceImpl implements IRiskSpecialEquipmentService {
|
|
|
|
|
|
private final RiskSpecialEquipmentMapper baseMapper;
|
|
|
+ private final RiskEquipmentMaintenanceMapper maintenanceMapper;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 维护状态常量(与 sys_dict maintenance_status 对齐)
|
|
|
+ */
|
|
|
+ private static final String MS_NOT_MAINTAINED = "未维护";
|
|
|
+ private static final String MS_PENDING = "待维护";
|
|
|
+ private static final String MS_IN_PROGRESS = "维护中";
|
|
|
+ private static final String MS_COMPLETED = "已维护";
|
|
|
|
|
|
/**
|
|
|
* 查询特种设备
|
|
|
*/
|
|
|
@Override
|
|
|
public RiskSpecialEquipmentVo queryById(Long id) {
|
|
|
- return baseMapper.selectVoById(id);
|
|
|
+ RiskSpecialEquipmentVo vo = baseMapper.selectVoById(id);
|
|
|
+ if (vo != null) {
|
|
|
+ fillLatestMaintenance(java.util.Collections.singletonList(vo));
|
|
|
+ }
|
|
|
+ return vo;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -50,6 +77,10 @@ public class RiskSpecialEquipmentServiceImpl implements IRiskSpecialEquipmentSer
|
|
|
public TableDataInfo<RiskSpecialEquipmentVo> queryPageList(RiskSpecialEquipmentBo bo, PageQuery pageQuery) {
|
|
|
LambdaQueryWrapper<RiskSpecialEquipment> lqw = buildQueryWrapper(bo);
|
|
|
Page<RiskSpecialEquipmentVo> page = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
|
+ // 列表填充最新维护记录 + 维护状态判定
|
|
|
+ if (page.getRecords() != null && !page.getRecords().isEmpty()) {
|
|
|
+ fillLatestMaintenance(page.getRecords());
|
|
|
+ }
|
|
|
return TableDataInfo.build(page);
|
|
|
}
|
|
|
|
|
|
@@ -59,11 +90,21 @@ public class RiskSpecialEquipmentServiceImpl implements IRiskSpecialEquipmentSer
|
|
|
@Override
|
|
|
public List<RiskSpecialEquipmentVo> queryList(RiskSpecialEquipmentBo bo) {
|
|
|
LambdaQueryWrapper<RiskSpecialEquipment> lqw = buildQueryWrapper(bo);
|
|
|
- return baseMapper.selectVoList(lqw);
|
|
|
+ List<RiskSpecialEquipmentVo> list = baseMapper.selectVoList(lqw);
|
|
|
+ if (ObjectUtil.isNotEmpty(list)) {
|
|
|
+ fillLatestMaintenance(list);
|
|
|
+ }
|
|
|
+ return list;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 构造查询条件
|
|
|
+ * <p>
|
|
|
+ * 用户明确的查询条件:
|
|
|
+ * - 设备名称(模糊)
|
|
|
+ * - 设备类型(精确)
|
|
|
+ * - 维护状态(精确,直接命中设备主表冗余列 maintenance_status)
|
|
|
+ * - 下次维护日期(范围)
|
|
|
*/
|
|
|
private LambdaQueryWrapper<RiskSpecialEquipment> buildQueryWrapper(RiskSpecialEquipmentBo bo) {
|
|
|
Map<String, Object> params = bo.getParams();
|
|
|
@@ -74,10 +115,14 @@ public class RiskSpecialEquipmentServiceImpl implements IRiskSpecialEquipmentSer
|
|
|
lqw.eq(StringUtils.isNotBlank(bo.getInspectionStatus()), RiskSpecialEquipment::getInspectionStatus, bo.getInspectionStatus());
|
|
|
lqw.like(StringUtils.isNotBlank(bo.getEquipmentName()), RiskSpecialEquipment::getEquipmentName, bo.getEquipmentName());
|
|
|
lqw.like(StringUtils.isNotBlank(bo.getManufacturer()), RiskSpecialEquipment::getManufacturer, bo.getManufacturer());
|
|
|
+ // 维护状态(冗余列精确匹配)
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getMaintenanceStatus()), RiskSpecialEquipment::getMaintenanceStatus, bo.getMaintenanceStatus());
|
|
|
+ // 下次维护日期范围
|
|
|
+ lqw.between(params.get("beginNextMaintenanceDate") != null && params.get("endNextMaintenanceDate") != null,
|
|
|
+ RiskSpecialEquipment::getNextMaintenanceDate, params.get("beginNextMaintenanceDate"), params.get("endNextMaintenanceDate"));
|
|
|
// 关键词搜索
|
|
|
if (StringUtils.isNotBlank(bo.getKeyword())) {
|
|
|
lqw.and(w -> w.like(RiskSpecialEquipment::getEquipmentName, bo.getKeyword())
|
|
|
- .or().like(RiskSpecialEquipment::getEquipmentName, bo.getKeyword())
|
|
|
.or().like(RiskSpecialEquipment::getEquipmentCode, bo.getKeyword()));
|
|
|
}
|
|
|
lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null,
|
|
|
@@ -96,6 +141,10 @@ public class RiskSpecialEquipmentServiceImpl implements IRiskSpecialEquipmentSer
|
|
|
if (StringUtils.isBlank(bo.getEquipmentCode())) {
|
|
|
bo.setEquipmentCode(generateEquipmentCode());
|
|
|
}
|
|
|
+ // 新增设备默认未维护
|
|
|
+ if (StringUtils.isBlank(bo.getMaintenanceStatus())) {
|
|
|
+ bo.setMaintenanceStatus(MS_NOT_MAINTAINED);
|
|
|
+ }
|
|
|
RiskSpecialEquipment add = MapstructUtils.convert(bo, RiskSpecialEquipment.class);
|
|
|
int row = baseMapper.insert(add);
|
|
|
bo.setId(add.getId());
|
|
|
@@ -143,4 +192,94 @@ public class RiskSpecialEquipmentServiceImpl implements IRiskSpecialEquipmentSer
|
|
|
return baseMapper.deleteBatchIds(ids);
|
|
|
}
|
|
|
|
|
|
-}
|
|
|
+ /**
|
|
|
+ * 批量填充最新一条维护记录 + 维护状态动态判定
|
|
|
+ * <p>
|
|
|
+ * 1. 取每个设备最新一条维护记录(按 create_time 倒序,id 倒序兜底)
|
|
|
+ * 2. 字段填充到 Vo: maintenanceStartTime / maintenanceEndTime / maintainerName / siteName / latestMaintenanceId
|
|
|
+ * 3. 维护状态判定:
|
|
|
+ * - 无记录 -> 未维护
|
|
|
+ * - 最新记录状态='维护中' -> 维护中
|
|
|
+ * - 最新记录状态='已维护':
|
|
|
+ * * next_maintenance_date < NOW() -> 待维护
|
|
|
+ * * next_maintenance_date >= NOW() -> 正常
|
|
|
+ * - 最新记录状态='待维护' -> 待维护
|
|
|
+ */
|
|
|
+ private void fillLatestMaintenance(List<RiskSpecialEquipmentVo> vos) {
|
|
|
+ if (ObjectUtil.isEmpty(vos)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ Set<Long> equipmentIds = vos.stream()
|
|
|
+ .map(RiskSpecialEquipmentVo::getId)
|
|
|
+ .filter(ObjectUtil::isNotNull)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+ if (equipmentIds.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 一次性查所有设备的最新一条维护记录(用 inSql 子查询避免复杂 group by)
|
|
|
+ // 策略:按 equipmentId 分组查最新一条
|
|
|
+ Map<Long, RiskEquipmentMaintenance> latestMap = new java.util.HashMap<>(equipmentIds.size());
|
|
|
+ for (Long equipmentId : equipmentIds) {
|
|
|
+ RiskEquipmentMaintenance latest = maintenanceMapper.selectOne(
|
|
|
+ Wrappers.<RiskEquipmentMaintenance>lambdaQuery()
|
|
|
+ .eq(RiskEquipmentMaintenance::getEquipmentId, equipmentId)
|
|
|
+ .orderByDesc(RiskEquipmentMaintenance::getCreateTime)
|
|
|
+ .orderByDesc(RiskEquipmentMaintenance::getId)
|
|
|
+ .last("LIMIT 1")
|
|
|
+ );
|
|
|
+ if (latest != null) {
|
|
|
+ latestMap.put(equipmentId, latest);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Date now = new Date();
|
|
|
+ for (RiskSpecialEquipmentVo vo : vos) {
|
|
|
+ RiskEquipmentMaintenance latest = latestMap.get(vo.getId());
|
|
|
+ if (latest != null) {
|
|
|
+ vo.setLatestMaintenanceId(latest.getId());
|
|
|
+ vo.setMaintenanceStartTime(latest.getActualStartTime());
|
|
|
+ vo.setMaintenanceEndTime(latest.getActualEndTime());
|
|
|
+ vo.setMaintainerName(latest.getMaintainerName());
|
|
|
+ vo.setSiteName(latest.getSiteName());
|
|
|
+ }
|
|
|
+ // 维护状态以最新一条维护记录 + next_maintenance_date 为准动态判定
|
|
|
+ vo.setMaintenanceStatus(computeMaintenanceStatus(vo, latest, now));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 维护状态动态判定
|
|
|
+ * <p>
|
|
|
+ * 规则(按用户需求 ⑤):
|
|
|
+ * - 无最新记录 -> 未维护
|
|
|
+ * - 最新记录状态='维护中' -> 维护中
|
|
|
+ * - 最新记录状态='已维护' + next_maintenance_date < now -> 待维护
|
|
|
+ * - 最新记录状态='已维护' + next_maintenance_date >= now -> 正常
|
|
|
+ * - 最新记录状态='待维护' -> 待维护
|
|
|
+ */
|
|
|
+ private String computeMaintenanceStatus(RiskSpecialEquipmentVo vo, RiskEquipmentMaintenance latest, Date now) {
|
|
|
+ if (latest == null) {
|
|
|
+ return MS_NOT_MAINTAINED;
|
|
|
+ }
|
|
|
+ String mStatus = latest.getMaintenanceStatus();
|
|
|
+ if (MS_IN_PROGRESS.equals(mStatus)) {
|
|
|
+ return MS_IN_PROGRESS;
|
|
|
+ }
|
|
|
+ if (MS_PENDING.equals(mStatus)) {
|
|
|
+ return MS_PENDING;
|
|
|
+ }
|
|
|
+ if (MS_COMPLETED.equals(mStatus) || "已维护".equals(mStatus)) {
|
|
|
+ Date nextDate = vo.getNextMaintenanceDate();
|
|
|
+ if (nextDate != null && nextDate.before(now)) {
|
|
|
+ return MS_PENDING;
|
|
|
+ }
|
|
|
+ return MS_COMPLETED;
|
|
|
+ }
|
|
|
+ // 未知状态时按 next_maintenance_date 兜底
|
|
|
+ Date nextDate = vo.getNextMaintenanceDate();
|
|
|
+ if (nextDate != null && nextDate.before(now)) {
|
|
|
+ return MS_PENDING;
|
|
|
+ }
|
|
|
+ return MS_COMPLETED;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|