AdmEquipmentServiceImpl.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. package com.persagy.proxy.adm.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.alibaba.fastjson.JSONArray;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.fasterxml.jackson.core.JsonProcessingException;
  7. import com.fasterxml.jackson.databind.ObjectMapper;
  8. import com.fasterxml.jackson.databind.node.ArrayNode;
  9. import com.fasterxml.jackson.databind.node.JsonNodeFactory;
  10. import com.fasterxml.jackson.databind.node.ObjectNode;
  11. import com.persagy.dmp.basic.model.QueryCriteria;
  12. import com.persagy.dmp.common.model.entity.BaseEntity;
  13. import com.persagy.dmp.define.entity.ObjectTypeDefine;
  14. import com.persagy.dmp.digital.client.DigitalRelationFacade;
  15. import com.persagy.dmp.digital.entity.ObjectRelation;
  16. import com.persagy.proxy.adm.constant.AdmCommonConstant;
  17. import com.persagy.proxy.adm.model.AdmDict;
  18. import com.persagy.proxy.adm.model.AdmEquipment;
  19. import com.persagy.proxy.adm.model.AdmObjectType;
  20. import com.persagy.proxy.adm.model.AdmProperty;
  21. import com.persagy.proxy.adm.request.AdmQueryCriteria;
  22. import com.persagy.proxy.adm.request.AdmResponse;
  23. import com.persagy.proxy.adm.service.IAdmComAndEquipService;
  24. import com.persagy.proxy.adm.service.IAdmDictService;
  25. import com.persagy.proxy.adm.service.IAdmEquipmentService;
  26. import com.persagy.proxy.adm.utils.AdmContextUtil;
  27. import com.persagy.proxy.adm.utils.AdmEntityTransferUtil;
  28. import com.persagy.proxy.adm.utils.ObjectNameUtil;
  29. import com.persagy.proxy.common.client.DmpRwdClient;
  30. import com.persagy.proxy.common.entity.DmpResult;
  31. import com.persagy.proxy.common.entity.InstanceUrlParam;
  32. import com.persagy.proxy.common.entity.ObjRelationDTO;
  33. import lombok.extern.slf4j.Slf4j;
  34. import org.springframework.beans.factory.annotation.Autowired;
  35. import org.springframework.stereotype.Service;
  36. import java.util.*;
  37. import java.util.stream.Collectors;
  38. /**
  39. * ADM 设备 实现
  40. * @author lvxy
  41. * @date 2021/8/18
  42. */
  43. @Slf4j
  44. @Service
  45. public class AdmEquipmentServiceImpl extends AbstractAdmBaseServiceImpl<AdmEquipment> implements IAdmEquipmentService, IAdmComAndEquipService {
  46. @Autowired
  47. private DmpRwdClient rwdClient;
  48. @Autowired
  49. private ObjectMapper objectMapper;
  50. @Autowired
  51. private IAdmDictService dictService;
  52. @Override
  53. public List<AdmEquipment> doInsertEuip(InstanceUrlParam context, Class<AdmEquipment> clazz, List<AdmEquipment> voList) {
  54. if(CollUtil.isEmpty(voList)) {
  55. return null;
  56. }
  57. Set<String> classCodes = voList.stream().map(AdmEquipment::getClassCode).collect(Collectors.toSet());
  58. //查询定义类型
  59. QueryCriteria criteriaObject = getDmpCriteria(context, classCodes, AdmEquipment.OBJ_TYPE);
  60. JSONObject paraPe = null;
  61. try {
  62. String paraStr = objectMapper.writeValueAsString(criteriaObject);
  63. paraPe = JSONObject.parseObject(paraStr);
  64. } catch (JsonProcessingException e) {
  65. throw new RuntimeException("转换查询条件出错:" + e.getMessage());
  66. }
  67. DmpResult<JSONArray> resultDef = rwdClient.queryDefClass(context, paraPe);
  68. Map<String, ObjectTypeDefine> finalDefClassMap = getDefineMap(resultDef);
  69. // 设备名字处理
  70. voList.forEach(equip -> {
  71. if (StrUtil.isNotEmpty(equip.getName())) {
  72. if(CollUtil.isNotEmpty(finalDefClassMap) && finalDefClassMap.containsKey(equip.getClassCode())){
  73. ObjectTypeDefine defclass = finalDefClassMap.get(equip.getClassCode());
  74. equip.setName(ObjectNameUtil.objectName(defclass.getName()+"-"));
  75. }else{
  76. equip.setName(ObjectNameUtil.objectName("设备-"));
  77. }
  78. }
  79. });
  80. return doInsert(context, clazz, voList);
  81. }
  82. @Override
  83. public List<AdmEquipment> doUpdateEuip(InstanceUrlParam context, Class<AdmEquipment> clazz, List<AdmEquipment> voList) {
  84. //TODO 处理关系标记
  85. /*try {
  86. *//** 处理关系标记 *//*
  87. val listtype = ArrayList<String>()
  88. listtype.add("pe2bd")
  89. listtype.add("pe2fl")
  90. listtype.add("pe2sh")
  91. listtype.add("pe2sp")
  92. for (type in listtype){
  93. val entity = relationTypeProjectservice.select(SFilter.eq("projectId", Opt.projectId!!), SFilter.eq("relationType", type)).entity()
  94. if (entity!=null){
  95. entity.computationalState = 2
  96. relationTypeProjectservice.update(entity)
  97. }
  98. }
  99. } catch (e: Exception) {
  100. e.printStackTrace()
  101. }*/
  102. Map<String, AdmEquipment> voMap = CollUtil.fieldValueMap(voList, BaseEntity.PROP_ID);
  103. //查询设备对应的资产 关系 Pe2Eq (1:N,一个资产关联多个设备,设备是最小单位 by:lvxianyun)
  104. DmpResult<List<ObjRelationDTO>> relationRes = queryRelation(context, voMap);
  105. boolean isDealDataSucc = false;
  106. //不是绑定关系,清理绑定关系,重新绑定
  107. if(CollUtil.isNotEmpty(relationRes.getData())){
  108. isDealDataSucc = updateRelation2Pe(context, relationRes, voMap);
  109. }else {
  110. //不存在关系,需要新绑定关系,更新per,插入关系
  111. isDealDataSucc = insertRelation2Pe(context, voList, voMap);
  112. }
  113. return isDealDataSucc ? doUpdate(context, clazz, voList) : null;
  114. }
  115. @Override
  116. public void doDeleteEuip(InstanceUrlParam context, List<AdmEquipment> voList) {
  117. Map<String, AdmEquipment> voMap = CollUtil.fieldValueMap(voList, BaseEntity.PROP_ID);
  118. DmpResult<List<ObjRelationDTO>> relationRes = queryRelation(context, voMap);
  119. //清理绑定关系
  120. if(CollUtil.isNotEmpty(relationRes.getData())){
  121. updateRelation2Pe(context, relationRes, voMap);
  122. }
  123. doDelete(context,voList);
  124. }
  125. @Override
  126. public AdmResponse doQuery(InstanceUrlParam context, AdmQueryCriteria request, Class<AdmEquipment> clazz) {
  127. AdmResponse response = super.doQuery(context, request, clazz);
  128. // 系统需要补充分类名称属性
  129. ensureSpecialValues(context, (List<AdmEquipment>) response.getContent());
  130. return response;
  131. }
  132. @Override
  133. public void ensureSpecialValues(InstanceUrlParam context, List<AdmEquipment> vos) {
  134. if(CollUtil.isEmpty(vos)) {
  135. return;
  136. }
  137. // 查询对象类型 - 只找到这个接口,应提供一个按编码查编码名称Map的接口
  138. AdmDict admDict = AdmDict.builder().type(AdmEquipment.OBJ_TYPE).build();
  139. AdmResponse dicRs = dictService.queryCategory(AdmContextUtil.toDmpContext(), admDict, AdmObjectType.class);
  140. List<AdmObjectType> dicList = (List<AdmObjectType>) dicRs.getContent();
  141. if(CollUtil.isEmpty(dicList)) {
  142. return;
  143. }
  144. // 转换为编码名称Map
  145. Map<String, String> codeNameMap = CollUtil.fieldValueAsMap(dicList, "code", "name");
  146. // 赋值
  147. for(AdmEquipment vo:vos) {
  148. String classCode = vo.getClassCode();
  149. if(StrUtil.isEmpty(classCode)) {
  150. continue;
  151. }
  152. Map<String, String> category = new HashMap<>(16);
  153. category.put("code", classCode);
  154. category.put("name", codeNameMap.get(vo.getClassCode()));
  155. vo.setEquipCategory(category);
  156. }
  157. }
  158. private DmpResult<List<ObjRelationDTO>> queryRelation(InstanceUrlParam context, Map<String, AdmEquipment> voMap){
  159. QueryCriteria dmpRequest = new QueryCriteria();
  160. ObjectNode criteria = JsonNodeFactory.instance.objectNode();
  161. ArrayNode array = criteria.putObject("objTo").putArray("$in");
  162. voMap.keySet().forEach(equipId -> array.add(equipId));
  163. criteria.put("relCode", "Pe2Eq");
  164. criteria.put("graphCode", "Property2Mech");
  165. dmpRequest.setCriteria(criteria);
  166. dmpRequest.setSize(voMap.size() * 1L);
  167. dmpRequest.setPage(1L);
  168. dmpRequest.setWithoutCount(true);
  169. // 转换参数
  170. JSONObject paraRel = null;
  171. try {
  172. String paraStr = objectMapper.writeValueAsString(dmpRequest);
  173. paraRel = JSONObject.parseObject(paraStr);
  174. } catch (JsonProcessingException e) {
  175. log.error(e.getMessage(), e);
  176. return null;
  177. }
  178. return rwdClient.queryRelation(context, dmpRequest);
  179. }
  180. private DmpResult<JSONArray> queryObjectById(InstanceUrlParam context, Map<String, AdmEquipment> peMap){
  181. QueryCriteria criteriaObject = new QueryCriteria();
  182. ObjectNode criteriaPe = JsonNodeFactory.instance.objectNode();
  183. ArrayNode array = criteriaPe.putObject("id").putArray("$in");
  184. peMap.keySet().forEach(equipId -> array.add(equipId));
  185. criteriaPe.put("classCode", "property");
  186. criteriaPe.put("objType", "property");
  187. criteriaObject.setCriteria(criteriaPe);
  188. criteriaObject.setSize(peMap.size() * 1L);
  189. criteriaObject.setPage(1L);
  190. criteriaObject.setWithoutCount(true);
  191. // 转换参数
  192. JSONObject paraPe = null;
  193. try {
  194. String paraStr = objectMapper.writeValueAsString(criteriaObject);
  195. paraPe = JSONObject.parseObject(paraStr);
  196. } catch (JsonProcessingException e) {
  197. log.error(e.getMessage(), e);
  198. return null;
  199. }
  200. return rwdClient.queryObject(context, paraPe);
  201. }
  202. private AdmProperty createPropertyObj(String id, String equipId, Boolean isBimIdNull){
  203. AdmProperty admProperty = new AdmProperty();
  204. admProperty.setId(id);
  205. admProperty.setEquipId(equipId);
  206. if(isBimIdNull){
  207. admProperty.setBimId(null);
  208. }
  209. return admProperty;
  210. }
  211. private ObjectNode creatRelationObj(String objTo,String objFrom){
  212. ObjectNode relationNew = JsonNodeFactory.instance.objectNode();
  213. relationNew.put("relCode", "Pe2Eq");
  214. relationNew.put("graphCode", "Property2Mech");
  215. relationNew.put("graphCode", "Property2Mech001");
  216. relationNew.put("objTo", objTo);
  217. relationNew.put("objFrom", objFrom);
  218. return relationNew;
  219. }
  220. /**
  221. * 更新设备关联的资产(资产中的equipId 信息点) 以及设备资产关系
  222. * @return
  223. */
  224. private Boolean updateRelation2Pe(InstanceUrlParam context, DmpResult<List<ObjRelationDTO>> relationRes, Map<String, AdmEquipment> voMap){
  225. boolean isDealDataSucc = false;
  226. List<AdmProperty> updatePropertyList = new ArrayList<AdmProperty>();
  227. List<String> del_relationIds = new ArrayList<>(relationRes.getData().size());
  228. Map<String, ObjRelationDTO> relationMap = CollUtil.fieldValueMap(relationRes.getData(), "objTo");
  229. relationMap.keySet().forEach(euipId -> {
  230. //存在绑定的资产
  231. if(voMap.keySet().contains(euipId)){
  232. AdmEquipment admEquipment = voMap.get(euipId);
  233. ObjRelationDTO relation = relationMap.get(euipId);
  234. String propertyId = relation.getObjFrom();
  235. if(StrUtil.isNotEmpty(admEquipment.getPropertyId()) && StrUtil.isNotEmpty(propertyId)
  236. && !admEquipment.getPropertyId().equals(propertyId)){
  237. //1 与设备提供的资产绑定
  238. AdmProperty propertyFrom = createPropertyObj(admEquipment.getPropertyId(), euipId, false);
  239. propertyFrom.setId(admEquipment.getPropertyId());
  240. propertyFrom.setEquipId(euipId);
  241. updatePropertyList.add(propertyFrom);
  242. //2 从关系中查询出的资产与当前设备解绑
  243. //更新资产中的信息点
  244. AdmProperty property = createPropertyObj(propertyId, null, true);
  245. updatePropertyList.add(property);
  246. //更新关系
  247. del_relationIds.add(relation.getId());
  248. }
  249. }
  250. });
  251. DigitalRelationFacade.delete(context.getGroupCode(),context.getProjectId(), AdmCommonConstant.APP_ID,null,del_relationIds);
  252. DmpResult propertyResult = rwdClient.updateObject(context, JSONArray.parseArray(updatePropertyList.toString()));
  253. if(propertyResult.getResult().equals(DmpResult.SUCCESS)){
  254. isDealDataSucc = true;
  255. }
  256. return isDealDataSucc;
  257. }
  258. /**
  259. * 不存在关系,需要新绑定关系,更新per,插入关系
  260. * @param context
  261. * @param voList
  262. * @param voMap
  263. * @return
  264. */
  265. private Boolean insertRelation2Pe(InstanceUrlParam context, List<AdmEquipment> voList, Map<String, AdmEquipment> voMap){
  266. boolean isDealDataSucc = false;
  267. Map<String, AdmEquipment> peMap = CollUtil.fieldValueMap(voList, "propertyId");
  268. //查询资产
  269. DmpResult<JSONArray> resultPe = queryObjectById(context, peMap);
  270. if (CollUtil.isNotEmpty(resultPe.getData())) {
  271. //更新资产 创建资产设备关系
  272. List<AdmProperty> propertyList = AdmEntityTransferUtil.toAdmMultiEntity(resultPe.getData(), null, AdmProperty.class);
  273. List<ObjectNode> objRelationDTONews = new ArrayList<>();
  274. propertyList.forEach(property -> {
  275. //存在绑定的资产 更新
  276. AdmEquipment admEquipment = peMap.get(property.getId());
  277. property.setEquipId(admEquipment.getId());
  278. //创建新的设备资产关系
  279. ObjectNode relationNew = creatRelationObj( admEquipment.getId(), property.getId());
  280. objRelationDTONews.add(relationNew);
  281. });
  282. List<ObjectRelation> relationList = DigitalRelationFacade.create(context.getGroupCode(),context.getProjectId(), AdmCommonConstant.APP_ID,null,objRelationDTONews);
  283. if(CollUtil.isNotEmpty(relationList)){
  284. DmpResult<JSONArray> propertyRes = rwdClient.updateObject(context, JSONArray.parseArray(propertyList.toString()));
  285. if(propertyRes.getResult().equals(DmpResult.SUCCESS)){
  286. isDealDataSucc = true;
  287. }
  288. }
  289. }
  290. return isDealDataSucc;
  291. }
  292. }