Jelajahi Sumber

pms 瑞鹰 日报列表 计算字段

zhangcl 2 minggu lalu
induk
melakukan
94a109109b

+ 1 - 0
yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ErrorCodeConstant.java

@@ -90,4 +90,5 @@ public interface ErrorCodeConstant{
     ErrorCode IOT_RH_DAILY_REPORT_NO_DATE = new ErrorCode(265, "未传递运行记录生成日期");
     ErrorCode IOT_RH_DAILY_REPORT_NO_DEPT = new ErrorCode(266, "未传递运行记录所属部门");
     ErrorCode IOT_RY_DAILY_REPORT_NOT_EXISTS = new ErrorCode(267, "瑞鹰日报不存在");
+    ErrorCode IOT_RY_DAILY_REPORT_CURRENT_DEPTH_NOT_EXISTS = new ErrorCode(268, "未传递运行记录当前井深");
 }

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

@@ -14,6 +14,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProject
 import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportTaskCountVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojectinfo.IotProjectInfoDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotTaskAttrModelProperty;
@@ -35,6 +36,7 @@ import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -124,6 +126,12 @@ public class IotRyDailyReportController {
         Map<Long, String> taskWellStructPair = new HashMap<>();
         // key部门id  value设备型号编号
         AtomicReference<Map<Long, String>> equipmentTypePair = new AtomicReference<>(new HashMap<>());
+        // key施工队伍id    value最近完工日期
+        Map<Long, LocalDateTime> latestWellDoneTimePair = new HashMap<>();
+        // key施工队伍id    value施工井数量
+        Map<Long, Integer> totalTasksPair = new HashMap<>();
+        // key施工队伍id    value完工井数量
+        Map<Long, Integer> completedTasksPair = new HashMap<>();
         DataPermissionUtils.executeIgnore(() -> {
             // 查询日报关联的项目信息
             IotProjectInfoPageReqVO reqVO = new IotProjectInfoPageReqVO();
@@ -159,6 +167,21 @@ public class IotRyDailyReportController {
             }
             // 查询当前日报所属施工队伍中包含 井架 的型号
             equipmentTypePair.set(iotRyDailyReportService.queryEquipmentType(convertList(reports, IotRyDailyReportDO::getDeptId)));
+            // 查询当前日报所属部门的 上井次完井时间 已经绑定任务的情况下
+            List<IotRyDailyReportDO> latestWellDoneTimes = iotRyDailyReportService.latestWellDoneTimes(null);
+            if (CollUtil.isNotEmpty(latestWellDoneTimes)) {
+                latestWellDoneTimes.forEach(time -> {
+                    latestWellDoneTimePair.put(time.getDeptId(), time.getConstructionStartDate());
+                });
+            }
+            // 按施工队伍统计 施工井数 完工井数
+            List<IotRyDailyReportTaskCountVO> deptTasks = iotRyDailyReportService.countTasksByDept();
+            if (CollUtil.isNotEmpty(deptTasks)) {
+                deptTasks.forEach(task -> {
+                    totalTasksPair.put(task.getDeptId(), task.getTotalTaskCount());
+                    completedTasksPair.put(task.getDeptId(), task.getCompletedTaskCount());
+                });
+            }
         });
         // 2. 拼接数据
         return BeanUtils.toBean(reports, IotRyDailyReportRespVO.class, (reportVO) -> {
@@ -174,6 +197,11 @@ public class IotRyDailyReportController {
             findAndThen(taskWellStructPair, reportVO.getTaskId(), wellStruct -> reportVO.setDesignWellStruct(wellStruct));
             // 2.6 设备型号
             findAndThen(equipmentTypePair.get(), reportVO.getDeptId(), equipmentType -> reportVO.setEquipmentType(equipmentType));
+            // 2.7 上井次完井时间
+            findAndThen(latestWellDoneTimePair, reportVO.getDeptId(), latestWellDoneTime -> reportVO.setLatestWellDoneTime(latestWellDoneTime));
+            // 2.8 总施工井数 完工井数
+            findAndThen(totalTasksPair, reportVO.getDeptId(), totalTaskCount -> reportVO.setTotalConstructionWells(totalTaskCount));
+            findAndThen(completedTasksPair, reportVO.getDeptId(), completedTaskCount -> reportVO.setCompletedWells(completedTaskCount));
         });
     }
 

+ 21 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrydailyreport/vo/IotRyDailyReportTaskCountVO.java

@@ -0,0 +1,21 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 瑞鹰日报 统计施工井数 完工井数 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotRyDailyReportTaskCountVO {
+
+    @Schema(description = "施工井数", example = "15")
+    private Integer totalTaskCount;
+
+    @Schema(description = "施工队伍id", example = "29285")
+    private Long deptId;
+
+    @Schema(description = "完工井数", example = "23")
+    private Integer completedTaskCount;
+
+}

+ 78 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotrydailyreport/IotRyDailyReportMapper.java

@@ -6,13 +6,17 @@ 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.iotrydailyreport.vo.IotRyDailyReportPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportTaskCountVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotrydailyreport.IotRyDailyReportDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 瑞鹰日报 Mapper
@@ -58,7 +62,8 @@ public interface IotRyDailyReportMapper extends BaseMapperX<IotRyDailyReportDO>
                 .eqIfPresent(IotRyDailyReportDO::getProcessInstanceId, reqVO.getProcessInstanceId())
                 .eqIfPresent(IotRyDailyReportDO::getAuditStatus, reqVO.getAuditStatus())
                 .betweenIfPresent(IotRyDailyReportDO::getCreateTime, reqVO.getCreateTime())
-                .orderByDesc(IotRyDailyReportDO::getId));
+                .orderByDesc(IotRyDailyReportDO::getCreateTime)
+                .orderByAsc(IotRyDailyReportDO::getId));
     }
 
     /**
@@ -88,10 +93,11 @@ public interface IotRyDailyReportMapper extends BaseMapperX<IotRyDailyReportDO>
      * @return 最新日报记录
      */
     default IotRyDailyReportDO selectLatestReportBeforeDate(Long deptId, Long taskId, LocalDateTime dateTime) {
+        String dateStr = dateTime != null ? dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) : "";
         return selectOne(new LambdaQueryWrapperX<IotRyDailyReportDO>()
                 .eqIfPresent(IotRyDailyReportDO::getDeptId, deptId)
                 .eqIfPresent(IotRyDailyReportDO::getTaskId, taskId)
-                .lt(IotRyDailyReportDO::getCreateTime, dateTime)
+                .apply(StrUtil.isNotBlank(dateStr), "DATE(create_time) < {0}", dateStr)
                 .orderByDesc(IotRyDailyReportDO::getCreateTime)
                 .last("limit 1"));
     }
