Ver Fonte

pms 瑞恒 运行记录 无法填报

zhangcl há 7 horas atrás
pai
commit
80905b2c92

+ 6 - 5
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotopeationfill/IotOpeationFillController.java

@@ -930,12 +930,13 @@ public class IotOpeationFillController {
         IotOpeationFillDO fillDO = new IotOpeationFillDO();
         fillDO.setId(id);
         IotOpeationFillDO iotOpeationFill = iotOpeationFillService.getFillById(fillDO);
+        Map<Long, String> wellNamePair = new HashMap<>();
+        iotOpeationFill.setWellNamePair(wellNamePair);
         TenantUtils.executeIgnore(() -> {
-                    IotProjectTaskPageReqVO reqVO = new IotProjectTaskPageReqVO();
-                    reqVO.setDeptId(iotOpeationFill.getDeptId());
-                    reqVO.setJobFlag("Y");
-                    List<IotProjectTaskDO> tasks = iotProjectTaskMapper.selectList(reqVO);
-                    Map<Long, String> wellNamePair = new HashMap<>();
+            IotProjectTaskPageReqVO reqVO = new IotProjectTaskPageReqVO();
+            reqVO.setDeptId(iotOpeationFill.getDeptId());
+            reqVO.setJobFlag("Y");
+            List<IotProjectTaskDO> tasks = iotProjectTaskMapper.selectList(reqVO);
                     if (CollUtil.isNotEmpty(tasks)) {
                         // 取最新的1个任务
                         iotOpeationFill.setWellName(tasks.get(0).getWellName());

+ 8 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreport/IotRdDailyReportController.java

@@ -156,6 +156,14 @@ public class IotRdDailyReportController {
         return success(true);
     }
 
+    @PostMapping("/repairHistoryProdStatus")
+    @Operation(summary = "修复历史生产动态数据")
+    @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report:update')")
+    public CommonResult<Boolean> repairHistoryProdStatus() {
+        iotRdDailyReportService.repairHistoryProdStatus();
+        return success(true);
+    }
+
     @PutMapping("/approval")
     @Operation(summary = "审批日报")
     @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report:update')")

+ 8 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrydailyreport/IotRyDailyReportController.java

@@ -99,6 +99,14 @@ public class IotRyDailyReportController {
         return success(true);
     }
 
+    @PostMapping("/repairHistoryProdStatus")
+    @Operation(summary = "修复历史生产动态数据 生产动态明细拆分")
+    @PreAuthorize("@ss.hasPermission('pms:iot-ry-daily-report:update')")
+    public CommonResult<Boolean> repairHistoryProdStatus() {
+        iotRyDailyReportService.repairHistoryProdStatus();
+        return success(true);
+    }
+
     @PutMapping("/approval")
     @Operation(summary = "审批日报")
     @PreAuthorize("@ss.hasPermission('pms:iot-ry-daily-report:update')")

+ 7 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrddailyreport/IotRdDailyReportService.java

@@ -173,4 +173,11 @@ public interface IotRdDailyReportService {
      * @return 瑞都日报施工简报 列表
      */
     List<IotRdDailyReportAbnormalRespVO> abnormalAlert(IotRdDailyReportPageReqVO pageReqVO);
+
+    /**
+     * 修复历史生产动态数据
+     *
+     * @return
+     */
+    void repairHistoryProdStatus();
 }

+ 61 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrddailyreport/IotRdDailyReportServiceImpl.java

@@ -37,6 +37,7 @@ import cn.iocoder.yudao.module.pms.dal.mysql.iotrddailyreportdetail.IotRdDailyRe
 import cn.iocoder.yudao.module.pms.enums.AttachmentCategoryEnum;
 import cn.iocoder.yudao.module.pms.enums.AttachmentTypeEnum;
 import cn.iocoder.yudao.module.pms.message.PmsMessage;
+import cn.iocoder.yudao.module.pms.util.LocalTimeUtils;
 import cn.iocoder.yudao.module.supplier.enums.common.SupplierAuditStatusEnum;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
@@ -61,8 +62,10 @@ import org.springframework.validation.annotation.Validated;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
@@ -3225,4 +3228,62 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
         return result;
     }
 
+    @Override
+    public void repairHistoryProdStatus() {
+        // 修复历史生产动态数据 生产动态拆分明细后 需要把  productionStatus 值赋值到 明细表 rq_iot_rd_daily_report_detail
+        // 查询所有 日报数据 筛选出 production_status 有值的记录
+        IotRdDailyReportPageReqVO reqVO = new IotRdDailyReportPageReqVO();
+        List<IotRdDailyReportDO> reports = iotRdDailyReportMapper.dailyReports(reqVO);
+        List<IotRdDailyReportDetailDO> reportDetails = new ArrayList<>();
+        if (CollUtil.isNotEmpty(reports)) {
+            reports.forEach(report -> {
+                if (StrUtil.isNotBlank(report.getProductionStatus())) {
+                    IotRdDailyReportDetailDO reportDetail = new IotRdDailyReportDetailDO();
+                    reportDetail.setDeptId(report.getDeptId());
+                    reportDetail.setReportId(report.getId());
+                    reportDetail.setReportDate(report.getCreateTime());
+                    reportDetail.setStartTime(report.getStartTime());
+                    reportDetail.setEndTime(report.getEndTime());
+                    // 计算2个时间之前间隔的小时数
+                    reportDetail.setDuration(LocalTimeUtils.calculateDurationHours(report.getStartTime(), report.getEndTime()));
+                    reportDetail.setConstructionDetail(report.getProductionStatus());
+                    reportDetails.add(reportDetail);
+                }
+            });
+            if (CollUtil.isNotEmpty(reportDetails)) {
+                iotRdDailyReportDetailMapper.insertBatch(reportDetails);
+            }
+        }
+    }
+
+    /**
+     * 计算两个LocalTime之间的间隔小时数(处理空值、跨天情况)
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     * @return 间隔小时数(保留2位小数),空值返回0
+     */
+    private BigDecimal calculateDurationHours(LocalTime startTime, LocalTime endTime) {
+        // 处理空值情况:任意一个时间为空,返回0
+        if (startTime == null || endTime == null) {
+            return BigDecimal.ZERO;
+        }
+
+        // 计算时间间隔(秒)
+        long seconds;
+        if (endTime.isAfter(startTime)) {
+            // 正常情况:结束时间在开始时间之后
+            seconds = Duration.between(startTime, endTime).getSeconds();
+        } else {
+            // 跨天情况:结束时间在开始时间之前(如23:00到01:00)
+            // 先计算到当天结束的秒数,再加次日开始到结束时间的秒数
+            seconds = Duration.between(startTime, LocalTime.MAX).getSeconds() + 1; // 23:59:59到startTime的秒数+1秒=当天剩余秒数
+            seconds += Duration.between(LocalTime.MIN, endTime).getSeconds();     // 次日00:00到endTime的秒数
+        }
+
+        // 转换为小时数(秒数 / 3600),保留2位小数
+        BigDecimal hours = BigDecimal.valueOf(seconds).divide(BigDecimal.valueOf(3600), 2, BigDecimal.ROUND_HALF_UP);
+
+        return hours;
+    }
+
 }

+ 6 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrydailyreport/IotRyDailyReportService.java

@@ -192,4 +192,10 @@ public interface IotRyDailyReportService {
      */
     PageResult<IotRyDailyReportDO> wellReports(IotRyDailyReportPageReqVO pageReqVO);
 
+    /**
+     * 修复历史生产动态数据 生产动态明细拆分
+     *
+     * @return
+     */
+    void repairHistoryProdStatus();
 }

+ 31 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrydailyreport/IotRyDailyReportServiceImpl.java

@@ -33,6 +33,7 @@ import cn.iocoder.yudao.module.pms.dal.mysql.iotprojecttask.IotProjectTaskMapper
 import cn.iocoder.yudao.module.pms.dal.mysql.iotrydailyreport.IotRyDailyReportMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotrydailyreportdetail.IotRyDailyReportDetailMapper;
 import cn.iocoder.yudao.module.pms.message.PmsMessage;
+import cn.iocoder.yudao.module.pms.util.LocalTimeUtils;
 import cn.iocoder.yudao.module.supplier.enums.common.SupplierAuditStatusEnum;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
@@ -62,6 +63,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
@@ -1043,6 +1045,35 @@ public class IotRyDailyReportServiceImpl implements IotRyDailyReportService {
         return new PageResult<>(page.getRecords(), page.getTotal());
     }
 
+    @Override
+    public void repairHistoryProdStatus() {
+        // 修复历史生产动态数据 生产动态拆分明细后 需要把  productionStatus 值赋值到 明细表 rq_iot_ry_daily_report_detail
+        // 查询所有 日报数据 筛选出 production_status 有值的记录
+        IotRyDailyReportPageReqVO reqVO = new IotRyDailyReportPageReqVO();
+        List<IotRyDailyReportDO> reports = iotRyDailyReportMapper.dailyReports(reqVO);
+        List<IotRyDailyReportDetailDO> reportDetails = new ArrayList<>();
+        if (CollUtil.isNotEmpty(reports)) {
+            reports.forEach(report -> {
+                if (StrUtil.isNotBlank(report.getProductionStatus())) {
+                    IotRyDailyReportDetailDO reportDetail = new IotRyDailyReportDetailDO();
+                    reportDetail.setDeptId(report.getDeptId());
+                    reportDetail.setReportId(report.getId());
+                    reportDetail.setTaskId(report.getTaskId());
+                    reportDetail.setReportDate(report.getCreateTime());
+                    reportDetail.setStartTime(LocalTime.MIN);
+                    reportDetail.setEndTime(LocalTime.MAX);
+                    // 计算2个时间之前间隔的小时数
+                    reportDetail.setDuration(LocalTimeUtils.calculateDurationHours(LocalTime.MIN, LocalTime.MAX));
+                    reportDetail.setConstructionDetail(report.getProductionStatus());
+                    reportDetails.add(reportDetail);
+                }
+            });
+            if (CollUtil.isNotEmpty(reportDetails)) {
+                iotRyDailyReportDetailMapper.insertBatch(reportDetails);
+            }
+        }
+    }
+
     private List<IotDeviceDO> devices() {
         // 查询 瑞鹰158l 所有存在设备的队伍
         // 查询 瑞鹰 下所有部门

+ 37 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/util/LocalTimeUtils.java

@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.pms.util;
+
+import java.math.BigDecimal;
+import java.time.Duration;
+import java.time.LocalTime;
+
+public class LocalTimeUtils {
+    /**
+     * 计算两个LocalTime之间的间隔小时数(处理空值、跨天情况)
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     * @return 间隔小时数(保留2位小数),空值返回0
+     */
+    public static BigDecimal calculateDurationHours(LocalTime startTime, LocalTime endTime) {
+        // 处理空值情况:任意一个时间为空,返回0
+        if (startTime == null || endTime == null) {
+            return BigDecimal.ZERO;
+        }
+
+        // 计算时间间隔(秒)
+        long seconds;
+        if (endTime.isAfter(startTime)) {
+            // 正常情况:结束时间在开始时间之后
+            seconds = Duration.between(startTime, endTime).getSeconds();
+        } else {
+            // 跨天情况:结束时间在开始时间之前(如23:00到01:00)
+            // 先计算到当天结束的秒数,再加次日开始到结束时间的秒数
+            seconds = Duration.between(startTime, LocalTime.MAX).getSeconds() + 1; // 23:59:59到startTime的秒数+1秒=当天剩余秒数
+            seconds += Duration.between(LocalTime.MIN, endTime).getSeconds();     // 次日00:00到endTime的秒数
+        }
+
+        // 转换为小时数(秒数 / 3600),保留2位小数
+        BigDecimal hours = BigDecimal.valueOf(seconds).divide(BigDecimal.valueOf(3600), 2, BigDecimal.ROUND_HALF_UP);
+
+        return hours;
+    }
+}