|
@@ -1,5 +1,6 @@
|
|
|
package org.dromara.risk.service.impl;
|
|
package org.dromara.risk.service.impl;
|
|
|
|
|
|
|
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
@@ -13,6 +14,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
|
import org.dromara.risk.domain.RiskInspectionTask;
|
|
import org.dromara.risk.domain.RiskInspectionTask;
|
|
|
import org.dromara.risk.domain.bo.RiskInspectionTaskBo;
|
|
import org.dromara.risk.domain.bo.RiskInspectionTaskBo;
|
|
|
import org.dromara.risk.domain.RiskInspectionRecord;
|
|
import org.dromara.risk.domain.RiskInspectionRecord;
|
|
|
|
|
+import org.dromara.risk.domain.vo.MobileInspectionTaskVo;
|
|
|
import org.dromara.risk.domain.vo.RiskInspectionRecordVo;
|
|
import org.dromara.risk.domain.vo.RiskInspectionRecordVo;
|
|
|
import org.dromara.risk.domain.vo.InspectionStatsVo;
|
|
import org.dromara.risk.domain.vo.InspectionStatsVo;
|
|
|
import org.dromara.risk.domain.vo.RiskInspectionTaskVo;
|
|
import org.dromara.risk.domain.vo.RiskInspectionTaskVo;
|
|
@@ -22,10 +24,14 @@ import org.dromara.risk.service.IRiskInspectionTaskService;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.context.annotation.Lazy;
|
|
import org.springframework.context.annotation.Lazy;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
+import org.springframework.util.Assert;
|
|
|
|
|
|
|
|
import java.time.LocalDate;
|
|
import java.time.LocalDate;
|
|
|
import java.time.LocalDateTime;
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.LocalTime;
|
|
import java.time.LocalTime;
|
|
|
|
|
+import java.util.Collections;
|
|
|
|
|
+import java.util.Date;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
|
|
|
|
@@ -181,5 +187,106 @@ public class RiskInspectionTaskServiceImpl implements IRiskInspectionTaskService
|
|
|
return vo;
|
|
return vo;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // ===================== 移动端接口实现 =====================
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 移动端-查询我的巡检任务列表
|
|
|
|
|
+ */
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public TableDataInfo<MobileInspectionTaskVo> queryMobileList(Long inspectorId, String status, PageQuery pageQuery) {
|
|
|
|
|
+ // 1. 查任务(分页)
|
|
|
|
|
+ LambdaQueryWrapper<RiskInspectionTask> lqw = Wrappers.<RiskInspectionTask>lambdaQuery();
|
|
|
|
|
+ if (ObjectUtil.isNotNull(inspectorId)) {
|
|
|
|
|
+ lqw.eq(RiskInspectionTask::getInspectorId, inspectorId);
|
|
|
|
|
+ }
|
|
|
|
|
+ // 不查 已删除 的
|
|
|
|
|
+ lqw.eq(RiskInspectionTask::getDelFlag, "0");
|
|
|
|
|
+ // 状态过滤(移动端状态 PENDING/PUNCHED/OVERDUE/FINISHED)
|
|
|
|
|
+ if (StringUtils.isBlank(status)) {
|
|
|
|
|
+ // 默认查 全部,但隐藏 已完成
|
|
|
|
|
+ lqw.ne(RiskInspectionTask::getTaskStatus, "已完成");
|
|
|
|
|
+ }
|
|
|
|
|
+ lqw.orderByDesc(RiskInspectionTask::getPlanStartTime);
|
|
|
|
|
+ Page<RiskInspectionTask> page = baseMapper.selectPage(pageQuery.build(), lqw);
|
|
|
|
|
+ List<MobileInspectionTaskVo> rows = page.getRecords().stream()
|
|
|
|
|
+ .map(this::convertToMobileVo)
|
|
|
|
|
+ .toList();
|
|
|
|
|
+ return TableDataInfo.build(new Page<MobileInspectionTaskVo>()
|
|
|
|
|
+ .setRecords(rows)
|
|
|
|
|
+ .setTotal(page.getTotal())
|
|
|
|
|
+ .setSize(page.getSize())
|
|
|
|
|
+ .setCurrent(page.getCurrent()));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 移动端-查询任务详情
|
|
|
|
|
+ */
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public MobileInspectionTaskVo queryMobileDetail(Long id) {
|
|
|
|
|
+ RiskInspectionTask task = baseMapper.selectById(id);
|
|
|
|
|
+ Assert.notNull(task, "巡检任务不存在: " + id);
|
|
|
|
|
+ return convertToMobileVo(task);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 移动端-校验二维码
|
|
|
|
|
+ */
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public boolean verifyQrCode(Long taskId, String qrCode) {
|
|
|
|
|
+ if (ObjectUtil.isNull(taskId) || StringUtils.isBlank(qrCode)) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ RiskInspectionTask task = baseMapper.selectById(taskId);
|
|
|
|
|
+ if (task == null || StringUtils.isBlank(task.getQrCode())) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ return task.getQrCode().trim().equals(qrCode.trim());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 实体 → 移动端 VO
|
|
|
|
|
+ * <p>
|
|
|
|
|
+ * 计算字段:
|
|
|
|
|
+ * - punchType : 1-扫码 0-常规(基于 scan_enabled/ check_method)
|
|
|
|
|
+ * - punchStatus: PENDING-待打卡 / PUNCHED-已打卡 / OVERDUE-已逾期 / FINISHED-已完成
|
|
|
|
|
+ * - punchResult: 0-正常 / 1-异常 / null-未打卡 (基于最新一条 record)
|
|
|
|
|
+ */
|
|
|
|
|
+ private MobileInspectionTaskVo convertToMobileVo(RiskInspectionTask task) {
|
|
|
|
|
+ MobileInspectionTaskVo vo = new MobileInspectionTaskVo();
|
|
|
|
|
+ BeanUtil.copyProperties(task, vo);
|
|
|
|
|
+
|
|
|
|
|
+ // 1. 打卡类型
|
|
|
|
|
+ boolean isScan = "1".equals(task.getScanEnabled())
|
|
|
|
|
+ || "扫码".equals(task.getCheckMethod());
|
|
|
|
|
+ vo.setPunchType(isScan ? "SCAN" : "NORMAL");
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 查最近一条记录
|
|
|
|
|
+ RiskInspectionRecord latest = recordMapper.selectOne(
|
|
|
|
|
+ Wrappers.<RiskInspectionRecord>lambdaQuery()
|
|
|
|
|
+ .eq(RiskInspectionRecord::getTaskId, task.getId())
|
|
|
|
|
+ .orderByDesc(RiskInspectionRecord::getCheckInTime)
|
|
|
|
|
+ .last("LIMIT 1")
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 任务原始状态
|
|
|
|
|
+ String originStatus = task.getTaskStatus();
|
|
|
|
|
+ Date now = new Date();
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 状态计算
|
|
|
|
|
+ if ("已完成".equals(originStatus)) {
|
|
|
|
|
+ vo.setPunchStatus("FINISHED");
|
|
|
|
|
+ } else if (latest != null) {
|
|
|
|
|
+ // 已有打卡记录
|
|
|
|
|
+ vo.setPunchStatus("PUNCHED");
|
|
|
|
|
+ vo.setPunchTime(latest.getCheckInTime());
|
|
|
|
|
+ vo.setPunchResult(latest.getResult());
|
|
|
|
|
+ } else if (task.getPlanEndTime() != null && task.getPlanEndTime().before(now)) {
|
|
|
|
|
+ // 超时且未打卡
|
|
|
|
|
+ vo.setPunchStatus("OVERDUE");
|
|
|
|
|
+ } else {
|
|
|
|
|
+ vo.setPunchStatus("PENDING");
|
|
|
|
|
+ }
|
|
|
|
|
+ return vo;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
}
|
|
}
|