@@ -104,4 +110,74 @@ public interface IotRyDailyReportMapper extends BaseMapperX<IotRyDailyReportDO>
      */
     List<IotRyDailyReportDO> selectListGrouped(@Param("reqVO") IotRyDailyReportPageReqVO reqVO);
 
+    /**
+     * 查询每个施工队伍的 上井次完井时间
+     * @param reqVO
+     * @return
+     */
+    List<IotRyDailyReportDO> latestWellDoneTimes(@Param("reqVO") IotRyDailyReportPageReqVO reqVO);
+
+    /**
+     * 查询指定部门、指定时间段 填写的日报记录的 ’月进尺数据‘(逻辑细则:reportDate 所在的月份与数据表的字段 construction_start_date
+     * 所在的月份相匹配 且 create_time < reportDate 的记录的 ’daily_footage‘ 字段值累加计算得出
+     * @param deptId
+     * @param reportDate
+     * @return
+     */
+    default BigDecimal monthlyFootages(Long deptId, LocalDateTime reportDate) {
+        if (reportDate == null) {
+            return BigDecimal.ZERO;
+        }
+
+        int year = reportDate.getYear();
+        int month = reportDate.getMonthValue();
+
+        List<IotRyDailyReportDO> list = selectList(new LambdaQueryWrapperX<IotRyDailyReportDO>()
+                .eq(ObjUtil.isNotNull(deptId), IotRyDailyReportDO::getDeptId, deptId)
+                .lt(IotRyDailyReportDO::getCreateTime, reportDate)
+                .apply("YEAR(construction_start_date) = {0}", year)
+                .apply("MONTH(construction_start_date) = {0}", month));
+
+        return list.stream()
+                .map(IotRyDailyReportDO::getDailyFootage)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+    }
+
+    /**
+     * 查询每个施工队伍的 历史 年进尺
+     * @param deptId 部门ID
+     * @param reportDate 报告日期
+     * @return 年进尺总和
+     */
+    default BigDecimal annualFootages(Long deptId, LocalDateTime reportDate) {
+        if (reportDate == null) {
+            return BigDecimal.ZERO;
+        }
+
+        int year = reportDate.getYear();
+
+        List<IotRyDailyReportDO> list = selectList(new LambdaQueryWrapperX<IotRyDailyReportDO>()
+                .eq(ObjUtil.isNotNull(deptId), IotRyDailyReportDO::getDeptId, deptId)
+                .lt(IotRyDailyReportDO::getCreateTime, reportDate)
+                .apply("YEAR(construction_start_date) = {0}", year));
+
+        return list.stream()
+                .map(IotRyDailyReportDO::getDailyFootage)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+    }
+
+    /**
+     * 按部门统计任务数量
+     * @return 部门任务统计列表
+     */
+    @Select("SELECT " +
+            "dept_id as deptId, " +
+            "COUNT(DISTINCT CASE WHEN task_id IS NOT NULL THEN task_id END) as totalTaskCount, " +
+            "COUNT(DISTINCT CASE WHEN rig_status = 12 AND task_id IS NOT NULL THEN task_id END) as completedTaskCount " +
+            "FROM rq_iot_ry_daily_report " +
+            "WHERE deleted = 0 " +
+            "GROUP BY dept_id")
+    List<IotRyDailyReportTaskCountVO> countTasksByDept();
 }

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

