Quellcode durchsuchen

解决building报表查询慢的问题

yucheng vor 3 Jahren
Ursprung
Commit
dd51a89e87

+ 55 - 138
src/main/java/com/persagy/proxy/adm/controller/ComponentBuildingController.java

@@ -1,44 +1,24 @@
 package com.persagy.proxy.adm.controller;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.lang.StringUtils;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.persagy.proxy.adm.model.AdmBuilding;
+import com.persagy.proxy.adm.model.AdmFloor;
+import com.persagy.proxy.adm.request.AdmQueryCriteria;
+import com.persagy.proxy.adm.request.AdmResponse;
+import com.persagy.proxy.adm.service.IAdmBuildingService;
+import com.persagy.proxy.adm.service.IAdmFloorService;
+import com.persagy.proxy.adm.utils.AdmContextUtil;
+import com.persagy.proxy.common.entity.InstanceUrlParam;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.metadata.OrderItem;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.persagy.dmp.basic.dto.RequestData;
-import com.persagy.dmp.basic.model.QueryCriteria;
-import com.persagy.dmp.common.helper.SpringHelper;
-import com.persagy.dmp.common.model.response.CommonResult;
-import com.persagy.dmp.digital.client.DigitalRelationFacade;
-import com.persagy.dmp.digital.entity.ObjectDigital;
-import com.persagy.dmp.digital.entity.ObjectRelation;
-import com.persagy.proxy.adm.constant.AdmCommonConstant;
-import com.persagy.proxy.adm.constant.AdmObjectType;
-import com.persagy.proxy.adm.constant.AdmRelationType;
-import com.persagy.proxy.adm.constant.GraphCodeEnum;
-import com.persagy.proxy.adm.constant.RelCodeEnum;
-import com.persagy.proxy.adm.request.AdmQueryCriteria;
-import com.persagy.proxy.adm.request.AdmResponse;
-import com.persagy.proxy.adm.strategy.RelationObjectContext;
-
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.util.StrUtil;
+import java.util.List;
 
 /**
- * 
+ * 建筑报表Controller
  * @version 1.0.0
  * @company persagy 
  * @author zhangqiankun
@@ -47,126 +27,63 @@ import cn.hutool.core.util.StrUtil;
 @RestController
 public class ComponentBuildingController {
 
-	@Value("${middleware.group.code}")
-	private String defaultCode;
-	
 	@Autowired
-	private RelationObjectContext relationObjectContext;
+	private IAdmBuildingService service;
+	@Autowired
+	private IAdmFloorService floorService;
 	
 	/**
 	 * 建筑查询,这里查楼层都是从属关系,而非服务关系
-	 * @param queryCriteria
 	 * @param request
 	 * @return
 	 */
 	@RequestMapping("/building/query")
