AdmDictController.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. package com.persagy.proxy.dictionary.controller;
  2. import cn.hutool.core.collection.CollUtil;
  3. import com.persagy.dmp.define.entity.ObjectInfoCollect;
  4. import com.persagy.proxy.adm.constant.AdmDictCategoryEnum;
  5. import com.persagy.proxy.adm.constant.AdmDictConstant;
  6. import com.persagy.proxy.adm.request.AdmCreateRequest;
  7. import com.persagy.proxy.adm.request.AdmDictQueryCriteria;
  8. import com.persagy.proxy.adm.request.AdmQueryCriteria;
  9. import com.persagy.proxy.adm.request.AdmResponse;
  10. import com.persagy.proxy.adm.utils.AdmContextUtil;
  11. import com.persagy.proxy.common.entity.InstanceUrlParam;
  12. import com.persagy.proxy.dictionary.model.*;
  13. import com.persagy.proxy.dictionary.service.IAdmDictService;
  14. import com.persagy.proxy.object.model.*;
  15. import com.persagy.proxy.object.service.IAdmEquipmentService;
  16. import com.persagy.proxy.object.service.IAdmShaftService;
  17. import com.persagy.proxy.object.service.IAdmSpaceService;
  18. import com.persagy.proxy.object.service.IAdmSystemService;
  19. import lombok.extern.slf4j.Slf4j;
  20. import org.apache.commons.lang.StringUtils;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.web.bind.annotation.*;
  23. import java.util.*;
  24. import java.util.stream.Collectors;
  25. /**
  26. * @ClassName AdmDictController
  27. * @Description: 字典查询
  28. * @Author linhuili
  29. * @Date 2021/8/31 18:21
  30. * @Version V1.0
  31. **/
  32. @RestController
  33. @RequestMapping("/dict")
  34. @Slf4j
  35. public class AdmDictController {
  36. @Autowired
  37. private IAdmDictService service;
  38. @Autowired
  39. private IAdmEquipmentService equipmentService;
  40. @Autowired
  41. private IAdmSpaceService spaceService;
  42. @Autowired
  43. private IAdmShaftService shaftService;
  44. @Autowired
  45. private IAdmSystemService systemService;
  46. /**
  47. * 字典类型查询:所有设备类型、部件类型、系统类型、专业类型
  48. * @param request
  49. * @return
  50. * @throws Exception
  51. */
  52. @PostMapping("/category")
  53. public AdmResponse queryCategory(@RequestBody AdmDict request) throws Exception {
  54. // 组装上下文条件
  55. InstanceUrlParam context = AdmContextUtil.toDmpContext();
  56. if(StringUtils.isEmpty(request.getType())){
  57. throw new Exception("type不能为空");
  58. }
  59. return service.queryCategory(context,request, AdmObjectType.class);
  60. }
  61. /**
  62. * 批量处理字典信息操作:方案设定(BDTP暂不支持)
  63. * @param request
  64. * @return
  65. * @throws Exception
  66. */
  67. @PostMapping("/dict-batch")
  68. public AdmResponse dictBatch( @RequestBody AdmCreateRequest<AdmDictBatch> request) throws Exception {
  69. // 组装上下文条件
  70. InstanceUrlParam context = AdmContextUtil.toDmpContext();
  71. //方案设定:方案id :全新设定(schemeZero)、方案1(schemeOne)、方案2(schemeTwo),
  72. //"注意SchemeId为必填字段 ,优先级在列表中[R,S,M] ,一级标签[技术参数,基本参数] 列表为String类型
  73. return AdmResponse.success(new ArrayList<>());
  74. }
  75. /**
  76. * 查询项目下类型的信息点
  77. * @param request
  78. * @return
  79. * @throws Exception
  80. */
  81. @PostMapping("/query")
  82. public AdmResponse query(@RequestBody AdmDictQueryCriteria request) throws Exception {
  83. // 组装上下文条件
  84. InstanceUrlParam context = AdmContextUtil.toDmpContext();
  85. if(StringUtils.isNotEmpty(request.getLabslType())){
  86. request.setName(request.getLabslType());
  87. }
  88. if(StringUtils.isNotEmpty(request.getType())){
  89. request.setName(request.getType());
  90. }
  91. return service.query(context, request, AdmDictConstant.CLASS_CODE, AdmObjectInfo.class);
  92. }
  93. /**
  94. * 查询设备对应的设备族(废弃)
  95. * @param request
  96. * @return
  97. * @throws Exception
  98. */
  99. @PostMapping("/family/query")
  100. @Deprecated
  101. public AdmResponse familyQuery(@RequestBody AdmQueryCriteria request) throws Exception {
  102. // 组装上下文条件
  103. InstanceUrlParam context = AdmContextUtil.toDmpContext();
  104. return AdmResponse.success(new ArrayList<>());
  105. }
  106. /**
  107. * 重置项目下所有得定制信息点
  108. * @param request
  109. * @return
  110. * @throws Exception
  111. */
  112. @PostMapping("/reset-dic")
  113. public AdmResponse resetDic(@RequestBody AdmDictQueryCriteria request) throws Exception {
  114. // 组装上下文条件
  115. InstanceUrlParam context = AdmContextUtil.toDmpContext();
  116. return service.resetDic(context,request,null,AdmObjectInfo.class);
  117. }
  118. /**
  119. * 根据类型,项目id重置信息点
  120. * @param request
  121. * @return
  122. * @throws Exception
  123. */
  124. @PostMapping("/reset-type")
  125. public AdmResponse resetType(@RequestBody AdmDictQueryCriteria request) throws Exception {
  126. // 组装上下文条件
  127. InstanceUrlParam context = AdmContextUtil.toDmpContext();
  128. if(StringUtils.isEmpty(request.getType())){
  129. throw new Exception("type不能为空");
  130. }
  131. request.setName(request.getType());
  132. return service.resetDic(context,request,AdmDictConstant.CLASS_CODE,AdmObjectInfo.class);
  133. }
  134. /**
  135. * 设置-项目定制化字典
  136. * @param request
  137. * @return
  138. * @throws Exception
  139. */
  140. @PostMapping("/setting-dic-project")
  141. public AdmResponse settingDicProject(@RequestBody AdmCreateRequest<AdmDefFuncIdGather> request) throws Exception {
  142. // 组装上下文条件
  143. InstanceUrlParam context = AdmContextUtil.toDmpContext();
  144. return service.settingDicProject(context,request, ObjectInfoCollect.class);
  145. }
  146. /**
  147. * 查询项目下已有的设备类型带系统
  148. * @param request
  149. * @return
  150. * @throws Exception
  151. */
  152. @PostMapping("/system/equip/category")
  153. @Deprecated
  154. public AdmResponse querySystemEquipTree(@RequestBody AdmDictQueryCriteria request) throws Exception {
  155. return querySystemEquipTree(AdmContextUtil.toDmpContext(),request,AdmObjectType.class);
  156. }
  157. /**
  158. * 查询类型下所有字典信息 M 和 L 类型,包括自定义信息点
  159. * @param dictTypeList
  160. * @return
  161. * @throws Exception
  162. */
  163. @PostMapping("/morl/query")
  164. @Deprecated
  165. public AdmResponse queryMorlDict(@RequestBody List<String> dictTypeList) throws Exception {
  166. // 组装上下文条件
  167. InstanceUrlParam context = AdmContextUtil.toDmpContext();
  168. if(CollUtil.isEmpty(dictTypeList)){
  169. return AdmResponse.success(new ArrayList<>());
  170. }
  171. //查询指定类型下的信息点
  172. return service.queryMorlDict(context,dictTypeList);
  173. }
  174. /**
  175. * 获取不能同步到物理世界对象的数量
  176. * @param request
  177. * @return
  178. * @throws Exception
  179. */
  180. @PostMapping("/data-count")
  181. @Deprecated
  182. public AdmResponse queryNotSyncDmpObjects(@RequestBody AdmDictQueryCriteria request) throws Exception {
  183. return AdmResponse.success(new ArrayList<>());
  184. }
  185. /**
  186. * 需采集信息同步到所有项目
  187. * @return
  188. * @throws Exception
  189. */
  190. @GetMapping("/syn-dic-project")
  191. @Deprecated
  192. public AdmResponse syncProjectObjectInfo() throws Exception {
  193. return AdmResponse.success(new ArrayList<>());
  194. }
  195. /**
  196. * 需采集信息同步到所有项目
  197. * @return
  198. * @throws Exception
  199. */
  200. @PostMapping("/delivered/infos")
  201. @Deprecated
  202. public AdmResponse queryDictDeliveredInfos(@RequestBody AdmDictDeliverieInfosRequest request) throws Exception {
  203. if(StringUtils.isEmpty(request.getObjType())){
  204. return AdmResponse.success("对象类型不可以为空");
  205. }
  206. if(StringUtils.isEmpty(request.getClassCode())){
  207. return AdmResponse.success("类型不可以为空");
  208. }
  209. Map<String, AdmObjectInfo> admObjectInfoMap = service.queryDictDeliveredInfos(AdmContextUtil.toDmpContext(), request, AdmObjectInfo.class);
  210. //初始化待交付的信息点,id,name,localId,localName 无论是否有值默认展示,兼容历史逻辑
  211. List<AdmObjectInfo> deliveredInfos = new ArrayList<>();
  212. List<String> deliveredCodes = new ArrayList<>();
  213. service.initDeliveredInfos(admObjectInfoMap, deliveredInfos, deliveredCodes);
  214. String objType = request.getObjType();
  215. if("equipment".equals(objType)){
  216. //查询已交付的设备信息点
  217. return getAdmEquipDeliveredInfo(AdmContextUtil.toDmpContext(),request, admObjectInfoMap,deliveredInfos,deliveredCodes);
  218. }
  219. if("space".equals(objType)){
  220. //查询已交付的空间信息点
  221. return getAdmSpaceDeliveredInfo(AdmContextUtil.toDmpContext(),request, admObjectInfoMap,deliveredInfos,deliveredCodes);
  222. }
  223. if("system".equals(objType)){
  224. //查询已交付的系统信息点
  225. return getAdmSystemDeliveredInfo(AdmContextUtil.toDmpContext(),request, admObjectInfoMap,deliveredInfos,deliveredCodes);
  226. }
  227. if("shaft".equals(objType)){
  228. //查询已交付的竖井信息点
  229. return getAdmShaftDeliveredInfo(AdmContextUtil.toDmpContext(),request, admObjectInfoMap,deliveredInfos,deliveredCodes);
  230. }
  231. return AdmResponse.success(new ArrayList<>());
  232. }
  233. /**
  234. * 查询项目下已有的系统设备类型树
  235. * @param context
  236. * @param request
  237. * @param clazz
  238. * @return
  239. * @throws Exception
  240. */
  241. private <T> AdmResponse querySystemEquipTree(InstanceUrlParam context, AdmDictQueryCriteria request, Class<T> clazz) throws Exception {
  242. //查询项目下已有的设备类型
  243. request.setName(AdmEquipment.OBJ_TYPE);
  244. AdmResponse dictResponse = equipmentService.queryEquipClassCode(context, request, AdmEquipment.class);
  245. List<String> classCodes = (List<String>)dictResponse.getContent();
  246. if(CollUtil.isEmpty(classCodes)){
  247. return AdmResponse.success(new ArrayList<>());
  248. }
  249. Map<String, Set<String>> classCodeMap = classCodes.stream().collect(Collectors.groupingBy(item->item.substring(0,4),Collectors.toSet()));
  250. //查询系统设备类树
  251. AdmDict admDict = new AdmDict(AdmDictCategoryEnum.SYSTEM_EQUIP.getValue());
  252. AdmResponse categoryResponse = service.queryCategory(context, admDict, clazz);
  253. List<AdmObjectType> objectTypes = (List<AdmObjectType>) categoryResponse.getContent();
  254. if(CollUtil.isEmpty(objectTypes)){
  255. return AdmResponse.success(new ArrayList<>());
  256. }
  257. //过滤设备实体中不存在的类型
  258. Iterator<AdmObjectType> it = objectTypes.iterator();
  259. while(it.hasNext()){
  260. // 系统
  261. AdmObjectType systemType = it.next();
  262. // 设备类型
  263. List<AdmObjectType> equipmentTypes = systemType.getChildren();
  264. // 当前有的设备类型
  265. Set<String> classes = classCodeMap.get(systemType.getCode());
  266. if(CollUtil.isEmpty(equipmentTypes) || CollUtil.isEmpty(classes)){
  267. it.remove();
  268. continue;
  269. }
  270. Iterator<AdmObjectType> equipmentTypeIterator = equipmentTypes.iterator();
  271. while (equipmentTypeIterator.hasNext()){
  272. AdmObjectType equipmentType = equipmentTypeIterator.next();
  273. // 不包含的移除掉
  274. if(!CollUtil.contains(classes, equipmentType.getCode())){
  275. equipmentTypeIterator.remove();
  276. }
  277. }
  278. // 如果所有的都没了,也去掉系统
  279. if(CollUtil.isEmpty(equipmentTypes)) {
  280. it.remove();
  281. continue;
  282. }
  283. }
  284. return AdmResponse.success(objectTypes);
  285. }
  286. /**
  287. * 查询已交付的设备信息点
  288. * @param context
  289. * @param request
  290. */
  291. private AdmResponse getAdmEquipDeliveredInfo(InstanceUrlParam context,AdmDictDeliverieInfosRequest request, Map<String, AdmObjectInfo> admObjectInfoMap,List<AdmObjectInfo> deliveredInfos,List<String> deliveredCodes){
  292. AdmQueryCriteria admQueryCriteria = service.commbineObjectQueryCriteria(request);
  293. AdmResponse response = equipmentService.query(admQueryCriteria);
  294. List<AdmEquipment> content = (List<AdmEquipment>)response.getContent();
  295. if(CollUtil.isEmpty(content)){
  296. return AdmResponse.success(new ArrayList<>());
  297. }
  298. //统计有值的信息点
  299. for (AdmEquipment admEquipment : content) {
  300. Map<String, Object> infos = admEquipment.getInfos();
  301. if(CollUtil.isEmpty(infos)){
  302. continue;
  303. }
  304. for (Map.Entry<String, Object> info : infos.entrySet()) {
  305. Object value = info.getValue();
  306. if(deliveredCodes.contains(info.getKey()) || value == null){
  307. continue;
  308. }
  309. AdmObjectInfo admObjectInfo = admObjectInfoMap.get(info.getKey());
  310. if(admObjectInfo == null){
  311. continue;
  312. }
  313. deliveredCodes.add(info.getKey());
  314. deliveredInfos.add(admObjectInfo);
  315. }
  316. }
  317. return AdmResponse.success(deliveredInfos);
  318. }
  319. /**
  320. * 查询已交付的空间信息点
  321. * @param context
  322. * @param request
  323. */
  324. private AdmResponse getAdmSpaceDeliveredInfo(InstanceUrlParam context,AdmDictDeliverieInfosRequest request, Map<String, AdmObjectInfo> admObjectInfoMap,List<AdmObjectInfo> deliveredInfos,List<String> deliveredCodes){
  325. AdmQueryCriteria admQueryCriteria = service.commbineObjectQueryCriteria(request);
  326. AdmResponse response = spaceService.query(admQueryCriteria);
  327. List<AdmSpace> content = (List<AdmSpace>)response.getContent();
  328. if(CollUtil.isEmpty(content)){
  329. return AdmResponse.success(new ArrayList<>());
  330. }
  331. //统计有值的信息点
  332. for (AdmSpace admSpace : content) {
  333. Map<String, Object> infos = admSpace.getInfos();
  334. if(CollUtil.isEmpty(infos)){
  335. continue;
  336. }
  337. for (Map.Entry<String, Object> info : infos.entrySet()) {
  338. Object value = info.getValue();
  339. if(deliveredCodes.contains(info.getKey()) || value == null){
  340. continue;
  341. }
  342. AdmObjectInfo admObjectInfo = admObjectInfoMap.get(info.getKey());
  343. if(admObjectInfo == null){
  344. continue;
  345. }
  346. deliveredCodes.add(info.getKey());
  347. deliveredInfos.add(admObjectInfo);
  348. }
  349. }
  350. return AdmResponse.success(deliveredInfos);
  351. }
  352. /**
  353. * 查询已交付的竖井信息点
  354. * @param context
  355. * @param request
  356. */
  357. private AdmResponse getAdmShaftDeliveredInfo(InstanceUrlParam context,AdmDictDeliverieInfosRequest request, Map<String, AdmObjectInfo> admObjectInfoMap,List<AdmObjectInfo> deliveredInfos,List<String> deliveredCodes){
  358. AdmQueryCriteria admQueryCriteria = service.commbineObjectQueryCriteria(request);
  359. AdmResponse response = shaftService.doQuery(context,admQueryCriteria, AdmShaft.class);
  360. List<AdmShaft> content = (List<AdmShaft>)response.getContent();
  361. if(CollUtil.isEmpty(content)){
  362. return AdmResponse.success(new ArrayList<>());
  363. }
  364. //统计有值的信息点
  365. for (AdmShaft admShaft : content) {
  366. Map<String, Object> infos = admShaft.getInfos();
  367. if(CollUtil.isEmpty(infos)){
  368. continue;
  369. }
  370. for (Map.Entry<String, Object> info : infos.entrySet()) {
  371. Object value = info.getValue();
  372. if(deliveredCodes.contains(info.getKey()) || value == null){
  373. continue;
  374. }
  375. AdmObjectInfo admObjectInfo = admObjectInfoMap.get(info.getKey());
  376. if(admObjectInfo == null){
  377. continue;
  378. }
  379. deliveredCodes.add(info.getKey());
  380. deliveredInfos.add(admObjectInfo);
  381. }
  382. }
  383. return AdmResponse.success(deliveredInfos);
  384. }
  385. /**
  386. * 查询已交付的系统信息点
  387. * @param context
  388. * @param request
  389. */
  390. private AdmResponse getAdmSystemDeliveredInfo(InstanceUrlParam context,AdmDictDeliverieInfosRequest request, Map<String, AdmObjectInfo> admObjectInfoMap,List<AdmObjectInfo> deliveredInfos,List<String> deliveredCodes){
  391. AdmQueryCriteria admQueryCriteria = service.commbineObjectQueryCriteria(request);
  392. AdmResponse response = systemService.query(admQueryCriteria);
  393. List<AdmSystem> content = (List<AdmSystem>)response.getContent();
  394. if(CollUtil.isEmpty(content)){
  395. return AdmResponse.success(new ArrayList<>());
  396. }
  397. //统计有值的信息点
  398. for (AdmSystem admSystem : content) {
  399. Map<String, Object> infos = admSystem.getInfos();
  400. if(CollUtil.isEmpty(infos)){
  401. continue;
  402. }
  403. for (Map.Entry<String, Object> info : infos.entrySet()) {
  404. Object value = info.getValue();
  405. if(deliveredCodes.contains(info.getKey()) || value == null){
  406. continue;
  407. }
  408. AdmObjectInfo admObjectInfo = admObjectInfoMap.get(info.getKey());
  409. if(admObjectInfo == null){
  410. continue;
  411. }
  412. deliveredCodes.add(info.getKey());
  413. deliveredInfos.add(admObjectInfo);
  414. }
  415. }
  416. return AdmResponse.success(deliveredInfos);
  417. }
  418. }