Ver código fonte

pms 日报 功能优化

zhangcl 3 semanas atrás
pai
commit
b8fbba271f

+ 23 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/IotProjectTaskController.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
@@ -16,6 +17,7 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojectinfo.IotProjectInfoD
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO;
 import cn.iocoder.yudao.module.pms.service.iotprojectinfo.IotProjectInfoService;
 import cn.iocoder.yudao.module.pms.service.iotprojecttask.IotProjectTaskService;
+import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -101,7 +103,8 @@ public class IotProjectTaskController {
     public CommonResult<PageResult<IotProjectTaskRespVO>> getTaskList( IotProjectTaskPageReqVO pageReqVO) {
         Set<Long> idList = new HashSet<>();
         PageResult<IotProjectTaskDO> taskList = iotProjectTaskService.taskList(pageReqVO,idList);
-        // return success(BeanUtils.toBean(taskList, IotProjectTaskRespVO.class));
+        // 设置每个任务的施工队伍
+
         return success(new PageResult<>(buildProjectTaskList(taskList.getList()), taskList.getTotal()));
     }
 
@@ -111,6 +114,15 @@ public class IotProjectTaskController {
         }
         // 设备部门信息
         List<Long> projectIds = convertList(tasks, IotProjectTaskDO::getProjectId);
+        // 查询当前分页任务的关联 施工队伍信息
+        Set<Long> deptIds = new HashSet<>();
+        tasks.forEach(task -> {
+            if (CollUtil.isNotEmpty(task.getDeptIds())) {
+                deptIds.addAll(task.getDeptIds());
+            }
+        });
+        // 查询当前分布任务关联的施工队伍信息
+        Map<Long, DeptDO> deptMap = deptService.getDeptMap(deptIds);
         Map<Long, Long> projectDeptPair = new HashMap<>();
         if (CollUtil.isNotEmpty(projectIds)) {
             // 查询 任务 关联的项目信息
@@ -130,6 +142,16 @@ public class IotProjectTaskController {
             if (projectDeptPair.containsKey(taskVO.getProjectId())) {
                 taskVO.setProjectDeptId(projectDeptPair.get(taskVO.getProjectId()));
             }
+            // 设置施工队伍名称
+            if (CollUtil.isNotEmpty(taskVO.getDeptIds())) {
+                Set<String> deptNames = new HashSet<>();
+                taskVO.getDeptIds().forEach(deptId -> {
+                    if (deptMap.containsKey(deptId)) {
+                        deptNames.add(deptMap.get(deptId).getName());
+                    }
+                });
+                taskVO.setDeptNames(StrUtil.join(StrUtil.COMMA, deptNames));
+            }
         });
     }
 

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskRespVO.java

@@ -104,4 +104,7 @@ public class IotProjectTaskRespVO {
 
     @Schema(description = "任务扩展属性", example = "[{\"a\": 1},{\"b\": 2}]")
     private List<IotTaskAttrModelProperty> extProperty;
+
+    @Schema(description = "施工队伍", example = "THA1,THA2")
+    private String deptNames;
 }

+ 2 - 4
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrhdailyreport/IotRhDailyReportController.java

@@ -103,10 +103,7 @@ public class IotRhDailyReportController {
     public CommonResult<PageResult<IotRhDailyReportRespVO>> getIotRhDailyReportPage(@Valid IotRhDailyReportPageReqVO pageReqVO) {
         // 根据查询参数筛选出 符合条件 的记录id 再传入 颁布查询
         PageResult<IotRhDailyReportDO> pageResult = iotRhDailyReportService.getIotRhDailyReportPage(pageReqVO);
-
-        // List<IotRhDailyReportRespVO> rhDailyReports = IotRhDailyReportConvert.INSTANCE.convertList(pageResult.getList(), deptMap);
         return success(new PageResult<>(buildRhDailyReports(pageResult.getList()), pageResult.getTotal()));
-        // return success(new PageResult<>(rhDailyReports, pageResult.getTotal()));
     }
 
     @GetMapping("/dailyReportSummary")
@@ -177,7 +174,8 @@ public class IotRhDailyReportController {
                     }
                 });
             }
