WDRwdObjectTransferHandler.java 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package com.persagy.transfer.handle;
  2. import java.util.List;
  3. import java.util.Map;
  4. import java.util.Set;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Component;
  7. import org.springframework.transaction.annotation.Transactional;
  8. import com.alibaba.fastjson.JSONObject;
  9. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  10. import com.google.common.collect.Lists;
  11. import com.persagy.common.utils.StringUtil;
  12. import com.persagy.transfer.cache.LocalCache;
  13. import com.persagy.transfer.constant.InfosKeyConstant;
  14. import com.persagy.transfer.constant.ObjectTypeMapping;
  15. import com.persagy.transfer.constant.SwitchConstant;
  16. import com.persagy.transfer.pojo.dto.RwdObjectWd;
  17. import com.persagy.transfer.pojo.dto.WdclassRelPersagy;
  18. import com.persagy.transfer.pojo.dto.WdfacilityRelPersagy;
  19. import com.persagy.transfer.service.IHydomcAssetService;
  20. import com.persagy.transfer.service.IHydomcAssetspecService;
  21. import com.persagy.transfer.service.IRwdObjectWdService;
  22. import com.persagy.transfer.service.IWdfacilityRelPersagyService;
  23. import com.persagy.transfer.utils.StringTool;
  24. import cn.hutool.core.collection.CollectionUtil;
  25. import lombok.extern.slf4j.Slf4j;
  26. /**
  27. *
  28. * 同步物理世界的对象至万达数据库中
  29. *
  30. * @version 1.0.0
  31. * @company persagy
  32. * @author YangWanYi
  33. * @date 2021年9月17日 上午10:25:53
  34. */
  35. @Slf4j
  36. @Component
  37. public class WDRwdObjectTransferHandler {
  38. @Autowired
  39. private IRwdObjectWdService rwdObjectWdService;
  40. @Autowired
  41. private IHydomcAssetService hydomcAssetService;
  42. @Autowired
  43. private IHydomcAssetspecService hydomcAssetspecService;
  44. @Autowired
  45. private IWdfacilityRelPersagyService wdfacilityRelPersagyService;
  46. /**
  47. * 开始同步设备数据到万达数据库
  48. *
  49. * @company persagy
  50. * @author YangWanYi
  51. * @date 2021年9月17日 下午6:10:07
  52. */
  53. public void syncRwdObject2WD() {
  54. log.info("开始同步设备数据到万达数据库");
  55. Set<String> classCodes = LocalCache.BDTP_CLASS_CODE_BY_WD;
  56. Map<String, String> projectMaps = LocalCache.PROJECT_MAPPING_BY_WD;
  57. Set<String> projectIds = projectMaps.keySet();
  58. List<RwdObjectWd> objectLists = null;
  59. // 物理世界对象数据获取
  60. for (String classCode : classCodes) {
  61. for (String projectId : projectIds) {
  62. // 以 classCode、projectId 以及 objType=equipment 为条件,获取所有的对象信息
  63. objectLists = this.rwdObjectWdService.listByProjectId(projectId, classCode, ObjectTypeMapping.EQUIPMENT);
  64. // 处理中台数据 -> 万达数据库
  65. this.handleObjectLists(objectLists, projectId, classCode);
  66. }
  67. }
  68. }
  69. /**
  70. *
  71. * 处理中台的对象数据,并进行同步
  72. *
  73. * @param rwdObjecWdList 博锐尚格的项目对象
  74. * @param projectId 博锐项目ID
  75. * @param classCode 博锐类型编码
  76. * @author YangWanYi
  77. * @describe 同步万达设备数据的新增与更新
  78. * @date 2021/9/16 14:19
  79. */
  80. private void handleObjectLists(List<RwdObjectWd> rwdObjecWdList, String projectId, String classCode) {
  81. // 获取万达项目ID
  82. String wdProjectId = LocalCache.PROJECT_MAPPING_BY_WD.get(projectId);
  83. List<WdfacilityRelPersagy> wdfacilityRelList = null;
  84. for (RwdObjectWd rwdObjectWd : rwdObjecWdList) {
  85. // 验证此对象是否需要进行同步
  86. String localId = rwdObjectWd.getLocalId();
  87. if (StringUtil.isBlank(localId)) {
  88. log.warn("项目ID为:{} 的对象本地编码为空,对象ID:{}", projectId, rwdObjectWd.getId());
  89. continue;
  90. }
  91. localId = localId.substring(0, localId.lastIndexOf(SwitchConstant.POINT));
  92. WdclassRelPersagy calassPersagy = LocalCache.CLASS_CODE_MAPPING_BY_WD.get(LocalCache.getWDCacheKey(classCode, localId));
  93. if (calassPersagy == null) {
  94. log.warn("项目ID为:{} 的对象本地编码不匹配,对象ID:{},本地编码:{}", projectId, rwdObjectWd.getId(), localId);
  95. continue;
  96. }
  97. // 需要进行同步的对象,开始同步
  98. if (StringUtil.isBlank(rwdObjectWd.getInfos())) {
  99. continue;
  100. }
  101. try {
  102. // 防止一个对象数据不正确,影响到所有对象的同步
  103. JSONObject infos = JSONObject.parseObject(rwdObjectWd.getInfos());
  104. // 获取设备信息主键编码
  105. String sbybm = StringTool.object2String(infos.get(InfosKeyConstant.EQUIPMENT_CODE));
  106. if (StringUtil.isBlank(sbybm)) {
  107. log.warn("设备信息编码为空,不进行同步");
  108. continue;
  109. }
  110. // 查询出18类设备单独的信息点
  111. if (CollectionUtil.isEmpty(wdfacilityRelList)) {
  112. // 循环万达项目ID与博锐尚格项目ID映射表数据时,wdfacility_rel_persagy只查询一次
  113. wdfacilityRelList = this.listWdfacilityRelPersagy(calassPersagy.getWdClassCode(), calassPersagy.getClassstructureid());
  114. }
  115. // 数据开始同步
  116. this.saveHydomcAssetAndAssetspec(wdfacilityRelList, rwdObjectWd, infos, wdProjectId, calassPersagy.getClassstructureid(), sbybm);
  117. } catch (Exception e) {
  118. log.error("对象数据同步失败,失败对象ID:" + rwdObjectWd.getId(), e);
  119. }
  120. }
  121. }
  122. /**
  123. * 保存 设备参数信息 主从表数据
  124. *
  125. * @param wdfacilityRelList 筛选后的万达设备参数信息表与博锐尚格信息点的映射表数据
  126. * @param rwdObjectWd 物理世界对象数据
  127. * @param infos 博锐尚格项目表的debugs字段值
  128. * @param wdProjectId 万达项目ID
  129. * @param classstructureid 设备分类ID
  130. * @param sbybm 设备编码 主表的ID
  131. * @author YangWanYi
  132. * @describe 同步万达设备参数对象数据
  133. * @date 2021/9/16 18:56
  134. */
  135. @Transactional
  136. public void saveHydomcAssetAndAssetspec(List<WdfacilityRelPersagy> wdfacilityRelList, RwdObjectWd rwdObjectWd, JSONObject infos, String wdProjectId, String classstructureid, String sbybm) {
  137. // 优先同步主表数据 万达设备信息表
  138. boolean result = this.hydomcAssetService.saveHydomcAsset(rwdObjectWd, infos, wdProjectId, classstructureid, sbybm);
  139. if (!result) {
  140. log.error("万达设备信息主表数据同步失败,本方对象ID:{}, 项目ID:{}", rwdObjectWd.getId(), rwdObjectWd.getProjectId());
  141. return;
  142. }
  143. // 从表数据开始同步 万达设备参数信息表
  144. for (WdfacilityRelPersagy wdfacilityRelPersagy : wdfacilityRelList) {
  145. try {
  146. // 保证一个信息点的异常,不影响其余信息点的录入
  147. result = this.hydomcAssetspecService.saveHydomcAssetspec(wdfacilityRelPersagy, rwdObjectWd, infos, wdProjectId, classstructureid, sbybm);
  148. if (!result) {
  149. log.error("万达设备参数信息从表数据同步失败,本方对象ID:{}, 项目ID:{}, 信息点编码:{}", rwdObjectWd.getId(), rwdObjectWd.getProjectId(), wdfacilityRelPersagy.getCode());
  150. return;
  151. }
  152. } catch (Exception e) {
  153. log.error("万达设备参数信息从表数据同步失败,本方对象ID:{}, 项目ID:{}, 信息点编码:{}", rwdObjectWd.getId(), rwdObjectWd.getProjectId(), wdfacilityRelPersagy.getCode());
  154. }
  155. }
  156. }
  157. /**
  158. * 根据万达的类编码 和 设备分类ID,获取需要映射的信息点数据
  159. *
  160. * @param wdClassCode 万达设备类编码 (从wdclass_rel_persagy获取)
  161. * @param classStructureId 万达设备分类表id (从wdclass_rel_persagy获取)
  162. * @return java.util.List<com.persagy.transfer.pojo.dto.WdfacilityRelPersagy> 非空集合
  163. * @author YangWanYi
  164. * @describe 根据万达设备类编码和万达设备分类表id查询表wdfacility_rel_persagy数据
  165. * @date 2021/9/16 17:49
  166. */
  167. private List<WdfacilityRelPersagy> listWdfacilityRelPersagy(String wdClassCode, String classStructureId) {
  168. LambdaQueryWrapper<WdfacilityRelPersagy> queryWrapper = new WdfacilityRelPersagy.BuilderQueryWrapper()
  169. .wdClassCodeEq(wdClassCode).classstructureidEq(classStructureId).builder();
  170. List<WdfacilityRelPersagy> list = this.wdfacilityRelPersagyService.list(queryWrapper);
  171. return CollectionUtil.isEmpty(list) ? Lists.newArrayList() : list;
  172. }
  173. }