瀏覽代碼

Merge remote-tracking branch 'origin/develop' into develop

lijie 3 年之前
父節點
當前提交
c332a7973c

+ 4 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/controller/ObjectRelationController.java

@@ -8,6 +8,7 @@ import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.basic.model.QueryCriteria;
 import com.persagy.dmp.common.constant.CommonConstant;
 import com.persagy.dmp.common.constant.ResponseCode;
+import com.persagy.dmp.common.constant.ValidEnum;
 import com.persagy.dmp.common.context.AppContext;
 import com.persagy.dmp.common.exception.BusinessException;
 import com.persagy.dmp.common.model.response.CommonResult;
@@ -152,6 +153,9 @@ public class ObjectRelationController {
         for (ObjectRelation vo : voList) {
             vo.setGroupCode(groupCode);
             vo.setProjectId(projectId);
+            if(vo.getValid() == null) {
+                vo.setValid(ValidEnum.TRUE.getType());
+            }
         }
     }
 }

+ 6 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/utils/ObjectDigitalCriteriaHelper.java

@@ -83,6 +83,12 @@ public class ObjectDigitalCriteriaHelper {
         Map<String, JsonNode> valueMap = new HashMap<>();
         while (fieldNames.hasNext()) {
             String infoCode = fieldNames.next();
+            // 20210903 grouping字段特殊处理,解决mysql关键字问题
+            if("grouping".equalsIgnoreCase(infoCode)) {
+                valueMap.put("`grouping`", criteria.get(infoCode));
+                fieldNames.remove();
+                continue;
+            }
             // 基础属性不用处理
             if(DIGITAL_FIELDS.contains(infoCode)
                     || QueryOperator.AND_OR.getIndex().equalsIgnoreCase(infoCode)) {

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

@@ -0,0 +1,64 @@
+package com.persagy.dmp.rwd.simple.controller;
+
+import com.persagy.dmp.common.constant.CommonConstant;
+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;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 简洁API - 设备统计相关接口
+ * @author Charlie Yu
+ * @date 2021-09-02
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/report/equipment")
+public class EquipmentReportController {
+
+    @Autowired
+    private IObjectDigitalService digitalService;
+    @Autowired
+    private IEquipmentReportService reportService;
+
+    /**
+     * 统计项目设备总数和待报废设备数量
+     * 待报废设备 = ifnull(预计报废日期, '9999-12-31') < (当前日期+6个月)
+     * @param projectIds 为空查所有
+     * @return
+     */
+    @PostMapping("/queryExpectScrapCountByProjects")
+    public CommonResult<List<Map<String, Object>>> queryExpectScrapCountByProjects(
+            @RequestBody(required = false) List<String> projectIds) {
+        //基础参数校验
+        ParamCheckUtil.checkParam(CommonConstant.QUERY_GROUPCODE);
+        // 统计
+        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);
+    }
+}

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

@@ -0,0 +1,29 @@
+package com.persagy.dmp.rwd.simple.dao;
+
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 数字孪生 设备统计相关接口 DAO
+ * @author Charlie Yu
+ * @date 2021-08-04
+ */
+public interface EquipmentReportMapper {
+
+    /**
+     * 统计项目设备总数和待报废设备数量
+     * @param scrapDate 报废日期
+     * @param projectIds 项目ID
+     * @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);
+    }
+}

+ 29 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/simple/service/IEquipmentReportService.java

@@ -0,0 +1,29 @@
+package com.persagy.dmp.rwd.simple.service;
+
+import com.persagy.dmp.rwd.simple.entity.CountTypeEquipmentVO;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 数字孪生 设备统计相关接口
+ * @author Charlie Yu
+ * @date 2021-09-02
+ */
+public interface IEquipmentReportService {
+
+    /**
+     * 统计项目设备总数和待报废设备数量
+     * 待报废设备 = ifnull(预计报废日期, '9999-12-31') < (当前日期+6个月)
+     * @param projectIds 为空时,查所有
+     * @return
+     */
+    List<Map<String, Object>> queryExpectScrapCountByProjects(List<String> projectIds);
+
+    /**
+     * 按对象类型统计设备总数
+     * @param projectIds 为空时,查所有
+     * @return
+     */
+    List<CountTypeEquipmentVO> queryEquipmentCountByType(List<String> projectIds);
+}

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

@@ -0,0 +1,110 @@
+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.*;
+
+/**
+ * 数字孪生 设备统计相关接口实现类
+ * @author Charlie Yu
+ * @date 2021-09-02
+ */
+@Service
+@Slf4j
+@Transactional(rollbackFor = Exception.class)
+public class EquipmentReportServiceImpl implements IEquipmentReportService {
+
+    @Resource
+    private EquipmentReportMapper mapper;
+
+    @Override
+    public List<Map<String, Object>> queryExpectScrapCountByProjects(List<String> projectIds) {
+        Date date = DateHelper.addMonth(new Date(), 6);
+        // 日期格式,标准字典是yyyy-MM-dd,应该不会改。有改动再改为查字典获取格式
+        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;
+    }
+}

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

@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.persagy.dmp.rwd.simple.dao.EquipmentReportMapper">
+
+    <select id="queryExpectScrapCountByProjects" resultType="java.util.HashMap">
+        select pj.id as projectId, pj.name as projectName, count(eq.id) as equipmentTotal,
+          sum(case when
+            ifnull(json_extract(eq.infos, '$.expectScrapDate'), '9999-12-31') &lt; #{scrapDate}
+            then 1 else 0 end) as expectScrapToal
+        from dt_object pj left join dt_object eq on eq.project_id = pj.id
+          and eq.obj_type = 'equipment' and eq.valid = 1
+        where pj.obj_type = 'project' and pj.valid = 1
+        <if test="projectIds != null and projectIds.size() &gt; 0" >
+            and pj.project_id in
+            <foreach collection="projectIds" item="projectId" open="(" close=")" separator="," >
+                #{projectId}
+            </foreach>
+        </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>

+ 59 - 0
dmp-common/src/main/java/com/persagy/dmp/common/constant/DateStyle.java

@@ -0,0 +1,59 @@
+package com.persagy.dmp.common.constant;
+
+/**
+ * 日期格式
+ * @author Charlie Yu
+ * @date 2021-09-02
+ */
+public enum DateStyle {
+	/** 日期格式 */
+	YYYY("yyyy", false),
+	MM("MM", false),
+	YYYY_MM("yyyy-MM", false),
+	YYYYMM("yyyyMM", false),
+	YYYY_MM_DD("yyyy-MM-dd", false),
+	YYYY_MM_DD_HH_MM("yyyy-MM-dd HH:mm", false),
+	YYYY_MM_DD_HH_MM_SS("yyyy-MM-dd HH:mm:ss", false),
+	YYYYMMDDHHMMSS("yyyyMMddHHmmss", false),
+	YYYY_MM_EN("yyyy/MM", false),
+	YYYY_MM_DD_EN("yyyy/MM/dd", false),
+	YYYY_MM_DD_HH_MM_EN("yyyy/MM/dd HH:mm", false),
+	YYYY_MM_DD_HH_MM_SS_EN("yyyy/MM/dd HH:mm:ss", false),
+	
+	YYYY_MM_CN("yyyy年MM月", false),
+	YYYY_MM_DD_CN("yyyy年MM月dd日", false),
+	YYYY_MM_DD_HH_MM_CN("yyyy年MM月dd日 HH:mm", false),
+	YYYY_MM_DD_HH_MM_SS_CN("yyyy年MM月dd日 HH:mm:ss", false),
+	
+	HH_MM("HH:mm", true),
+	HH_MM_SS("HH:mm:ss", true),
+	
+	MM_DD("MM-dd", true),
+	MM_DD_HH_MM("MM-dd HH:mm", true),
+	MM_DD_HH_MM_SS("MM-dd HH:mm:ss", true),
+	
+	MM_DD_EN("MM/dd", true),
+	MM_DD_HH_MM_EN("MM/dd HH:mm", true),
+	MM_DD_HH_MM_SS_EN("MM/dd HH:mm:ss", true),
+	
+	MM_DD_CN("MM月dd日", true),
+	MM_DD_HH_MM_CN("MM月dd日 HH:mm", true),
+	MM_DD_HH_MM_SS_CN("MM月dd日 HH:mm:ss", true);
+	
+	private String value;
+	
+	private boolean isShowOnly;
+	
+	DateStyle(String value, boolean isShowOnly) {
+		this.value = value;
+		this.isShowOnly = isShowOnly;
+	}
+	
+	public String getValue() {
+		return value;
+	}
+	
+	public boolean isShowOnly() {
+		return isShowOnly;
+	}
+}

File diff suppressed because it is too large
+ 1026 - 0
dmp-common/src/main/java/com/persagy/dmp/common/utils/DateHelper.java


+ 35 - 0
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/digital/client/DigitalObjectSimpleClient.java

@@ -0,0 +1,35 @@
+package com.persagy.dmp.digital.client;
+
+import com.persagy.dmp.basic.config.DigitalFeignConfig;
+import com.persagy.dmp.common.model.response.CommonResult;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 数字孪生 简洁API Client
+ * @author Charlie Yu
+ * @date 2021-09-02
+ */
+@FeignClient(name = "dmp-rwd", configuration = DigitalFeignConfig.class,
+        url = "${persagy.bdtp.rwd.service:}",path = "/api/")
+public interface DigitalObjectSimpleClient {
+
+    /**
+     * 根据项目ID查询设备数量和待报废设备数量统计
+     * @param groupCode: 集团编码
+     * @param appId: 应用ID
+     * @param userId: 用户ID
+     * @param projectIds: 项目ID - 为空查所有
+     * @return
+     */
+    @PostMapping("report/equipment/queryExpectScrapCountByProjects")
+    CommonResult<List<Map<String, Object>>> queryExpectScrapCountByProjects(@RequestParam("groupCode") String groupCode,
+                                                                            @RequestParam("appId") String appId,
+                                                                            @RequestParam("userId") String userId,
+                                                                            @RequestBody(required = false) List<String> projectIds);
+}

+ 36 - 0
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/digital/client/DigitalObjectSimpleFacade.java

@@ -0,0 +1,36 @@
+package com.persagy.dmp.digital.client;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.persagy.dmp.common.model.response.CommonResult;
+import com.persagy.dmp.common.utils.ResultHelper;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 数字孪生 简洁API Client门面
+ * @author Charlie Yu
+ * @date 2021-05-15
+ */
+public class DigitalObjectSimpleFacade {
+
+    private static DigitalObjectSimpleClient client = SpringUtil.getBean(DigitalObjectSimpleClient.class);
+
+    /**
+     * 根据项目ID查询设备数量和待报废设备数量统计
+     * @param groupCode: 集团编码
+     * @param appId: 应用ID
+     * @param userId: 用户ID
+     * @param projectIds: 项目ID - 为空查所有
+     * @return
+     */
+    public static List<Map<String, Object>> queryExpectScrapCountByProjects(@RequestParam("groupCode") String groupCode,
+                                                                            @RequestParam("appId") String appId,
+                                                                            @RequestParam("userId") String userId,
+                                                                            @RequestBody(required = false) List<String> projectIds) {
+        CommonResult<List<Map<String, Object>>> result = client.queryExpectScrapCountByProjects(groupCode, appId, userId, projectIds);
+        return ResultHelper.getContent(result);
+    }
+}

+ 2 - 0
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/digital/entity/ObjectRelation.java

@@ -44,8 +44,10 @@ public class ObjectRelation extends AuditableEntity {
     /** 关系值 */
     private String relValue;
     /** 来源对象 */
+    @NotNull(message = "来源对象不允许为空")
     private String objFrom;
     /** 目标对象 */
+    @NotNull(message = "目标对象不允许为空")
     private String objTo;
     /** 创建应用 */
     private String createApp;