-            // 查询每个日报关联队伍中包含的 增压机 的产能
+            // 查询每个任务的搬迁安装天数
+
         });
         // 2. 拼接数据
         return BeanUtils.toBean(reports, IotRhDailyReportRespVO.class, (reportVO) -> {

+ 5 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrhdailyreport/vo/IotRhDailyReportSaveReqVO.java

@@ -97,4 +97,9 @@ public class IotRhDailyReportSaveReqVO {
     @Schema(description = "审批状态 未提交、审批中、审批通过、审批不通过、已取消", example = "1")
     private Integer auditStatus;
 
+    /**
+     * 扩展字段
+     */
+    @Schema(description = "运行记录工单创建日期")
+    private LocalDateTime fillOrderCreateTime;
 }

+ 4 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotrhdailyreport/IotRhDailyReportMapper.java

@@ -1,5 +1,7 @@
 package cn.iocoder.yudao.module.pms.dal.mysql.iotrhdailyreport;
 
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
 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;
@@ -97,12 +99,12 @@ public interface IotRhDailyReportMapper extends BaseMapperX<IotRhDailyReportDO>
      * @return 返回符合条件的瑞恒日报记录
      */
     default IotRhDailyReportDO selectExistReport(Long deptId, Long taskId, LocalDateTime dateTime) {
-        String dateStr = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        String dateStr = ObjUtil.isNotEmpty(dateTime) ? dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) : StrUtil.EMPTY;
         // 使用LambdaQueryWrapperX构建查询条件,根据传入的参数动态添加查询条件
         return selectOne(new LambdaQueryWrapperX<IotRhDailyReportDO>()
                 .eqIfPresent(IotRhDailyReportDO::getDeptId, deptId)
                 .eqIfPresent(IotRhDailyReportDO::getTaskId, taskId)
-                .apply("DATE(create_time) = {0}", dateStr));
+                .apply(StrUtil.isNotBlank(dateStr), "DATE(create_time) = {0}", dateStr));
     }
 
 }

+ 136 - 8
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrhdailyreport/IotRhDailyReportServiceImpl.java

@@ -20,7 +20,6 @@ import cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill.IotOpeationFillMapp
 import cn.iocoder.yudao.module.pms.dal.mysql.iotprojecttask.IotProjectTaskMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotrhdailyreport.IotRhDailyReportMapper;
 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
-import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import cn.iocoder.yudao.module.system.service.dict.DictDataService;
@@ -35,6 +34,7 @@ import javax.annotation.Resource;
 import java.lang.reflect.Type;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.Duration;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicReference;
@@ -131,7 +131,7 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
             }
 
             // 查询当前日报所属任务关联的设备 更新设备状态
