Browse Source

pms 瑞恒日报 汇总页面等功能优化 施工周期 筛选完工的任务

zhangcl 1 day ago
parent
commit
40fc98fb83

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

@@ -315,39 +315,7 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
         Map<Long, String> taskTechniquePair = new HashMap<>();
         // key任务id   value任务的施工周期天数
         Map<Long, String> taskPeriodPair = new HashMap<>();
-        // 查询所有日报关联任务的施工周期
-        List<IotRdDailyReportTaskPeriodVO> taskPeriods = iotRdDailyReportMapper.taskConstructionPeriod();
-        if (CollUtil.isNotEmpty(taskPeriods)) {
-            // 定义日期格式化器,匹配"yyyy-MM-dd HH:mm:ss"格式
-            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-            taskPeriods.forEach(period -> {
-                // 如果 startDate endDate 都存在 计算施工周期天数
-                if (StrUtil.isNotBlank(period.getStartDate()) && StrUtil.isNotBlank(period.getEndDate())) {
-                    // 计算 startDate endDate 之间的差值
-                    try {
-                        // 1. 解析日期字符串为LocalDateTime
-                        LocalDateTime startLdt = LocalDateTime.parse(period.getStartDate(), dtf);
-                        LocalDateTime endLdt = LocalDateTime.parse(period.getEndDate(), dtf);
 
-                        // 2. 截断时分秒,仅保留日期部分
-                        LocalDate startDate = startLdt.toLocalDate();
-                        LocalDate endDate = endLdt.toLocalDate();
-
-                        // 3. 计算日期差值(天),+1满足「同一天算1天」的规则
-                        long daysDiff = ChronoUnit.DAYS.between(startDate, endDate);
-                        long constructionDays = daysDiff + 1;
-
-                        // 4. 存入任务-施工周期映射(key=任务ID,value=天数字符串)
-                        taskPeriodPair.put(period.getTaskId(), String.valueOf(constructionDays));
-                    } catch (Exception e) {
-                        // 解析失败时默认周期为1天(可根据业务调整,也可记录日志)
-                        taskPeriodPair.put(period.getTaskId(), "1");
-                        // 可选:添加日志打印
-                        // log.error("解析任务施工周期日期失败,taskId={}, startDate={}, endDate={}", period.getTaskId(), period.getStartDate(), period.getEndDate(), e);
-                    }
-                }
-            });
-        }
         if (CollUtil.isNotEmpty(dailyReports)) {
             // 遍历日报 找到每个日报关联的任务的 施工队伍
             List<Long> taskIds = convertList(dailyReports, IotRdDailyReportDO::getTaskId);
@@ -418,6 +386,46 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
                     }
                 });
             }
+
+            // 查询所有日报关联任务的施工周期
+            List<IotRdDailyReportTaskPeriodVO> taskPeriods = iotRdDailyReportMapper.taskConstructionPeriod();
+            if (CollUtil.isNotEmpty(taskPeriods)) {
+                // 定义日期格式化器,匹配"yyyy-MM-dd HH:mm:ss"格式
+                DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                taskPeriods.forEach(period -> {
+                    // 如果 startDate endDate 都存在 计算施工周期天数 考虑到日报审批后才会更新任务状态
+                    // 所以计算任务施工周期时 要筛选出施工完成的任务
+                    String taskStatus = StrUtil.EMPTY;
+                    if (taskStatusPair.containsKey(period.getTaskId())) {
+                        taskStatus = taskStatusPair.get(period.getTaskId());
+                    }
+                    if (StrUtil.isNotBlank(period.getStartDate()) && StrUtil.isNotBlank(period.getEndDate()) && "wg".equals(taskStatus)) {
+                        // 计算 startDate endDate 之间的差值
+                        try {
+                            // 1. 解析日期字符串为LocalDateTime
+                            LocalDateTime startLdt = LocalDateTime.parse(period.getStartDate(), dtf);
+                            LocalDateTime endLdt = LocalDateTime.parse(period.getEndDate(), dtf);
+
+                            // 2. 截断时分秒,仅保留日期部分
+                            LocalDate startDate = startLdt.toLocalDate();
+                            LocalDate endDate = endLdt.toLocalDate();
+
+                            // 3. 计算日期差值(天),+1满足「同一天算1天」的规则
+                            long daysDiff = ChronoUnit.DAYS.between(startDate, endDate);
+                            long constructionDays = daysDiff + 1;
+
+                            // 4. 存入任务-施工周期映射(key=任务ID,value=天数字符串)
+                            taskPeriodPair.put(period.getTaskId(), String.valueOf(constructionDays));
+                        } catch (Exception e) {
+                            // 解析失败时默认周期为1天(可根据业务调整,也可记录日志)
+                            taskPeriodPair.put(period.getTaskId(), "1");
+                            // 可选:添加日志打印
+                            // log.error("解析任务施工周期日期失败,taskId={}, startDate={}, endDate={}", period.getTaskId(), period.getStartDate(), period.getEndDate(), e);
+                        }
+                    }
+                });
+            }
+
             // 设置 小队 任务已经完成的工作量集合 (按照不同的单位统计任务的不同工作量)
             // key任务井id      value队伍工作量数据
             Map<Long, BigDecimal> bridgePlugPair = new HashMap<>();