@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.pms.service.iotrydailyreport;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportTaskCountVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotrydailyreport.IotRyDailyReportDO;
 
 import javax.validation.Valid;
@@ -61,4 +62,19 @@ public interface IotRyDailyReportService {
      * @return 增压机 产能 集合
      */
     Map<Long, String> queryEquipmentType(List<Long> deptIds);
+
+    /**
+     * 查询每个任务的搬迁安装天数
+     *
+     * @param reqVO taskId
+     * @return 每个任务的搬迁安装天数
+     */
+    List<IotRyDailyReportDO> latestWellDoneTimes(IotRyDailyReportPageReqVO reqVO);
+
+    /**
+     * 按部门统计任务数量
+     *
+     * @return 按部门统计任务数量
+     */
+    List<IotRyDailyReportTaskCountVO> countTasksByDept();
 }

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

@@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotdevicecategorytemplateatt
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportTaskCountVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO;
@@ -63,6 +64,9 @@ public class IotRyDailyReportServiceImpl implements IotRyDailyReportService {
         if (ObjUtil.isEmpty(createReqVO.getDeptId())) {
             throw exception(IOT_RH_DAILY_REPORT_NO_DEPT);
         }
+        if (ObjUtil.isEmpty(createReqVO.getCurrentDepth())) {
+            throw exception(IOT_RY_DAILY_REPORT_CURRENT_DEPTH_NOT_EXISTS);
+        }
 
         // 根据日报的 施工队伍 deptId 查询队伍所在的 项目 任务
         // 根据日报的施工状态 更新 对应任务的 状态
@@ -91,18 +95,34 @@ public class IotRyDailyReportServiceImpl implements IotRyDailyReportService {
             // throw exception(IOT_PROJECT_TASK_NOT_RELATED);
         }
 
+        // 计算月进尺 年累计进尺 reportDate对应的前一天的 年-月份 对应的日报记录日进尺的累加值
+        // 查询指定部门、指定时间段 填写的日报记录的 ’月进尺数据‘(逻辑细则:reportDate 所在的月份与数据表的字段 construction_start_date
+        // 所在的月份相匹配 且 create_time < reportDate 的记录的 ’daily_footage‘ 字段值累加计算得出
+        BigDecimal historyMonthlyFootage = iotRyDailyReportMapper.monthlyFootages(createReqVO.getDeptId(), reportDate);
+
+        // 查询指定部门、指定时间段 填写的日报记录的 ’月进尺数据‘(逻辑细则:reportDate 所在的月份与数据表的字段 construction_start_date
+        // 所在的月份相匹配 且 create_time < reportDate 的记录的 ’daily_footage‘ 字段值累加计算得出
+        BigDecimal historyAnnualFootage = iotRyDailyReportMapper.annualFootages(createReqVO.getDeptId(), reportDate);
+
         // 当前井深 计算 日进尺 月进尺 年累计进尺
         // (当前井深 - 前一天日报中填写的 ‘当前井深’)= 日进尺
         // 将 reportDate 减去1天 得到日期 date(yyyy-MM-dd) 查询date对应的日报记录
         IotRyDailyReportDO lastReport = iotRyDailyReportMapper.selectLatestReportBeforeDate(
-                createReqVO.getDeptId(), taskId, reportDate);
+                createReqVO.getDeptId(), null, reportDate);
         if (ObjUtil.isNotEmpty(lastReport) && ObjUtil.isNotEmpty(lastReport.getCurrentDepth())) {
-            // 当前井深 - 前一天日报的当前井深 = 日进尺
+            // 当前井深-前一天日报的当前井深 = 日进尺
             BigDecimal dailyFootage = createReqVO.getCurrentDepth().subtract(lastReport.getCurrentDepth());
             iotRyDailyReport.setDailyFootage(dailyFootage);
+            // 日进尺+历史的当前月进尺 = 总的月进尺
+            iotRyDailyReport.setMonthlyFootage(dailyFootage.add(historyMonthlyFootage));
+            // 日进尺+历史的当前年进尺 = 总的年进尺
+            iotRyDailyReport.setAnnualFootage(dailyFootage.add(historyAnnualFootage));
         } else {
             // 如果没有查询到数据 则当前井深 就是日进尺
             iotRyDailyReport.setDailyFootage(createReqVO.getCurrentDepth());
+            iotRyDailyReport.setMonthlyFootage(createReqVO.getCurrentDepth().add(historyMonthlyFootage));
+            // 日进尺+历史的当前年进尺 = 总的年进尺
+            iotRyDailyReport.setAnnualFootage(createReqVO.getCurrentDepth().add(historyAnnualFootage));
         }
 
         // 当天如果已经有此小队的记录 新增 当天如果没有此小队的日报记录 修改
