Browse Source

新增接口:按专业、系统、设备类统计设备数量

yucheng 3 years ago
parent
commit
f3a5e7a088

+ 15 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/simple/controller/EquipmentReportController.java

@@ -5,6 +5,7 @@ import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.common.utils.ParamCheckUtil;
 import com.persagy.dmp.common.utils.ResultHelper;
 import com.persagy.dmp.rwd.digital.service.IObjectDigitalService;
+import com.persagy.dmp.rwd.simple.entity.CountTypeEquipmentVO;
 import com.persagy.dmp.rwd.simple.service.IEquipmentReportService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -46,4 +47,18 @@ public class EquipmentReportController {
         List<Map<String, Object>> result = reportService.queryExpectScrapCountByProjects(projectIds);
         return ResultHelper.multi(result);
     }
+
+    /**
+     * 按对象类型统计设备总数
+     * @param projectIds 为空查所有
+     * @return 专业类统计 - 系统类统计 - 设备类统计 层级结构
+     */
+    @PostMapping("/queryEquipmentCountByType")
+    public CommonResult<List<CountTypeEquipmentVO>> queryEquipmentCountByType(@RequestBody(required = false) List<String> projectIds) {
+        //基础参数校验
+        ParamCheckUtil.checkParam(CommonConstant.QUERY_GROUPCODE);
+        // 统计
+        List<CountTypeEquipmentVO> result = reportService.queryEquipmentCountByType(projectIds);
+        return ResultHelper.multi(result);
+    }
 }

+ 9 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/simple/dao/EquipmentReportMapper.java

@@ -1,5 +1,7 @@
 package com.persagy.dmp.rwd.simple.dao;
 
+import org.apache.ibatis.annotations.Param;
+
 import java.util.List;
 import java.util.Map;
 
@@ -17,4 +19,11 @@ public interface EquipmentReportMapper {
      * @return
      */
     List<Map<String, Object>> queryExpectScrapCountByProjects(String scrapDate, List<String> projectIds);
+
+    /**
+     * 按对象类型统计设备总数
+     * @param projectIds
+     * @return
+     */
+    List<Map<String, Object>> queryEquipmentCountByType(@Param("projectIds") List<String> projectIds);
 }

+ 54 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/simple/entity/CountTypeEquipmentVO.java

@@ -0,0 +1,54 @@
+package com.persagy.dmp.rwd.simple.entity;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 按专业、系统、设备类统计 VO
+ * @author Charlie Yu
+ * @date 2021-09-02
+ */
+@Data
+@Builder
+public class CountTypeEquipmentVO {
+    /** 类型编码 */
+    private String code;
+    /** 类型名称 */
+    private String name;
+    /** 类型 - 专业/系统/设备类 */
+    private String type;
+    /** 类型下设备数量 */
+    private Integer count;
+    /** 下级信息 */
+    private List<CountTypeEquipmentVO> content;
+
+    /**
+     * 累加
+     * @param total
+     */
+    public void addCount(Integer total) {
+        // 为空不处理
+        if(total == null || total < 0) {
+            return;
+        }
+        // 累加
+        count = count + total;
+    }
+
+    /**
+     * 追加子集
+     * @param vo
+     */
+    public void addContent(CountTypeEquipmentVO vo) {
+        if(vo == null) {
+            return;
+        }
+        if(content == null) {
+            content = new ArrayList<>();
+        }
+        content.add(vo);
+    }
+}

+ 10 - 1
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/simple/service/IEquipmentReportService.java

@@ -1,5 +1,7 @@
 package com.persagy.dmp.rwd.simple.service;
 
+import com.persagy.dmp.rwd.simple.entity.CountTypeEquipmentVO;
+
 import java.util.List;
 import java.util.Map;
 
@@ -13,8 +15,15 @@ public interface IEquipmentReportService {
     /**
      * 统计项目设备总数和待报废设备数量
      * 待报废设备 = ifnull(预计报废日期, '9999-12-31') < (当前日期+6个月)
-     * @param projectIds
+     * @param projectIds 为空时,查所有
      * @return
      */
     List<Map<String, Object>> queryExpectScrapCountByProjects(List<String> projectIds);
+
+    /**
+     * 按对象类型统计设备总数
+     * @param projectIds 为空时,查所有
+     * @return
+     */
+    List<CountTypeEquipmentVO> queryEquipmentCountByType(List<String> projectIds);
 }

+ 78 - 3
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/simple/service/impl/EquipmentReportServiceImpl.java

@@ -1,16 +1,21 @@
 package com.persagy.dmp.rwd.simple.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.StrUtil;
+import com.persagy.dmp.common.constant.CommonConstant;
+import com.persagy.dmp.common.context.AppContext;
 import com.persagy.dmp.common.utils.DateHelper;
+import com.persagy.dmp.rwd.basic.constant.DigitalObjectType;
 import com.persagy.dmp.rwd.simple.dao.EquipmentReportMapper;
+import com.persagy.dmp.rwd.simple.entity.CountTypeEquipmentVO;
 import com.persagy.dmp.rwd.simple.service.IEquipmentReportService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 数字孪生 设备统计相关接口实现类
