SyncAppImpl0.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  1. package com.persagy.bdtp.adm.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.date.DatePattern;
  4. import cn.hutool.core.date.DateUtil;
  5. import cn.hutool.core.util.StrUtil;
  6. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  7. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  8. import com.fasterxml.jackson.core.type.TypeReference;
  9. import com.fasterxml.jackson.databind.JsonNode;
  10. import com.fasterxml.jackson.databind.ObjectMapper;
  11. import com.fasterxml.jackson.databind.node.ArrayNode;
  12. import com.fasterxml.jackson.databind.node.ObjectNode;
  13. import com.persagy.bdtp.adm.client.DicClient;
  14. import com.persagy.bdtp.adm.client.RwdClient;
  15. import com.persagy.bdtp.adm.common.AdmConst;
  16. import com.persagy.bdtp.adm.common.AdmResult;
  17. import com.persagy.bdtp.adm.dao.*;
  18. import com.persagy.bdtp.adm.entity.*;
  19. import com.persagy.bdtp.adm.entity.db.*;
  20. import com.persagy.bdtp.adm.entity.oldadm.OProject;
  21. import com.persagy.bdtp.adm.service.*;
  22. import com.persagy.dmp.basic.model.QueryCriteria;
  23. import com.persagy.dmp.common.constant.ResponseCode;
  24. import com.persagy.dmp.common.constant.ValidEnum;
  25. import com.persagy.dmp.common.exception.BusinessException;
  26. import com.persagy.dmp.common.model.response.CommonResult;
  27. import com.persagy.dmp.define.entity.RelationDefine;
  28. import org.springframework.beans.factory.annotation.Autowired;
  29. import org.springframework.core.io.Resource;
  30. import org.springframework.core.io.ResourceLoader;
  31. import org.springframework.stereotype.Service;
  32. import org.springframework.transaction.annotation.Transactional;
  33. import java.io.IOException;
  34. import java.util.*;
  35. import java.util.function.Supplier;
  36. @Service
  37. public class SyncAppImpl0 implements ISyncApp {
  38. @Autowired
  39. private IAdmObjectService objectService;
  40. @Autowired
  41. private IQueryFromOldAdm queryOldAdm;
  42. @Autowired
  43. private RwdClient rwdClient;
  44. @Autowired
  45. private DicClient dicClient;
  46. @Autowired
  47. private IConfigService configService;
  48. @Autowired
  49. private AdmObjectMapper admObjMapper;
  50. @Autowired
  51. private AdmRelationMapper relationMapper;
  52. @Autowired
  53. private AdmPipeMapper pipeMapper;
  54. @Autowired
  55. private AdmJobSpaceMapper jobSpaceMapper;
  56. @Autowired
  57. private AdmProblemArchMapper problemArchMapper;
  58. @Autowired
  59. private AdmProblemEquipMapper problemEquipMapper;
  60. @Autowired
  61. private AdmFileMapper fileMapper;
  62. @Autowired
  63. private AdmQrCodeMapper qrCodeMapper;
  64. @Autowired
  65. private AdmServeAreaMapper serveAreaMapper;
  66. @Autowired
  67. private ISyncModel syncModel;
  68. @Autowired
  69. private ObjectMapper objectMapper;
  70. @Autowired
  71. private IAdmLogService logService;
  72. @Autowired
  73. ResourceLoader resourceLoader;
  74. @Override
  75. public Dict downloadDict(String groupCode, String projectId, String userId) {
  76. //临时方案,腾讯云生产环境没有数据字典4.0,从本地文件加载
  77. try{
  78. Resource resource = resourceLoader.getResource("classpath:dict.json");
  79. return objectMapper.readValue(resource.getInputStream(), Dict.class);
  80. } catch (Exception e) {
  81. e.printStackTrace();
  82. }
  83. return queryDict(groupCode, projectId, userId, true, true);
  84. }
  85. @Override
  86. public Map<String, Object> downloadConfig(String groupCode, String projectId, String userId) {
  87. //配置数据查询
  88. List<AdmM2dEquip> m2dTypes = configService.queryM2dEquip(projectId);
  89. List<AdmInfosConfig> infosConfig = configService.queryInfosConfig(projectId);
  90. List<AdmRelsConfig> relConfig = configService.queryRelsConfig(projectId);
  91. List<AdmPipeConfig> pipeConfig = configService.queryPipeConfig(projectId);
  92. List<AdmConfig> config = configService.queryCommonConfig(projectId);
  93. List<AdmComponent> component = configService.queryComponent(projectId);
  94. List<AdmContainerConfig> containerConfig = configService.queryContainerConfig(projectId);
  95. HashMap<String, Object> data = new HashMap<>();
  96. data.put("m2dTypes", m2dTypes);
  97. data.put("infosConfig", serializeJsonProp(infosConfig));
  98. data.put("relConfig", relConfig);
  99. data.put("pipeConfig", pipeConfig);
  100. data.put("config", serializeJsonProp(config));
  101. data.put("component", component);
  102. data.put("containerConfig", containerConfig);
  103. return data;
  104. }
  105. @Override
  106. public Dict queryDict(String groupCode, String projectId, String userId, boolean includeRel, boolean includeInfos){
  107. boolean newDict = "JD".equalsIgnoreCase(groupCode);
  108. //从知识库服务获取专业分类
  109. QueryCriteria majorCriteria = ServiceUtil.getQueryCriteria(objectMapper);
  110. majorCriteria.getCriteria().put("type", "major");
  111. List<Map<String, Object>> majorList = ServiceUtil.call (() -> dicClient.dataQuery(groupCode, projectId, AdmConst.APP_ID, userId, majorCriteria));
  112. //查询系统和设备定义
  113. QueryCriteria criteria = ServiceUtil.getQueryCriteria(objectMapper, "system", "equipment");
  114. List<TypeDef> typeList = queryAllPage(() -> rwdClient.queryObjectType(groupCode, projectId, AdmConst.APP_ID, userId, criteria), criteria, new Pagination(500));
  115. //查询重命名设备类型
  116. ObjectNode renameNode = !newDict ? configService.queryRenameEquipTypes(projectId) : null;
  117. LinkedList<TypeDef> sysList = new LinkedList<>();
  118. LinkedList<TypeDef> equipList = new LinkedList<>();
  119. for(TypeDef def : typeList){
  120. if(def.getObjType().equals("system"))
  121. sysList.add(def);
  122. else if(def.getObjType().equals("equipment")) {
  123. if(!newDict) {
  124. if (renameNode != null) { //设备类型重命名
  125. JsonNode n = renameNode.get(def.getCode());
  126. if(n != null)
  127. def.setName(n.asText());
  128. }
  129. }
  130. equipList.add(def);
  131. }
  132. }
  133. //加载新增的自定义设备类
  134. // try{
  135. // Resource resource = resourceLoader.getResource("classpath:equip.json");
  136. // List<TypeDef> types = objectMapper.readValue(resource.getInputStream(), new TypeReference<List<TypeDef>>(){});
  137. // equipList.addAll(types);
  138. // }catch (Exception e) {
  139. //
  140. // }
  141. if(!newDict) {
  142. ArrayNode arr = configService.queryNewEquipTypes(projectId);
  143. if(arr != null) {
  144. try{
  145. List<TypeDef> types = objectMapper.readValue(objectMapper.writeValueAsString(arr), new TypeReference<List<TypeDef>>(){});
  146. equipList.addAll(types);
  147. }catch (Exception e) {
  148. }
  149. }
  150. }
  151. Dict data = new Dict();
  152. data.setMajor(majorList);
  153. data.setSystem(sysList);
  154. data.setEquipment(equipList);
  155. //查询关系定义
  156. if(includeRel) {
  157. List<RelationDefine> relList = ServiceUtil.call(() -> rwdClient.queryRelDef(groupCode, projectId, AdmConst.APP_ID, userId, new QueryCriteria()));
  158. data.setRelation(relList);
  159. }
  160. //查询信息点定义
  161. if(includeInfos) {
  162. QueryCriteria qc = new QueryCriteria();
  163. qc.setCriteria(objectMapper.createObjectNode());
  164. List<InfoDef> funcList = ServiceUtil.call(() -> rwdClient.queryFunc(groupCode, projectId, AdmConst.APP_ID, userId, qc));
  165. data.setInfos(funcList);
  166. }
  167. return data;
  168. }
  169. private <T> List<T> queryAllPage(Supplier<CommonResult<List<T>>> action, QueryCriteria criteria, Pagination pagination){
  170. List<T> list = null;
  171. while (pagination.isHasNext()){
  172. criteria.setPage((long)pagination.getPageNum());
  173. criteria.setSize((long)pagination.getPageSize());
  174. if(list == null)
  175. list = ServiceUtil.call(action, pagination);
  176. else
  177. list.addAll(ServiceUtil.call(action, pagination));
  178. pagination.next();
  179. }
  180. return list;
  181. }
  182. @Override
  183. public Map<String, Object> downloadFrameData(String groupCode, String projectId, String userId) {
  184. List<OProject> prjList = null;
  185. String token = queryOldAdm.login();
  186. if(StrUtil.isNotBlank(token))
  187. prjList = queryOldAdm.queryProject(token, groupCode, projectId);
  188. else
  189. throw new CallException(new AdmResult(ResponseCode.A0220.getCode(), "ADM platform: " + ResponseCode.A0220.getDesc()));
  190. String[] prjIds = new String[prjList.size()];
  191. for (int i = 0; i < prjIds.length; i++) {
  192. prjIds[i] = prjList.get(i).getId();
  193. }
  194. List<AdmObject> bdAndFl = objectService.queryBdAndFl(prjIds);
  195. HashMap<String, Object> data = new HashMap<>();
  196. data.put("projects", prjList);
  197. data.put("buildingsAndFloors", serializeJsonProp(bdAndFl));
  198. return data;
  199. }
  200. @Override
  201. public BuildingData downloadBuildingData(String projectId, String buildingId, String uploadFlag, String lastDownloadTime) {
  202. List<AdmObject> bdData = admObjMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmObject>(), projectId, buildingId, uploadFlag, lastDownloadTime));
  203. List<AdmRelation> bdRel = relationMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmRelation>(), projectId, buildingId, uploadFlag, lastDownloadTime));
  204. List<AdmPipe> pipes = pipeMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmPipe>(), projectId, buildingId, uploadFlag, lastDownloadTime));
  205. //任务相关数据查询
  206. List<AdmJobSpace> jobSpace = jobSpaceMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmJobSpace>(), projectId, buildingId, uploadFlag, lastDownloadTime));
  207. List<AdmProblemArch> problemArch = problemArchMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmProblemArch>(), projectId, buildingId, uploadFlag, lastDownloadTime));
  208. List<AdmProblemEquip> problemEquip = problemEquipMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmProblemEquip>(), projectId, buildingId, uploadFlag, lastDownloadTime));
  209. List<AdmFile> file = fileMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmFile>(), projectId, buildingId, uploadFlag, lastDownloadTime));
  210. List<AdmQrCode> qrCode = qrCodeMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmQrCode>(), projectId, buildingId, uploadFlag, lastDownloadTime));
  211. List<AdmServeArea> serveArea = serveAreaMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmServeArea>(), projectId, buildingId, uploadFlag, lastDownloadTime));
  212. BuildingData data = new BuildingData();
  213. data.setBuildingId(buildingId);
  214. data.setObjects(serializeJsonProp(bdData));
  215. data.setRelations(bdRel);
  216. data.setPipes(serializeJsonProp(pipes));
  217. data.setJobSpace(serializeJsonProp(jobSpace));
  218. data.setProblemArch(serializeJsonProp(problemArch));
  219. data.setProblemEquip(problemEquip);
  220. data.setFile(file);
  221. data.setQrCode(serializeJsonProp(qrCode));
  222. data.setServeArea(serveArea);
  223. data.setTimestamp(DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN));
  224. return data;
  225. }
  226. private <T> QueryWrapper<T> buildDownloadQueryWrapper(QueryWrapper<T> wrapper, String projectId, String buildingId, String uploadFlag, String lastDownloadTime){
  227. wrapper.eq("project_id", projectId).eq("building_id", buildingId);
  228. applyUploadFlag(wrapper, uploadFlag,lastDownloadTime);
  229. return wrapper;
  230. }
  231. private void applyUploadFlag(QueryWrapper<?> wrapper, String uploadFlag, String lastDownloadTime){
  232. if (StrUtil.isNotBlank(lastDownloadTime)) { //非初始化下载
  233. if (StrUtil.isNotBlank(uploadFlag))
  234. wrapper.and(w -> w.isNull("upload_flag").or().ne("upload_flag", uploadFlag));
  235. wrapper.and(
  236. w -> w.isNotNull("modified_time").gt("modified_time", lastDownloadTime)
  237. .or()
  238. .isNull("modified_time").gt("creation_time", lastDownloadTime)
  239. );
  240. }
  241. }
  242. @Override
  243. public BuildingData downloadBuildingData(String groupCode, String projectId, String userId, String uploadFlag, String buildingId, Long bdtpDownloadTs, Long admDownloadTs) {
  244. throw new RuntimeException("not supported");
  245. }
  246. @Override
  247. public ProjectData downloadProjectData(String groupCode, String projectId, String userId, String uploadFlag, Long bdtpDownloadTs, Long admDownloadTs) {
  248. throw new RuntimeException("not supported");
  249. }
  250. @Override
  251. @Transactional(rollbackFor = Exception.class)
  252. public UploadRtn uploadData(UploadData uploadData, String groupCode, String projectId, String userId, String uploadFlag) {
  253. UploadRtn rtn = new UploadRtn();
  254. String timestamp = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN);
  255. if (CollUtil.isNotEmpty(uploadData.getObjects())) {
  256. List<AdmObject> dbObjs = admObjMapper.selectList(new QueryWrapper<AdmObject>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
  257. List<AdmObject> expired = uploadAdmData(deserializeJsonProp(toEntities(uploadData.getObjects(), AdmObject.class)), dbObjs, uploadFlag, timestamp, admObjMapper, "object");
  258. rtn.setExpiredObjectIds(buildExpiredIds(expired));
  259. }
  260. if (CollUtil.isNotEmpty(uploadData.getRelations())) {
  261. List<AdmRelation> dbObjs = relationMapper.selectList(new QueryWrapper<AdmRelation>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
  262. List<AdmRelation> expired = uploadAdmData(toEntities(uploadData.getRelations(), AdmRelation.class), dbObjs, uploadFlag, timestamp, relationMapper, "relation");
  263. rtn.setExpiredRelationIds(buildExpiredIds(expired));
  264. }
  265. if (CollUtil.isNotEmpty(uploadData.getPipes())) {
  266. List<AdmPipe> dbObjs = pipeMapper.selectList(new QueryWrapper<AdmPipe>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
  267. List<AdmPipe> expired = uploadAdmData(deserializeJsonProp(uploadData.getPipes()), dbObjs, uploadFlag, timestamp, pipeMapper, "pipe");
  268. rtn.setExpiredPipeIds(buildExpiredIds(expired));
  269. }
  270. if (CollUtil.isNotEmpty(uploadData.getJobSpace())) {
  271. List<AdmJobSpace> dbObjs = jobSpaceMapper.selectList(new QueryWrapper<AdmJobSpace>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
  272. List<AdmJobSpace> expired = uploadAdmData(deserializeJsonProp(uploadData.getJobSpace()), dbObjs, uploadFlag, timestamp, jobSpaceMapper, null);
  273. rtn.setExpiredJobSpaceIds(buildExpiredIds(expired));
  274. }
  275. if (CollUtil.isNotEmpty(uploadData.getProblemArch())) {
  276. List<AdmProblemArch> dbObjs = problemArchMapper.selectList(new QueryWrapper<AdmProblemArch>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
  277. List<AdmProblemArch> expired = uploadAdmData(deserializeJsonProp(uploadData.getProblemArch()), dbObjs, uploadFlag, timestamp, problemArchMapper, null);
  278. rtn.setExpiredProblemArchIds(buildExpiredIds(expired));
  279. }
  280. if (CollUtil.isNotEmpty(uploadData.getProblemEquip())) {
  281. List<AdmProblemEquip> dbObjs = problemEquipMapper.selectList(new QueryWrapper<AdmProblemEquip>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
  282. List<AdmProblemEquip> expired = uploadAdmData(uploadData.getProblemEquip(), dbObjs, uploadFlag, timestamp, problemEquipMapper, null);
  283. rtn.setExpiredProblemEquipIds(buildExpiredIds(expired));
  284. }
  285. if (CollUtil.isNotEmpty(uploadData.getFile())) {
  286. List<AdmFile> dbObjs = fileMapper.selectList(new QueryWrapper<AdmFile>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
  287. List<AdmFile> expired = uploadAdmData(uploadData.getFile(), dbObjs, uploadFlag, timestamp, fileMapper, null);
  288. rtn.setExpiredFileIds(buildExpiredIds(expired));
  289. }
  290. if (CollUtil.isNotEmpty(uploadData.getQrCode())) {
  291. List<AdmQrCode> dbObjs = qrCodeMapper.selectList(new QueryWrapper<AdmQrCode>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
  292. List<AdmQrCode> expired = uploadAdmData(deserializeJsonProp(uploadData.getQrCode()), dbObjs, uploadFlag, timestamp, qrCodeMapper, null);
  293. rtn.setExpiredQrCodeIds(buildExpiredIds(expired));
  294. }
  295. if (CollUtil.isNotEmpty(uploadData.getServeArea())) {
  296. List<AdmServeArea> dbObjs = serveAreaMapper.selectList(new QueryWrapper<AdmServeArea>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
  297. List<AdmServeArea> expired = uploadAdmData(uploadData.getServeArea(), dbObjs, uploadFlag, timestamp, serveAreaMapper, null);
  298. rtn.setExpiredServeAreaIds(buildExpiredIds(expired));
  299. }
  300. rtn.setTimestamp(timestamp);
  301. rtn.setBuildingId(uploadData.getBuildingId());
  302. return rtn;
  303. }
  304. private <T extends BaseAdmDataEntity> List<T> toEntities(List<ObjectNode> list, Class<T> cls){
  305. List<T> entities = new ArrayList<>(list.size());
  306. try {
  307. for(ObjectNode node : list) {
  308. entities.add(objectMapper.readValue(node.toString(), cls));
  309. }
  310. } catch (IOException e) {
  311. throw new BusinessException(ResponseCode.A0427.getCode(), ResponseCode.A0427.getDesc());
  312. }
  313. return entities;
  314. }
  315. private <T extends BaseAdmDataEntity> List<T> uploadAdmData(List<T> objs, List<T> dbObjs, String uploadFlag, String timestamp, BaseMapper<T> mapper, String d2mType){
  316. List<T> expired = new ArrayList<>();
  317. HashMap<String, T> dbMap = new HashMap<>(dbObjs.size());
  318. for(T dbObj : dbObjs) {
  319. dbMap.put(dbObj.getId(), dbObj);
  320. }
  321. List<T> msgAdd = new ArrayList<>();
  322. List<T> msgModify = new ArrayList<>();
  323. List<T> msgRemove = new ArrayList<>();
  324. for (T obj : objs) {
  325. if(obj == null)
  326. continue;
  327. logService.saveUploadLog(new AdmUploadLog(uploadFlag, timestamp, obj));
  328. T dbObj = dbMap.get(obj.getId());
  329. if (dbObj == null) {
  330. if(obj.getValid().intValue() == ValidEnum.FALSE.getType())
  331. continue;
  332. obj.setCreationTime(timestamp);
  333. obj.setCreator(AdmConst.CREATOR_APP);
  334. obj.setUploadFlag(uploadFlag);
  335. if(d2mType != null)
  336. setDeliveryDataProps((BaseDeliveryEntity) obj, null);
  337. mapper.insert(obj);
  338. if(d2mType != null)
  339. msgAdd.add(obj);
  340. } else {
  341. // String dbTs;
  342. // String ts;
  343. // if(dbObj.getModifiedTime() != null){
  344. // dbTs = dbObj.getModifiedTime();
  345. // ts = obj.getModifiedTime();
  346. // } else {
  347. // dbTs = dbObj.getCreationTime();
  348. // ts = obj.getCreationTime();
  349. // }
  350. // if (!dbTs.equals(ts)) {
  351. // //TODO 时间戳不一致,离线数据无效,暂时跳过处理
  352. // expired.add(obj);
  353. // } else {
  354. obj.setModifiedTime(timestamp);
  355. obj.setModifier(AdmConst.CREATOR_APP);
  356. obj.setUploadFlag(uploadFlag);
  357. if(d2mType != null)
  358. setDeliveryDataProps((BaseDeliveryEntity) obj, null);
  359. //合并信息点
  360. if(dbObj instanceof AdmObject && obj instanceof AdmObject)
  361. ((AdmObject) obj).setInfos(mergeInfos(((AdmObject) obj).getInfos(), ((AdmObject) dbObj).getInfos()));
  362. else if(dbObj instanceof AdmPipe && obj instanceof AdmPipe)
  363. ((AdmPipe) obj).setInfos(mergeInfos(((AdmPipe) obj).getInfos(), ((AdmPipe) dbObj).getInfos()));
  364. mapper.updateById(obj);
  365. if(d2mType != null) {
  366. if(obj.getValid().intValue() == ValidEnum.FALSE.getType())
  367. msgRemove.add(obj);
  368. else
  369. msgModify.add(obj);
  370. }
  371. // }
  372. }
  373. }
  374. if(d2mType != null)
  375. sendD2mMessage(d2mType, msgAdd, msgModify, msgRemove);
  376. return expired;
  377. }
  378. private void setDeliveryDataProps(BaseDeliveryEntity obj, BaseDeliveryEntity dbObj){
  379. obj.setD2mState(ValidEnum.FALSE.getType());
  380. obj.setDeliveryState(ValidEnum.FALSE.getType());
  381. if(dbObj != null) {
  382. obj.setClientId(dbObj.getClientId());
  383. obj.setClientDevice(dbObj.getClientDevice());
  384. }
  385. }
  386. private ObjectNode mergeInfos(ObjectNode infos, ObjectNode dbInfos){
  387. if(dbInfos != null) {
  388. if(infos != null)
  389. dbInfos.setAll(infos);
  390. return dbInfos;
  391. } else
  392. return infos;
  393. }
  394. private void sendD2mMessage(String objectType, List<?> msgAdd, List<?> msgModify, List<?> msgRemove){
  395. D2mMessage message = new D2mMessage();
  396. message.setItemType(objectType);
  397. message.setAddItems(msgAdd);
  398. message.setModifyItems(msgModify);
  399. message.setRemoveItems(msgRemove);
  400. if(message.isNotEmpty())
  401. syncModel.sendMessageToModel(message);
  402. }
  403. private List<String> buildExpiredIds(List<? extends BaseAdmDataEntity> expired){
  404. if(expired.size() > 0) {
  405. List<String> ids = new ArrayList<>();
  406. for(BaseAdmDataEntity entity : expired) {
  407. ids.add(entity.getId());
  408. }
  409. return ids;
  410. }
  411. return null;
  412. }
  413. private <T extends BaseAdmEntity> List<T> serializeJsonProp(List<T> list){
  414. //app端完善,不需要做tostr处理了
  415. // for(BaseAdmEntity entity : list) {
  416. // entity.serializeJsonProp();
  417. // }
  418. return list;
  419. }
  420. private <T extends BaseAdmEntity> List<T> deserializeJsonProp(List<T> list){
  421. for(BaseAdmEntity entity : list) {
  422. entity.deserializeJsonProp();
  423. }
  424. return list;
  425. }
  426. }