-            if (CollUtil.isNotEmpty(deviceIds)) {
+            /* if (CollUtil.isNotEmpty(deviceIds)) {
                 // 查询当前任务下关联的所有设备
                 IotDevicePageReqVO deviceReqVO = new IotDevicePageReqVO();
                 // deviceReqVO.setDeptId(createReqVO.getDeptId());
@@ -169,10 +169,34 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
                     });
                     iotDeviceMapper.updateBatch(devices);
                 }
-            }
+            } */
+
+            // 根据历史当前小队历史的日报 计算 搬迁安装天数 (开工日期 - 搬迁日期)
+            // 暂时无法通过列表计算搬迁安装天数(因为需要按照任务分组同时查询当前分页所有日报的 开工日期 搬迁日期)
+            /* IotRhDailyReportPageReqVO reportReqVO = new IotRhDailyReportPageReqVO();
+            reportReqVO.setTaskId(taskId);
+            List<IotRhDailyReportDO> groupedReports = iotRhDailyReportMapper.selectListGrouped(reportReqVO);
+            // 将当前日报也添加到 集合groupedReports中 共同筛选开工日期 搬迁日期
+            AtomicReference<LocalDateTime> moveDate = new AtomicReference<>();
+            AtomicReference<LocalDateTime> commencementDate = new AtomicReference<>();
+            // 先当前更新的日报的 施工状态
+            if (CollUtil.isNotEmpty(groupedReports)) {
+                groupedReports.forEach(report -> {
+                    // 施工状态 数据字典 constructionStatus 施工3  动迁1
+                    if (3 == report.getConstructionStatus()) {
+                        commencementDate.set(report.getConstructionStartDate());
+                    }
+                    if (1 == report.getConstructionStatus()) {
+                        moveDate.set(report.getConstructionStartDate());
+                    }
+                });
+            } */
+
+            AtomicReference<LocalDateTime> moveDate = new AtomicReference<>();
+            AtomicReference<LocalDateTime> commencementDate = new AtomicReference<>();
 
             // 当天如果已经有此小队的记录 新增 当天如果没有此小队的日报记录 修改
-            // deptId - taskId - createTime(yyyy-MM-dd) 确定唯一一条记录
+            // deptId - taskId - createTime(yyyy-MM-dd) 确定唯一一条记录 不能使用 LocalDateTime.now() 来查询,应该使用 运行记录工单的日期查询
             IotRhDailyReportDO existReport = iotRhDailyReportMapper.selectExistReport(createReqVO.getDeptId(), taskId, LocalDateTime.now());
             if (ObjUtil.isEmpty(existReport)) {
                 // 设置任务时间范围 昨天下午4点到今天下午4点
@@ -184,11 +208,118 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
                 LocalDateTime yesterday4pm = today4pm.minusDays(1);
                 iotRhDailyReport.setConstructionStartDate(yesterday4pm);
                 iotRhDailyReport.setConstructionEndDate(today4pm);
-
+                // 查询当前日报状态 是否是 施工 或 搬迁
+                if (3 == iotRhDailyReport.getConstructionStatus()) {
+                    commencementDate.set(yesterday4pm);
+                }
+                if (1 == iotRhDailyReport.getConstructionStatus()) {
+                    moveDate.set(yesterday4pm);
+                }
+                // 历史日报数据
+                // 根据历史当前小队历史的日报 计算 搬迁安装天数 (开工日期 - 搬迁日期)
+                // 暂时无法通过列表计算搬迁安装天数(因为需要按照任务分组同时查询当前分页所有日报的 开工日期 搬迁日期)
+                IotRhDailyReportPageReqVO reportReqVO = new IotRhDailyReportPageReqVO();
+                reportReqVO.setTaskId(taskId);
+                List<IotRhDailyReportDO> groupedReports = iotRhDailyReportMapper.selectListGrouped(reportReqVO);
+                // 将当前日报也添加到 集合groupedReports中 共同筛选开工日期 搬迁日期
+                // AtomicReference<LocalDateTime> moveDate = new AtomicReference<>();
+                // AtomicReference<LocalDateTime> commencementDate = new AtomicReference<>();
+                // 先当前更新的日报的 施工状态
+                if (CollUtil.isNotEmpty(groupedReports)) {
+                    groupedReports.forEach(report -> {
+                        // 施工状态 数据字典 constructionStatus 施工3  动迁1
+                        if (3 == report.getConstructionStatus()) {
+                            commencementDate.set(report.getConstructionStartDate());
+                        }
+                        if (1 == report.getConstructionStatus()) {
+                            moveDate.set(report.getConstructionStartDate());
+                        }
+                    });
+                }
+                // 开工日期 搬迁日期 都存在 才能计算 搬迁安装天数
+                if (ObjUtil.isNotEmpty(commencementDate.get()) && ObjUtil.isNotEmpty(moveDate.get())) {
+                    LocalDateTime start = moveDate.get();    // 搬迁日期
+                    LocalDateTime end = commencementDate.get(); // 开工日期(晚于搬迁日期)
+                    // 计算时间差(Duration.between 接受 start 和 end 参数)
+                    Duration duration = Duration.between(start, end);
+                    // 获取总秒数(long类型)
+                    long totalSeconds = duration.getSeconds();
+                    // 计算总天数(包括小数部分):总秒数除以一天的秒数(24 * 3600)
+                    double totalDays = totalSeconds / (24.0 * 3600.0);
+                    iotRhDailyReport.setRelocationDays(new BigDecimal(totalDays));
+                }
                 iotRhDailyReportMapper.insert(iotRhDailyReport);
             } else {
                 // 修改现有记录
                 iotRhDailyReport.setId(existReport.getId());
+                // constructionStartDate constructionEndDate 不可修改 取数据库中已经保存的值
+                /* if (3 == iotRhDailyReport.getConstructionStatus()) {
+                    commencementDate.set(iotRhDailyReport.getConstructionStartDate());
+                }
+                if (1 == iotRhDailyReport.getConstructionStatus()) {
+                    moveDate.set(iotRhDailyReport.getConstructionStartDate());
+                } */
+                // 历史日报数据
+                // 根据历史当前小队历史的日报 计算 搬迁安装天数 (开工日期 - 搬迁日期)
+                // 暂时无法通过列表计算搬迁安装天数(因为需要按照任务分组同时查询当前分页所有日报的 开工日期 搬迁日期)
+                /* IotRhDailyReportPageReqVO reportReqVO = new IotRhDailyReportPageReqVO();
+                reportReqVO.setTaskId(taskId);
+                List<IotRhDailyReportDO> groupedReports = iotRhDailyReportMapper.selectListGrouped(reportReqVO); */
+                // 将当前日报也添加到 集合groupedReports中 共同筛选开工日期 搬迁日期
+                // AtomicReference<LocalDateTime> moveDate = new AtomicReference<>();
+                // AtomicReference<LocalDateTime> commencementDate = new AtomicReference<>();
+                // 先当前更新的日报的 施工状态
+                /* if (CollUtil.isNotEmpty(groupedReports)) {
+                    groupedReports.forEach(report -> {
+                        // 施工状态 数据字典 constructionStatus 施工3  动迁1
+                        if (3 == report.getConstructionStatus()) {
+                            commencementDate.set(report.getConstructionStartDate());
+                        }
+                        if (1 == report.getConstructionStatus()) {
+                            moveDate.set(report.getConstructionStartDate());
+                        }
+                    });
+                } */
+                // 开工日期 搬迁日期 都存在 才能计算 搬迁安装天数
+                /* if (ObjUtil.isNotEmpty(commencementDate.get()) && ObjUtil.isNotEmpty(moveDate.get())) {
+                    LocalDateTime start = moveDate.get();    // 搬迁日期
+                    LocalDateTime end = commencementDate.get(); // 开工日期(晚于搬迁日期)
+                    // 计算时间差(Duration.between 接受 start 和 end 参数)
+                    Duration duration = Duration.between(start, end);
+                    // 获取总秒数(long类型)
+                    long totalSeconds = duration.getSeconds();
+                    // 计算总天数(包括小数部分):总秒数除以一天的秒数(24 * 3600)
+                    double totalDays = totalSeconds / (24.0 * 3600.0);
+                    iotRhDailyReport.setRelocationDays(new BigDecimal(totalDays));
+                } */
+                iotRhDailyReportMapper.updateById(iotRhDailyReport);
+                // 更新后再查询就是最新的值
+                IotRhDailyReportPageReqVO reportReqVO = new IotRhDailyReportPageReqVO();
+                reportReqVO.setTaskId(taskId);
+                List<IotRhDailyReportDO> groupedReports = iotRhDailyReportMapper.selectListGrouped(reportReqVO);
+                if (CollUtil.isNotEmpty(groupedReports)) {
+                    groupedReports.forEach(report -> {
+                        // 施工状态 数据字典 constructionStatus 施工3  动迁1
+                        if (3 == report.getConstructionStatus()) {
+                            commencementDate.set(report.getConstructionStartDate());
+                        }
+                        if (1 == report.getConstructionStatus()) {
+                            moveDate.set(report.getConstructionStartDate());
+                        }
+                    });
+                }
+                // 开工日期 搬迁日期 都存在 才能计算 搬迁安装天数
+                if (ObjUtil.isNotEmpty(commencementDate.get()) && ObjUtil.isNotEmpty(moveDate.get())) {
+                    LocalDateTime start = moveDate.get();    // 搬迁日期
+                    LocalDateTime end = commencementDate.get(); // 开工日期(晚于搬迁日期)
+                    // 计算时间差(Duration.between 接受 start 和 end 参数)
+                    Duration duration = Duration.between(start, end);
+                    // 获取总秒数(long类型)
+                    long totalSeconds = duration.getSeconds();
+                    // 计算总天数(包括小数部分):总秒数除以一天的秒数(24 * 3600)
+                    double totalDays = totalSeconds / (24.0 * 3600.0);
+                    iotRhDailyReport.setRelocationDays(new BigDecimal(totalDays));
+                }
                 iotRhDailyReportMapper.updateById(iotRhDailyReport);
             }
         }
