Przeglądaj źródła

pms 瑞恒日报 汇总页面等功能优化

zhangcl 2 dni temu
rodzic
commit
760a32ce76

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

@@ -41,6 +41,14 @@ public class IotRdDailyReportStatisticsRespVO {
     @ExcelProperty("井号")
     private String wellName;
 
+    @Schema(description = "施工周期 天")
+    @ExcelProperty("施工周期 天")
+    private String period;
+
+    @Schema(description = "施工状态")
+    @ExcelProperty("施工状态")
+    private String rdStatus;
+
     @Schema(description = "施工工艺 多个逗号分隔")
     @ExcelProperty("施工工艺")
     private String techniques;

+ 18 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreport/vo/IotRdDailyReportTaskPeriodVO.java

@@ -0,0 +1,18 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 瑞都日报 任务施工周期 Response VO")
+@Data
+public class IotRdDailyReportTaskPeriodVO {
+
+    @Schema(description = "任务id", example = "123")
+    private Long taskId;
+
+    @Schema(description = "工作量", example = "2")
+    private String startDate;
+
+    @Schema(description = "单位")
+    private String endDate;
+}

+ 7 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotrddailyreport/IotRdDailyReportMapper.java

@@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportTaskPeriodVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotrddailyreport.IotRdDailyReportDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -172,4 +173,10 @@ public interface IotRdDailyReportMapper extends BaseMapperX<IotRdDailyReportDO>
      * @param reqVO 查询条件
      */
     List<IotRdDailyReportDO> selectListGrouped(@Param("reqVO") IotRdDailyReportPageReqVO reqVO);
+
+    /**
+     * 瑞都日报 关联的任务 施工周期
+     */
+    List<IotRdDailyReportTaskPeriodVO> taskConstructionPeriod();
+
 }

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

@@ -8,10 +8,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotattachment.vo.IotAttachmentSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojectinfo.vo.IotProjectInfoPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskPageReqVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportPageReqVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportSaveReqVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportStatisticsItemVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportStatisticsRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.*;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotattachment.IotAttachmentDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojectinfo.IotProjectInfoDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO;
@@ -34,6 +31,10 @@ import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -304,12 +305,49 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
         Map<Long, String> projectPair = new HashMap<>();
         //  key任务id     value任务井号
         Map<Long, String> taskPair = new HashMap<>();
+        //  key任务id     value任务施工状态
+        Map<Long, String> taskStatusPair = new HashMap<>();
         //  施工工艺 key字典键值     value字典标签
         Map<String, String> techniqueDictPair = new HashMap<>();
         //  key任务id     value任务工作量
         Map<Long, BigDecimal> taskWorkloadPair = new HashMap<>();
         //  key任务id     value任务工艺名称
         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);
@@ -371,6 +409,7 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
             if (CollUtil.isNotEmpty(tasks)) {
                 tasks.forEach(task -> {
                     taskPair.put(task.getId(), task.getWellName());
+                    taskStatusPair.put(task.getId(), task.getStatus());
                     // 获取所有任务的工作量数据
                     taskWorkloadPair.put(task.getId(), new BigDecimal(task.getWorkloadDesign()));
                     if (techniqueDictPair.containsKey(task.getTechnique())) {
@@ -525,6 +564,7 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
                     /* if (teamDeptPair.containsKey(deptId)) {
                         uniqueReport.setDeptName(teamDeptPair.get(deptId));
                     } */
+                    uniqueReport.setTaskId(taskId);
                     if (taskDeptNamePair.containsKey(taskId)) {
                         uniqueReport.setDeptName(taskDeptNamePair.get(taskId));
                     }
@@ -543,6 +583,12 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
                     if (taskPair.containsKey(taskId)) {
                         uniqueReport.setWellName(taskPair.get(taskId));
                     }
+                    if (taskPeriodPair.containsKey(taskId)) {
+                        uniqueReport.setPeriod(taskPeriodPair.get(taskId));
+                    }
+                    if (taskStatusPair.containsKey(taskId)) {
+                        uniqueReport.setRdStatus(taskStatusPair.get(taskId));
+                    }
                     if (taskTechniquePair.containsKey(taskId)) {
                         uniqueReport.setTechniques(taskTechniquePair.get(taskId));
                     }

+ 10 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/iotprojecttask/IotRdDailyReportMapper.xml

@@ -81,4 +81,14 @@
         ORDER BY g.min_start_date ASC
     </select>
 
+    <select id="taskConstructionPeriod" resultType="cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportTaskPeriodVO">
+        SELECT
+            task_id taskId,
+            MIN(construction_start_date) AS startDate,
+            MIN(CASE WHEN rd_status = 'wg' THEN construction_start_date ELSE NULL END) AS endDate
+        FROM rq_iot_rd_daily_report
+        WHERE deleted = b'0'
+        GROUP BY task_id;
+    </select>
+
 </mapper>