@@ -32,4 +37,74 @@ public class EquipmentReportServiceImpl implements IEquipmentReportService {
         String scrapDate = DateHelper.DateToString(date, "yyyy-MM-dd");
         return mapper.queryExpectScrapCountByProjects(scrapDate, projectIds);
     }
+
+    @Override
+    public List<CountTypeEquipmentVO> queryEquipmentCountByType(List<String> projectIds) {
+        // TODO 获取专业、系统的code,name对照 - 先不转了,回头再加
+        Map<String, String> majorMap = new HashMap<>();
+        Map<String, String> systemMap = new HashMap<>();
+        // 项目不为空,把平台级和集团级的加上
+        if(CollUtil.isNotEmpty(projectIds)) {
+            projectIds.add(CommonConstant.DEFAULT_ID);
+            projectIds.add(AppContext.getContext().getGroupCode());
+        }
+        // 查询统计 - 业务认知:设备类总数不会太多
+        List<Map<String, Object>> rsList = mapper.queryEquipmentCountByType(projectIds);
+        return mergeCountResult(rsList, majorMap, systemMap);
+    }
+
+    /**
+     * 累加统计结果,合并为专业-系统-设备类 层级结构
+     * @param rsList
+     * @return
+     */
+    private List<CountTypeEquipmentVO> mergeCountResult(List<Map<String, Object>> rsList, Map<String, String> majorMap, Map<String, String> systemMap) {
+        if(CollUtil.isEmpty(rsList)) {
+            return null;
+        }
+        // 查询到的是设备类的统计,再做一下计算(单次循环),改造为专业-系统-设备类 层级结构
+        List<CountTypeEquipmentVO> reportList = new ArrayList<>();
+        Map<String, CountTypeEquipmentVO> reportMap = new HashMap<>(16);
+        for(Map<String, Object> info:rsList) {
+            String majorCode = MapUtil.getStr(info, "majorCode");
+            String systemCode = MapUtil.getStr(info, "systemCode");
+            String eqCode = MapUtil.getStr(info, "code");
+            int total = MapUtil.getInt(info, "total");
+            // 有空就是错误数据,不处理
+            if(StrUtil.isBlank(majorCode) || StrUtil.isBlank(systemCode) || StrUtil.isBlank(eqCode)) {
+                continue;
+            }
+            // 创建设备类统计结果
+            CountTypeEquipmentVO equipmentVO = CountTypeEquipmentVO.builder()
+                    .code(eqCode).name(MapUtil.getStr(info, "name"))
+                    .type(DigitalObjectType.EQUIPMENT.getIndex()).count(total).build();
+            // 查找专业类统计结果并累加
+            CountTypeEquipmentVO majorVO = reportMap.get(majorCode);
+            if(majorVO == null) {
+                // 没有就创建
+                majorVO = CountTypeEquipmentVO.builder()
+                        .code(majorCode).name(MapUtil.getStr(majorMap, majorCode))
+                        .type("major").count(0).build();
+                reportMap.put(majorCode, majorVO);
+                // 专业类的放入返回结果中
+                reportList.add(majorVO);
+            }
+            majorVO.addCount(total);
+            // 查找系统类统计结果并累加
+            CountTypeEquipmentVO systemVO = reportMap.get(systemCode);
+            if(systemVO == null) {
+                // 没有就创建
+                systemVO = CountTypeEquipmentVO.builder()
+                        .code(systemCode).name(MapUtil.getStr(systemMap, systemCode))
+                        .type(DigitalObjectType.SYSTEM.getIndex()).count(0).build();
+                reportMap.put(systemCode, systemVO);
+                // 系统类的追加到专业类的子集
+                majorVO.addContent(systemVO);
+            }
+            systemVO.addCount(total);
+            // 设备类的追加到系统类的子集
+            systemVO.addContent(equipmentVO);
+        }
+        return reportList;
+    }
 }

+ 23 - 0
dmp-business/dmp-rwd/src/main/resources/mapper/EquipmentReportMapper.xml

@@ -18,4 +18,27 @@
         </if>
         group by pj.id, pj.name
 	</select>
+    <select id="queryEquipmentCountByType" resultType="java.util.HashMap">
+        select dt_define_type.major_code as majorCode, dt_define_type.system_code as systemCode,
+          dt_define_type.code as code, dt_define_type.name as name,
+          count(distinct dt_object.id) as total -- 容错处理,避免字典定义重复时数量异常
+        from dt_define_type left join dt_object on dt_object.class_code = dt_define_type.code
+          and dt_object.obj_type = 'equipment' and dt_object.valid = 1
+        <if test="projectIds != null and projectIds.size() &gt; 0" >
+            and dt_object.project_id in
+            <foreach collection="projectIds" item="projectId" open="(" close=")" separator="," >
+                #{projectId}
+            </foreach>
+        </if>
+        where dt_define_type.obj_type = 'equipment' and dt_define_type.code != 'equipment'
+          and dt_define_type.valid = 1
+        <if test="projectIds != null and projectIds.size() &gt; 0" >
+            and dt_define_type.project_id in
+            <foreach collection="projectIds" item="projectId" open="(" close=")" separator="," >
+                #{projectId}
+            </foreach>
+        </if>
+        group by dt_define_type.major_code, dt_define_type.system_code,
+          dt_define_type.code, dt_define_type.name;
+    </select>
 </mapper>