Переглянути джерело

pms 日报 累计注气量

zhangcl 3 тижнів тому
батько
коміт
6116237a76

+ 4 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotopeationfill/IotOpeationFillDO.java

@@ -98,6 +98,10 @@ public class IotOpeationFillDO extends BaseDO {
     private LocalDateTime createTime;
 
     private int isFill;
+    /**
+     * 是否日报虚拟设备 1是0否
+     */
+    private Integer isReport;
 
     private String orderName;
     private String orderType;

+ 31 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotdevicerunlog/IotDeviceRunLogMapper.java

@@ -6,12 +6,16 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicerunlog.vo.IotDeviceRunLogPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicerunlog.vo.IotDeviceRunLogRespVO;
-import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO;
-import cn.iocoder.yudao.module.pms.controller.admin.stat.IotStaticController;
 import cn.iocoder.yudao.module.pms.controller.admin.stat.vo.YearTotalGas;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO;
 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.LocalDate;
+import java.time.LocalDateTime;
+import java.time.Year;
 import java.util.Collection;
 import java.util.List;
 
@@ -72,4 +76,29 @@ public interface IotDeviceRunLogMapper extends BaseMapperX<IotDeviceRunLogDO> {
     List<IotDeviceRunLogRespVO> selectListByCreateTimeAndDeptList(IotDeviceRunLogPageReqVO reqVO);
     @TenantIgnore
     List<YearTotalGas> selectYearTotalGas(IotDeviceRunLogPageReqVO reqVO);
+
+    /**
+     * 查询当年"当日注气量"累计值
+     * @param deptId 部门ID
+     * @param deviceIds 设备ID集合
+     * @return fill_content字段数值总和
+     */
+    @TenantIgnore
+    @Select("SELECT SUM(CAST(fill_content AS DECIMAL(15,3))) " +
+            "FROM rq_iot_device_run_log " +
+            "WHERE dept_id = #{deptId} " +
+            "AND device_id IN (${deviceIds}) " +
+            "AND point_name = '当日注气量' " +
+            "AND create_time BETWEEN #{startOfYear} AND #{currentTime}")
+    BigDecimal selectCurrentYearFillContentSum(@Param("deptId") Long deptId,
+                                               @Param("deviceIds") Collection<Long> deviceIds,
+                                               @Param("startOfYear") LocalDateTime startOfYear,
+                                               @Param("currentTime") LocalDateTime currentTime);
+
+    // 可以在Service层提供便捷方法
+    default BigDecimal selectCurrentYearFillContentSum(Long deptId, Collection<Long> deviceIds) {
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime startOfYear = LocalDate.of(Year.now().getValue(), 1, 1).atStartOfDay();
+        return selectCurrentYearFillContentSum(deptId, deviceIds, startOfYear, now);
+    }
 }

+ 50 - 12
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotopeationfill/IotOpeationFillMapper.java

@@ -1,35 +1,29 @@
 package cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill;
 
-import java.time.LocalDateTime;
-import java.util.*;
-
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
-import cn.iocoder.yudao.module.pms.controller.admin.iotmodel.vo.IotModelPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmodeltemplateattrs.vo.IotModelTemplateAttrsRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillSaveReqVO;
-import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainPageReqVO;
-import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
-import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotZHBD.DeviceZHBDDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotcountdata.IotCountDataDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicecountdata.IotDeviceCountData;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO;
-import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodel.IotModelDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodeltemplateattrs.IotModelTemplateAttrsDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillOrderDO;
-import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainDO;
-import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.material.IotMaintainMaterialDO;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
-import org.springframework.stereotype.Repository;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Collection;
+import java.util.List;
 
 /**
  * 运行记录填报 Mapper
@@ -56,6 +50,50 @@ public interface IotOpeationFillMapper extends BaseMapperX<IotOpeationFillDO> {
                 .orderByDesc(IotOpeationFillDO::getId));
     }
 
+    /**
+     * 根据条件查询日报记录
+     *
+     * @param deptId     施工队伍id
+     * @param dateTime   当前时间
+     * @return 返回符合条件的瑞恒日报记录
+     */
+    default IotOpeationFillDO selectExistReport(Long deptId, LocalDateTime dateTime) {
+        String dateStr = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        // 使用LambdaQueryWrapperX构建查询条件,根据传入的参数动态添加查询条件
+        return selectOne(new LambdaQueryWrapperX<IotOpeationFillDO>()
+                .eqIfPresent(IotOpeationFillDO::getDeptId, deptId)
+                .eq(IotOpeationFillDO::getIsReport, 1)
+                .apply("DATE(create_time) = {0}", dateStr)
+                .orderByDesc(IotOpeationFillDO::getId)
+                .last("LIMIT 1"));
+    }
+
+    /**
+     * 根据条件查询日报记录 指定部门当年的日报记录
+     *
+     * @param deptId     施工队伍id
+     * @param dateTime   当前时间
+     * @return 返回符合条件的瑞恒日报记录
+     */
+    default List<IotOpeationFillDO> currentYearReports(Long deptId, LocalDateTime dateTime) {
+        int year = dateTime.getYear();  // 获取年份
+
+        // 使用LambdaQueryWrapperX构建查询条件,根据传入的参数动态添加查询条件
+        return selectList(new LambdaQueryWrapperX<IotOpeationFillDO>()
+                .eqIfPresent(IotOpeationFillDO::getDeptId, deptId)
+                .eq(IotOpeationFillDO::getIsReport, 1)
+                .apply("YEAR(create_time) = {0}", year));
+    }
+
+    /**
+     * 根据条件查询日报记录 指定部门当年的日报记录
+     *
+     * @param deptId     施工队伍id
+     * @param year   当前时间 年
+     * @return 返回符合条件的瑞恒日报记录
+     */
+    List<IotOpeationFillDO> selectReportsByYear(@Param("deptId")Long deptId, @Param("year")int year);
+
     @TenantIgnore
     List<IotOpeationFillOrderDO> selectListByCreateTime(IotOpeationFillPageReqVO reqVO);
     @TenantIgnore

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

@@ -89,7 +89,7 @@ public interface IotRhDailyReportMapper extends BaseMapperX<IotRhDailyReportDO>
     List<IotRhDailyReportDO> selectListGrouped(@Param("reqVO") IotRhDailyReportPageReqVO reqVO);
 
     /**
-     * 根据条件查询单个OTA升级记录
+     * 根据条件查询瑞恒日报记录
      *
      * @param deptId     施工队伍id
      * @param taskId     任务ID,可选参数,用于筛选任务ID匹配的记录

+ 4 - 7
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotopeationfill/IotOpeationFillService.java

@@ -1,24 +1,21 @@
 package cn.iocoder.yudao.module.pms.service.iotopeationfill;
 
-import java.util.*;
-import javax.validation.*;
-
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmodeltemplateattrs.vo.IotModelTemplateAttrsRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
-import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotcountdata.IotCountDataDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicecountdata.IotDeviceCountData;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodeltemplateattrs.IotModelTemplateAttrsDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillOrderDO;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.apache.ibatis.annotations.Param;
+
+import javax.validation.Valid;
+import java.util.Collection;
+import java.util.List;
 
 /**
  * 运行记录填报 Service 接口

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

@@ -11,12 +11,14 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotrhdailyreport.vo.IotRhDai
 import cn.iocoder.yudao.module.pms.controller.admin.iotrhdailyreport.vo.IotRhDailyReportSaveReqVO;
 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.iotopeationfill.IotOpeationFillDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotrhdailyreport.IotRhDailyReportDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.IotDeviceMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotdevicerunlog.IotDeviceRunLogMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill.IotOpeationFillMapper;
 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.pms.service.iotdevicerunlog.IotDeviceRunLogService;
 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.dict.DictDataService;
@@ -61,6 +63,10 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
     private DictDataService dictDataService;
     @Resource
     private DictTypeService dictTypeService;
+    @Resource
+    private IotOpeationFillMapper iotOpeationFillMapper;
+    @Resource
+    private IotDeviceRunLogMapper iotDeviceRunLogMapper;
 
 
     @Override
@@ -102,8 +108,18 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
                 deptDevices.forEach(device -> {
                     deviceCodes.add(device.getDeviceCode());
                 });
-                // 查询运行记录填报结果表中的 当日注气量 累计计算当年的 累计注气量
-
+                // 查询当前小队在运行记录填报结果表中 生产日报虚拟设备id 查询当年的日报
+                // 然后根据 虚拟设备id 在 rq_iot_device_run_log 表中查询 日报中填写的 当日注气量
+                List<IotOpeationFillDO> reports = iotOpeationFillMapper.selectReportsByYear(createReqVO.getDeptId(), LocalDateTime.now().getYear());
+                Set<Long> reportDeviceIds = new HashSet<>();
+                if (CollUtil.isNotEmpty(reports)) {
+                    reports.forEach(report -> {
+                        reportDeviceIds.add(report.getDeviceId());
+                    });
+                    // 累计注气量
+                    BigDecimal currentYearFillContentSum = iotDeviceRunLogMapper.selectCurrentYearFillContentSum(createReqVO.getDeptId(), reportDeviceIds);
+                    iotRhDailyReport.setTotalGasInjection(currentYearFillContentSum);
+                }
             }
 
             // 找到当前小队下的 电驱增压机 分类下设备的产能 计算 运行时效
@@ -138,7 +154,7 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
                             // 将当日注气量单位由"方"换算成"万方"
                             /* BigDecimal dailyGasInjectionInTenThousand = createReqVO.getDailyGasInjection()
                                     .divide(new BigDecimal(10000), 2, RoundingMode.HALF_UP); */
-                            iotRhDailyReport.setTransitTime(createReqVO.getDailyGasInjection().divide(capacity.get(), 2, RoundingMode.HALF_UP));
+                            iotRhDailyReport.setTransitTime(createReqVO.getDailyGasInjection().divide(capacity.get(), 4, RoundingMode.HALF_UP));
                         }
                     }
                 }