-	public AdmResponse queryBuilding(@RequestBody AdmQueryCriteria queryCriteria, HttpServletRequest request) {
-		String groupCode = request.getHeader(AdmCommonConstant.GROUP_CODE_HEADER);
-		groupCode = StrUtil.isBlank(groupCode) ? defaultCode : groupCode;
-		String projectId = request.getHeader(AdmCommonConstant.PROJECT_ID_HEADER);
-		
-		// 查询出所有的建筑对象
-		String orders = queryCriteria.getOrders();
-		RequestData requestData = new RequestData();
-		
-		List<OrderItem> orderItems = null;
-		if (StringUtils.isNotBlank(orders)) {
-			orderItems = new ArrayList<OrderItem>();
-			
-			String[] split = orders.split(",");
-			for (String column : split) {
-				if (StringUtils.isNotBlank(column)) {
-					orderItems.add(column.endsWith("asc") ? OrderItem.asc(column.split(" ")[0]) : OrderItem.desc(column.split(" ")[0]));
-				}
-			}
-		}
-		if (CollectionUtil.isNotEmpty(orderItems)) {
-			requestData.setOrders(orderItems);
+	public AdmResponse queryBuilding(@RequestBody AdmQueryCriteria request) {
+		InstanceUrlParam context = AdmContextUtil.toDmpContext();
+		request.setName(AdmBuilding.OBJ_TYPE);
+		// 级联查询有模型图的楼层
+		AdmQueryCriteria cascade = new AdmQueryCriteria();
+		cascade.setName("floor");
+		List<AdmQueryCriteria> cascades = request.getCascade();
+		if(CollUtil.isEmpty(cascades)) {
+			cascades = CollUtil.newArrayList(cascade);
+			request.setCascade(cascades);
+		} else {
+			cascades.add(cascade);
 		}
-		requestData.setGraphCode(GraphCodeEnum.ArchSubset.name());
-		requestData.setRelCode(RelCodeEnum.Bd2Fl.name());
-		requestData.setPage(queryCriteria.getPageNumber() == null ? 1L : queryCriteria.getPageNumber());
-		requestData.setSize(queryCriteria.getPageSize() == null ? 500L : queryCriteria.getPageSize());
-		
-		List<ObjectDigital> masterObjs = this.relationObjectContext.queryPageObjectInfo(requestData, groupCode, projectId, AdmRelationType.ARCHSUBSET_BD2FL);
-		this.handleMasterObjs(masterObjs, groupCode, projectId);
-		return AdmResponse.success(masterObjs);
+		AdmResponse result = service.doQuery(context, request, AdmBuilding.class);
+		calculateModelUsedCount(context, (List<AdmBuilding>) result.getContent());
+		return result;
 	}
 
 	/**
-	 * 处理响应结果集
-	 * 
-	 * @param masterObjs
-	 * @param groupCode
-	 * @param projectId
+	 * 统计建筑里所有楼层模型总计被使用次数
+	 * @param context
+	 * @param buildings
 	 */
-	private List<JSONObject> handleMasterObjs(List<ObjectDigital> masterObjs, String groupCode, String projectId) {
-		Map<String, Long> modelIds = new HashMap<String, Long>();
-		List<JSONObject> resultList = new ArrayList<JSONObject>();
-		
-		// 遍历所有主对象
-		for (ObjectDigital master : masterObjs) {
-			JSONObject result = new JSONObject();
-			
-			result.put("id", master.getId());
-			result.put("localId", master.getLocalId());
-			result.put("localName", master.getLocalName());
-			result.put("name", master.getName());
-			result.put("objectType", master.getObjType());
-			result.put("projectId", master.getProjectId());
-			result.put("infos", master.getInfos());
-
-			result.put("createTime", master.getCreationTime() == null ? null : master.getCreationTime().toString("yyyy-MM-dd HH:mm:ss"));
-			result.put("lastUpdate", master.getModifiedTime() == null ? null : master.getModifiedTime().toString("yyyy-MM-dd HH:mm:ss"));
-			result.put("statistics", new JSONObject());
-			
-			List<ObjectDigital> slaveObjs = master.getRelObjs();
-			if (CollectionUtil.isNotEmpty(slaveObjs)) {
-				// 遍历所有的从对象
-				for (ObjectDigital slave : slaveObjs) {
-					ObjectNode infos = slave.getInfos();
-					if(infos == null){
-						continue;
-					}
-					String outline = infos.get("outline") == null ? null : infos.get("outline").asText();
-					String modelFile = infos.get("modelFile") == null ? null : infos.get("modelFile").asText();
-					if (StrUtil.isEmpty(outline) && StrUtil.isNotBlank(modelFile)) {
-						// 判断此模型是否被多处使用
-						if (modelIds.containsKey(modelFile)) {
-							result.put("count", modelIds.get(modelFile));
-						} else {
-							long count = this.getNumByModelId(groupCode, projectId, modelFile);
-							result.put("count", count);
-							modelIds.put(modelFile, count);
-						}
-					}
-				}
+	private void calculateModelUsedCount(InstanceUrlParam context, List<AdmBuilding> buildings) {
+		if(CollUtil.isEmpty(buildings)) {
+			return;
+		}
+		// 按建筑计算模型数量 - 这里先这样写,这种统计不太合理,统计建筑里所有楼层模型总计被使用次数。确认是否需要后再考虑是否移除
+		for(AdmBuilding building:buildings) {
+			List<AdmFloor> floors = building.getFloor();
+			if(CollUtil.isEmpty(floors)) {
+				continue;
+			}
+			// 收集所有模型Id
+			List<Object> modelIds = CollUtil.getFieldValues(floors, "modelId", true);
+			if(CollUtil.isEmpty(modelIds)) {
+				continue;
 			}
-			
-			resultList.add(result);
+			// 查询模型使用次数
+			AdmQueryCriteria floorCriteria = new AdmQueryCriteria();
+			String inSql = CollUtil.join(modelIds, StrUtil.COMMA,"'","'");
+			floorCriteria.setFilters(" modelId in (" + inSql + ") ");
+			floorCriteria.setOnlyCount(true);
+			AdmResponse floorRs = floorService.doQuery(context, floorCriteria, AdmFloor.class);
+			// 设置次数
+			building.setCount(floorRs.getCount());
 		}
-		
-		return resultList;
 	}
-	
-	/**
-	 * 获取此项目使用此模型ID的所有楼层数量
-	 * 
-	 * @param groupCode
-	 * @param projectId
-	 * @param modelId
-	 * @return
-	 */
-	private long getNumByModelId(String groupCode, String projectId, String modelId) {
-		QueryCriteria queryCriteria = new QueryCriteria();
-		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
-		ObjectNode objectNode = objectMapper.createObjectNode();
-		objectNode.put("classCode", AdmObjectType.FLOOR.getIndex());
-		objectNode.put("modelFile", modelId);
-		queryCriteria.setCriteria(objectNode);
-		queryCriteria.setOnlyCount(true);
-		CommonResult<List<ObjectRelation>> result = DigitalRelationFacade.queryPrototype(groupCode, projectId, AdmCommonConstant.APP_ID, AdmCommonConstant.USER_ID, queryCriteria);
-		return result == null ? 0 : (result.getCount() == null ? 0 : result.getCount());
-	}
-	
 }

+ 2 - 0
src/main/java/com/persagy/proxy/adm/model/AdmBuilding.java

@@ -29,6 +29,8 @@ public class AdmBuilding extends AdmSBaseEntity<AdmBuilding>{
     private String buildQRCode;
     /** 对象类型 */
     private String objectType = OBJ_TYPE;
+    /** 建筑下楼层模型被使用的数量 */
+    private Long count;
 
     /** 级联-项目 */
     @CascadeColumn(graphCode = "ArchSubset", relCode = "Pj2Bd", selectToObj = false)