WDRwdObjectTransferHandler.java 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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. for (RwdObjectWd rwdObjectWd : rwdObjecWdList) {
  84. // 验证此对象是否需要进行同步
  85. String localId = rwdObjectWd.getLocalId();
  86. if (StringUtil.isBlank(localId)) {
  87. log.warn("项目ID为:{} 的对象本地编码为空,对象ID:{}", projectId, rwdObjectWd.getId());
  88. continue;
  89. }
  90. int lastIndexOf = localId.lastIndexOf(SwitchConstant.POINT);
  91. if (lastIndexOf <= 0) {
  92. log.warn("项目ID为:{} 的对象本地编码不规范,本地编码:{}", projectId, localId);
  93. continue;
  94. }
  95. localId = localId.substring(0, lastIndexOf);
  96. WdclassRelPersagy calassPersagy = LocalCache.CLASS_CODE_MAPPING_BY_WD.get(LocalCache.getWDCacheKey(classCode, localId));
  97. if (calassPersagy == null) {
  98. log.warn("项目ID为:{} 的对象本地编码不匹配,对象ID:{},本地编码:{}", projectId, rwdObjectWd.getId(), localId);
  99. continue;
  100. }
  101. // 需要进行同步的对象,开始同步
  102. if (StringUtil.isBlank(rwdObjectWd.getInfos())) {
  103. continue;
  104. }
  105. try {
  106. // 防止一个对象数据不正确,影响到所有对象的同步
  107. JSONObject infos = JSONObject.parseObject(rwdObjectWd.getInfos());
  108. // 获取设备信息主键编码
  109. String sbybm = StringTool.object2String(infos.get(InfosKeyConstant.EQUIPMENT_CODE));
  110. if (StringUtil.isBlank(sbybm)) {
  111. log.warn("设备信息编码为空,不进行同步");
  112. continue;
  113. }
  114. String classstructureid = StringTool.object2String(infos.get(InfosKeyConstant.EQUIPMENT_SORT));
  115. if (StringUtil.isBlank(classstructureid)) {
  116. log.warn("万达设备分类ID不存在,不进行同步,本方对象ID:{}, 项目ID:{}", rwdObjectWd.getId(), rwdObjectWd.getProjectId());
  117. return;
  118. }
  119. // 查询出18类设备单独的信息点
  120. //if (CollectionUtil.isEmpty(wdfacilityRelList)) {
  121. // 循环万达项目ID与博锐尚格项目ID映射表数据时,wdfacility_rel_persagy只查询一次
  122. List<WdfacilityRelPersagy> wdfacilityRelList = this.listWdfacilityRelPersagy(calassPersagy.getWdClassCode(), calassPersagy.getClassstructureid());
  123. //}
  124. // 正常数据开始同步
  125. this.saveHydomcAssetAndAssetspec(wdfacilityRelList, rwdObjectWd, infos, wdProjectId, classstructureid, sbybm);
  126. } catch (Exception e) {
  127. log.error("对象数据同步失败,失败对象ID:" + rwdObjectWd.getId(), e);
  128. }
  129. }
  130. }
  131. /**
  132. * 保存 设备参数信息 主从表数据
  133. *
  134. * @param wdfacilityRelList 筛选后的万达设备参数信息表与博锐尚格信息点的映射表数据
  135. * @param rwdObjectWd 物理世界对象数据
  136. * @param infos 博锐尚格项目表的infos字段值
  137. * @param wdProjectId 万达项目ID
  138. * @param classstructureid 设备分类名称
  139. * @param sbybm 设备编码 主表的ID
  140. * @author YangWanYi
  141. * @describe 同步万达设备参数对象数据
  142. * @date 2021/9/16 18:56
  143. */
  144. @Transactional
  145. public void saveHydomcAssetAndAssetspec(List<WdfacilityRelPersagy> wdfacilityRelList, RwdObjectWd rwdObjectWd, JSONObject infos, String wdProjectId, String classstructureid, String sbybm) {
  146. // 优先同步主表数据 万达设备信息表
  147. boolean result = this.hydomcAssetService.saveHydomcAsset(rwdObjectWd, infos, wdProjectId, classstructureid, sbybm);
  148. if (!result) {
  149. log.warn("万达设备信息主表数据同步失败,本方对象ID:{}, 项目ID:{}", rwdObjectWd.getId(), rwdObjectWd.getProjectId());
  150. return;
  151. }
  152. // 再验证 主对象数据是否已被删除,已被删除,直接级联更新子表,不需要再去单独更新子表数据
  153. int valid = rwdObjectWd.getValid() == null ? 0 : rwdObjectWd.getValid();
  154. if (valid == 0) {
  155. this.hydomcAssetspecService.deleteHydomcAssetspec(wdProjectId, sbybm, rwdObjectWd.getUpdateTime());
  156. return;
  157. }
  158. // 从表数据开始同步 万达设备参数信息表
  159. for (WdfacilityRelPersagy wdfacilityRelPersagy : wdfacilityRelList) {
  160. try {
  161. // 保证一个信息点的异常,不影响其余信息点的录入
  162. this.hydomcAssetspecService.saveHydomcAssetspec(wdfacilityRelPersagy, rwdObjectWd, infos, wdProjectId, classstructureid, sbybm);
  163. } catch (Exception e) {
  164. log.error("万达设备参数信息从表数据同步失败,本方对象ID:{}, 项目ID:{}, 信息点编码:{}", rwdObjectWd.getId(), rwdObjectWd.getProjectId(), wdfacilityRelPersagy.getCode());
  165. log.error("失败原因", e);
  166. }
  167. }
  168. }
  169. /**
  170. * 根据万达的类编码 和 设备分类ID,获取需要映射的信息点数据
  171. *
  172. * @param wdClassCode 万达设备类编码 (从wdclass_rel_persagy获取)
  173. * @param classStructureId 万达设备分类表id (从wdclass_rel_persagy获取)
  174. * @return java.util.List<com.persagy.transfer.pojo.dto.WdfacilityRelPersagy> 非空集合
  175. * @author YangWanYi
  176. * @describe 根据万达设备类编码和万达设备分类表id查询表wdfacility_rel_persagy数据
  177. * @date 2021/9/16 17:49
  178. */
  179. private List<WdfacilityRelPersagy> listWdfacilityRelPersagy(String wdClassCode, String classStructureId) {
  180. LambdaQueryWrapper<WdfacilityRelPersagy> queryWrapper = new WdfacilityRelPersagy.BuilderQueryWrapper()
  181. .wdClassCodeEq(wdClassCode).classstructureidEq(classStructureId).builder();
  182. List<WdfacilityRelPersagy> list = this.wdfacilityRelPersagyService.list(queryWrapper);
  183. return CollectionUtil.isEmpty(list) ? Lists.newArrayList() : list;
  184. }
  185. }