+ 10 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotOpeationFillMapper.xml

@@ -363,7 +363,16 @@
             order_id = #{orderId}
     </select>
 
-
+    <!--  -->
+    <select id="selectReportsByYear" resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
+        SELECT *
+        FROM rq_iot_opeation_fill
+        WHERE is_report = 1
+        <if test="deptId != null">
+            AND dept_id = #{deptId}
+        </if>
+        AND YEAR(create_time) = #{year}
+    </select>
 
     <select id="fillRecords" parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageReqVO"
             resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillOrderDO">

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

@@ -17,7 +17,7 @@
     </resultMap>
 
     <!-- 使用窗口函数实现分组查询 -->
-    <select id="selectListGrouped" resultMap="BaseResultMap"
+    <select id="selectListGroupedBack" resultMap="BaseResultMap"
             parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotrhdailyreport.vo.IotRhDailyReportPageReqVO">
         WITH rq_iot_rh_daily_report AS (
             SELECT
@@ -48,4 +48,53 @@
         ORDER BY min_start_date ASC
     </select>
 
+    <select id="selectListGrouped" resultMap="BaseResultMap"
+            parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotrhdailyreport.vo.IotRhDailyReportPageReqVO">
+        SELECT t1.*, g.min_start_date
+        FROM rq_iot_rh_daily_report t1
+        INNER JOIN (
+        SELECT
+        construction_status,
+        MIN(construction_start_date) as min_start_date
+        FROM rq_iot_rh_daily_report
+        <where>
+            <if test="reqVO.deptId != null">
+                AND dept_id = #{reqVO.deptId}
+            </if>
+            <if test="reqVO.projectId != null">
+                AND project_id = #{reqVO.projectId}
+            </if>
+            <if test="reqVO.taskId != null">
+                AND task_id = #{reqVO.taskId}
+            </if>
+        </where>
+        GROUP BY construction_status
+        ) g ON t1.construction_status = g.construction_status
+        AND t1.construction_start_date = g.min_start_date
+        WHERE NOT EXISTS (
+        SELECT 1 FROM rq_iot_rh_daily_report t2
+        WHERE t2.construction_status = t1.construction_status
+        AND t2.construction_start_date &lt; t1.construction_start_date
+        <if test="reqVO.deptId != null">
+            AND t2.dept_id = #{reqVO.deptId}
+        </if>
+        <if test="reqVO.projectId != null">
+            AND t2.project_id = #{reqVO.projectId}
+        </if>
+        <if test="reqVO.taskId != null">
+            AND t2.task_id = #{reqVO.taskId}
+        </if>
+        )
+        <if test="reqVO.deptId != null">
+            AND t1.dept_id = #{reqVO.deptId}
+        </if>
+        <if test="reqVO.projectId != null">
+            AND t1.project_id = #{reqVO.projectId}
+        </if>
+        <if test="reqVO.taskId != null">
+            AND t1.task_id = #{reqVO.taskId}
+        </if>
+        ORDER BY g.min_start_date ASC
+    </select>
+
 </mapper>