@@ -306,9 +437,6 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
         IotRhDailyReportPageReqVO reportReqVO = new IotRhDailyReportPageReqVO();
         reportReqVO.setTaskId(reqVO.getTaskId());
         List<IotRhDailyReportDO> dailyReports = iotRhDailyReportMapper.selectListGrouped(reportReqVO);
-        if (CollUtil.isNotEmpty(dailyReports)) {
-
-        }
         return dailyReports;
     }
 

+ 17 - 7
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/iotprojecttask/IotProjectTaskMapper.xml

@@ -2,14 +2,24 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.iocoder.yudao.module.pms.dal.mysql.iotprojecttask.IotProjectTaskMapper">
 
-    <!--
-        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
-        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
-        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
-        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
-     -->
+    <resultMap id="IotProjectTaskResultMap" type="cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO">
+        <id column="id" property="id" />
+        <result column="project_id" property="projectId" />
+        <result column="well_name" property="wellName" />
+        <result column="well_type" property="wellType" />
+        <result column="location" property="location" />
+        <result column="technique" property="technique" />
+        <result column="workload_design" property="workloadDesign" />
+        <result column="create_time" property="createTime" />
+        <result column="dept_ids" property="deptIds" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
+        <result column="remark" property="remark" />
+        <result column="manufacture_name" property="manufactureName" />
+        <result column="contract_name" property="contractName" />
+        <result column="contract_code" property="contractCode" />
+    </resultMap>
+
     <select id="taskList" parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskPageReqVO"
-    resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO">
+    resultMap="IotProjectTaskResultMap">
         select
         a.id,
         a.project_id,