|
@@ -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());
|
|
|
- }
|
|
|
-
|
|
|
}
|