@@ -196,4 +216,14 @@ public class IotRyDailyReportServiceImpl implements IotRyDailyReportService {
         return equipmentTypePair;
     }
 
+    @Override
+    public List<IotRyDailyReportDO> latestWellDoneTimes(IotRyDailyReportPageReqVO reqVO) {
+        return iotRyDailyReportMapper.latestWellDoneTimes(reqVO);
+    }
+
+    @Override
+    public List<IotRyDailyReportTaskCountVO> countTasksByDept() {
+        return iotRyDailyReportMapper.countTasksByDept();
+    }
+
 }

+ 16 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/iotprojecttask/IotRyDailyReportMapper.xml

@@ -2,7 +2,6 @@
 <!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.iotrydailyreport.IotRyDailyReportMapper">
 
-
     <!-- 基础结果映射 -->
     <resultMap id="BaseResultMap" type="cn.iocoder.yudao.module.pms.dal.dataobject.iotrydailyreport.IotRyDailyReportDO">
         <!-- 根据实际字段配置 -->
@@ -66,4 +65,20 @@
         ORDER BY g.min_start_date ASC
     </select>
 
+    <select id="latestWellDoneTimes" resultMap="BaseResultMap"
+            parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportPageReqVO">
+        SELECT r1.dept_id,
+               r1.task_id,
+               r1.construction_start_date
+        FROM rq_iot_ry_daily_report r1
+        INNER JOIN (
+            SELECT
+                dept_id,
+                MAX(create_time) AS max_create_time
+            FROM rq_iot_ry_daily_report
+            WHERE rig_status = 12
+            GROUP BY dept_id
+        ) r2 ON r1.dept_id = r2.dept_id AND r1.create_time = r2.max_create_time
+        WHERE r1.rig_status = 12;
+    </select>
 </mapper>