Browse Source

2021-1125
bug修复;数模同步消息完善

zhaoyk 3 years ago
parent
commit
24fa659bd7

+ 12 - 8
src/main/java/com/persagy/bdtp/adm/common/AdmRequest.java

@@ -8,26 +8,30 @@ public class AdmRequest {
 
 	private String userId;
 
-	private String projectId;
+	private String clientId;
 
 	private String groupCode;
 
-	private String buildingId;
+	private String projectId;
 
-	private String floorId;
 
-	private String clientId;
+	private String buildingId;
 
-	/** 待废弃 */
-	private String lastDownloadTime;
+	private String floorId;
 
-	/** 待废弃 */
-	private String uploadFlag;
 
 	private Long bdtpDownloadTs;
 
 	private Long admDownloadTs;
 
+
 	private UploadData uploadData;
 
+
+	/** 待废弃 */
+	private String lastDownloadTime;
+
+	/** 待废弃 */
+	private String uploadFlag;
+
 }

+ 11 - 0
src/main/java/com/persagy/bdtp/adm/dao/AdmMessagePMapper.java

@@ -0,0 +1,11 @@
+package com.persagy.bdtp.adm.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.bdtp.adm.entity.db.AdmJobSpace;
+import com.persagy.bdtp.adm.entity.db.AdmMessageP;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface AdmMessagePMapper extends BaseMapper<AdmMessageP> {
+
+}

+ 6 - 0
src/main/java/com/persagy/bdtp/adm/entity/D2mMessage.java

@@ -1,6 +1,8 @@
 package com.persagy.bdtp.adm.entity;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.IdUtil;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Data;
 
 import java.util.ArrayList;
@@ -9,6 +11,8 @@ import java.util.List;
 @Data
 public class D2mMessage {
 
+	private String id;
+
 	private String itemType; //object|relation|pipe
 
 	private List<Object> addItems;
@@ -18,6 +22,7 @@ public class D2mMessage {
 	private List<Object> removeItems;
 
 	public D2mMessage(String itemType) {
+		this.id = IdUtil.simpleUUID();
 		this.itemType = itemType;
 	}
 
@@ -39,6 +44,7 @@ public class D2mMessage {
 		removeItems.add(item);
 	}
 
+	@JsonIgnore
 	public boolean isNotEmpty(){
 		return CollUtil.isNotEmpty(addItems) || CollUtil.isNotEmpty(modifyItems) || CollUtil.isNotEmpty(removeItems);
 	}

+ 6 - 3
src/main/java/com/persagy/bdtp/adm/entity/UploadData.java

@@ -16,9 +16,6 @@ public class UploadData {
 	/** 上传任务id */
 	private String uploadJobId;
 
-	/** 待废弃 */
-	private String buildingId;
-
 	private List<ObjectNode> objects;
 
 	private List<ObjectNode> relations;
@@ -35,8 +32,14 @@ public class UploadData {
 
 	private List<AdmQrCode> qrCode;
 
+
+	/** 待废弃 */
 	private List<AdmServeArea> serveArea;
 
+	/** 待废弃 */
+	private String buildingId;
+
+
 	public boolean notEmpty() {
 		return CollUtil.isNotEmpty(objects) || CollUtil.isNotEmpty(relations)
 				|| CollUtil.isNotEmpty(pipes)

+ 35 - 0
src/main/java/com/persagy/bdtp/adm/entity/db/AdmMessageP.java

@@ -0,0 +1,35 @@
+package com.persagy.bdtp.adm.entity.db;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.fasterxml.jackson.databind.JsonNode;
+import lombok.Data;
+
+import java.sql.Timestamp;
+
+@Data
+@TableName(value = "adm_message_p", autoResultMap = true)
+public class AdmMessageP extends BaseAdmEntity {
+
+	private String triggerType;
+
+	private String sender;
+
+	private String status;
+
+	private Timestamp sendTime;
+
+	private Timestamp returnTime;
+
+	@TableField(
+			typeHandler = JacksonTypeHandler.class
+	)
+	private Object content;
+
+	@TableField(
+			typeHandler = JacksonTypeHandler.class
+	)
+	private Object returnContent;
+
+}

+ 41 - 2
src/main/java/com/persagy/bdtp/adm/handler/M2DMessageHandler.java

@@ -1,7 +1,10 @@
 package com.persagy.bdtp.adm.handler;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.persagy.bdtp.adm.common.AdmConst;
 import com.persagy.bdtp.adm.common.AdmMessageConst;
+import com.persagy.bdtp.adm.dao.AdmMessagePMapper;
+import com.persagy.bdtp.adm.entity.db.AdmMessageP;
 import com.persagy.dmp.amqp.handler.AbstractRabbitHandlerTemplate;
 import com.rabbitmq.client.Channel;
 import lombok.extern.slf4j.Slf4j;
@@ -10,7 +13,10 @@ import org.springframework.amqp.rabbit.annotation.RabbitListener;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.io.IOException;
+import java.sql.Timestamp;
 import java.util.Date;
+import java.util.Map;
 
 @Slf4j
 @Component
@@ -20,6 +26,9 @@ public class M2DMessageHandler extends AbstractRabbitHandlerTemplate {
     @Autowired
     private ObjectMapper objectMapper;
 
+    @Autowired
+    private AdmMessagePMapper messageMapper;
+
     /**
      * 消费
      * @param message 消息体字符串
@@ -28,8 +37,38 @@ public class M2DMessageHandler extends AbstractRabbitHandlerTemplate {
      */
     @Override
     protected void handler(String message, Channel channel, Message vo) {
-        //objectMapper.readValue(message, ProjectMessageVO.class);
-        System.out.println(new Date() + ": " + message);
+        Map<String, Object> msg = null;
+        try {
+            msg = objectMapper.readValue(message, Map.class);
+        }catch (IOException e){
+            throw new RuntimeException(e);
+        }
+
+        if(msg != null)
+            handleD2mReply(msg);
+    }
+
+    private void handleD2mReply(Map<String, Object> reply){
+        String id = (String) reply.get("id");
+        String result = (String) reply.get("result");
+        Object content = reply.get("content");
+
+        AdmMessageP message = messageMapper.selectById(id);
+        if (message != null) {
+            boolean flag = "success".equals(result);
+
+            message.setStatus(flag ? AdmConst.UPLOAD_FINISHED : AdmConst.UPLOAD_ERROR);
+            message.setReturnContent(content);
+            message.setReturnTime(new Timestamp(new Date().getTime()));
+            messageMapper.updateById(message);
+
+            if(!flag)
+                handleD2mError();
+        }
+    }
+
+    private void handleD2mError(){
+        //TODO
     }
 
 }

+ 51 - 34
src/main/java/com/persagy/bdtp/adm/service/impl/SyncAppImpl.java

@@ -85,6 +85,9 @@ public class SyncAppImpl implements ISyncApp {
 	@Autowired
 	private AdmUploadJobMapper uploadJobMapper;
 
+	@Autowired
+	private AdmMessagePMapper messageMapper;
+
 	private final ObjectMapper4Tx mapper4Tx;
 
 	@Autowired
@@ -382,7 +385,7 @@ public class SyncAppImpl implements ISyncApp {
 				List<ObjectNode>[] objData = prepareBdtpData(uploadData.getObjects(), operator, timestamp, uploadData.getUploadJobId(), d2mMessage, logs);
 				uploadObjs(groupCode, projectId, userId, objData);
 
-				sendD2mMessage(d2mMessage);
+				sendD2mMessage(d2mMessage, projectId, uploadData.getUploadJobId());
 			}
 			if (CollUtil.isNotEmpty(uploadData.getRelations())) {
 				List<ObjectNode>[] relData = prepareBdtpData(uploadData.getRelations(), operator, timestamp, uploadData.getUploadJobId(), null, logs);
@@ -390,7 +393,7 @@ public class SyncAppImpl implements ISyncApp {
 			}
 
 			//上传adm数据
-			uploadAdmData(uploadData, operator, timestamp, logs);
+			uploadAdmData(uploadData, operator, timestamp, projectId, logs);
 		} catch (Exception e) {
 			markStatus(uploadData.getUploadJobId(), AdmConst.UPLOAD_ERROR);
 
@@ -419,7 +422,7 @@ public class SyncAppImpl implements ISyncApp {
 			job.setProjectId(projectId);
 			job.setOperator(operator);
 			job.setStatus(AdmConst.UPLOAD_PROCESSING);
-			job.setStartTime(new Timestamp(new Date().getTime()));
+			job.setStartTime(new Timestamp(System.currentTimeMillis()));
 			uploadJobMapper.insert(job);
 		}
 		return null;
@@ -429,7 +432,7 @@ public class SyncAppImpl implements ISyncApp {
 		AdmUploadJob job = new AdmUploadJob();
 		job.setId(uploadJobId);
 		job.setStatus(status);
-		job.setFinishTime(new Timestamp(new Date().getTime()));
+		job.setFinishTime(new Timestamp(System.currentTimeMillis()));
 		uploadJobMapper.updateById(job);
 	}
 
@@ -463,7 +466,7 @@ public class SyncAppImpl implements ISyncApp {
 				boolean remove = entity.get("valid").asInt() == ValidEnum.FALSE.getType();
 
 				//设备数据上传时向模型服务发同步消息
-				if(d2mMessage != null && AdmConst.OBJ_TYPE_EQUIPMENT.equals(entity.get("objType"))) {
+				if(d2mMessage != null && needsD2m(entity)) {
 					if(remove)
 						d2mMessage.appendRemoveItem(entity);
 					else
@@ -480,7 +483,7 @@ public class SyncAppImpl implements ISyncApp {
 				//TODO 可能需要进行删除信息点操作
 
 			} else {
-				if(d2mMessage != null)
+				if(d2mMessage != null && needsD2m(entity))
 					d2mMessage.appendAddItem(entity);
 
 				log = new AdmUploadLog(jobId, operator, AdmUploadLog.ADD);
@@ -500,33 +503,37 @@ public class SyncAppImpl implements ISyncApp {
 		return new List[] {list, updateList};
 	}
 
+	private boolean needsD2m(ObjectNode node){
+		return node != null && node.get("objType") != null && AdmConst.OBJ_TYPE_EQUIPMENT.equals(node.get("objType").asText());
+	}
+
 	@Transactional(rollbackFor = Exception.class)
-	public void uploadAdmData(UploadData uploadData, String operator, String time, List<AdmUploadLog> logs) {
+	public void uploadAdmData(UploadData uploadData, String operator, String time, String projectId, List<AdmUploadLog> logs) {
 		if (CollUtil.isNotEmpty(uploadData.getPipes())) {
-			uploadAdmEntities(uploadData.getPipes(), operator, time, uploadData.getUploadJobId(), pipeMapper, new D2mMessage("pipe"), logs, true);
+			uploadAdmEntities(uploadData.getPipes(), operator, time, projectId, uploadData.getUploadJobId(), pipeMapper, new D2mMessage("pipe"), logs, true);
 		}
 
 		if (CollUtil.isNotEmpty(uploadData.getJobSpace())) {
-			uploadAdmEntities(uploadData.getJobSpace(), operator, time, uploadData.getUploadJobId(), jobSpaceMapper, null, logs, false);
+			uploadAdmEntities(uploadData.getJobSpace(), operator, time, projectId, uploadData.getUploadJobId(), jobSpaceMapper, null, logs, false);
 		}
 		if (CollUtil.isNotEmpty(uploadData.getProblemArch())) {
-			uploadAdmEntities(uploadData.getProblemArch(), operator, time, uploadData.getUploadJobId(), problemArchMapper, null, logs, false);
+			uploadAdmEntities(uploadData.getProblemArch(), operator, time, projectId, uploadData.getUploadJobId(), problemArchMapper, null, logs, false);
 		}
 		if (CollUtil.isNotEmpty(uploadData.getProblemEquip())) {
-			uploadAdmEntities(uploadData.getProblemEquip(), operator, time, uploadData.getUploadJobId(), problemEquipMapper, null, logs, false);
+			uploadAdmEntities(uploadData.getProblemEquip(), operator, time, projectId, uploadData.getUploadJobId(), problemEquipMapper, null, logs, false);
 		}
 		if (CollUtil.isNotEmpty(uploadData.getFile())) {
-			uploadAdmEntities(uploadData.getFile(), operator, time, uploadData.getUploadJobId(), fileMapper, null, logs, false);
+			uploadAdmEntities(uploadData.getFile(), operator, time, projectId, uploadData.getUploadJobId(), fileMapper, null, logs, false);
 		}
 		if (CollUtil.isNotEmpty(uploadData.getQrCode())) {
-			uploadAdmEntities(uploadData.getQrCode(), operator, time, uploadData.getUploadJobId(), qrCodeMapper, null, logs, false);
+			uploadAdmEntities(uploadData.getQrCode(), operator, time, projectId, uploadData.getUploadJobId(), qrCodeMapper, null, logs, false);
 		}
 		if (CollUtil.isNotEmpty(uploadData.getServeArea())) {
-			uploadAdmEntities(uploadData.getServeArea(), operator, time, uploadData.getUploadJobId(), serveAreaMapper, null, logs, false);
+			uploadAdmEntities(uploadData.getServeArea(), operator, time, projectId, uploadData.getUploadJobId(), serveAreaMapper, null, logs, false);
 		}
 	}
 
-	private <T extends BaseAdmDataEntity> void uploadAdmEntities(List<T> list, String operator, String time, String jobId, BaseMapper<T> mapper, D2mMessage d2mMessage, List<AdmUploadLog> logs, boolean merge) {
+	private <T extends BaseAdmDataEntity> void uploadAdmEntities(List<T> list, String operator, String time, String projectId, String jobId, BaseMapper<T> mapper, D2mMessage d2mMessage, List<AdmUploadLog> logs, boolean merge) {
 		List<T> updateList = new ArrayList<>();
 		Iterator<T> iter = list.iterator();
 		while (iter.hasNext()) {
@@ -596,7 +603,7 @@ public class SyncAppImpl implements ISyncApp {
 			}
 		}
 
-		sendD2mMessage(d2mMessage);
+		sendD2mMessage(d2mMessage, projectId, jobId);
 	}
 
 	private <T extends BaseAdmDataEntity> T mergeEntity(T obj, T dbObj) {
@@ -616,23 +623,24 @@ public class SyncAppImpl implements ISyncApp {
 			return infos;
 	}
 
-	private void sendD2mMessage(D2mMessage d2mMessage){
+	private void sendD2mMessage(D2mMessage d2mMessage, String projectId, String jobId){
 		if (d2mMessage != null && d2mMessage.isNotEmpty()) {
-			if(d2mMessage.getAddItems() != null){
-				for(Object o : d2mMessage.getAddItems()) {
-					markM2dState(o);
-				}
-			}
-			if(d2mMessage.getModifyItems() != null){
-				for(Object o : d2mMessage.getModifyItems()) {
-					markM2dState(o);
-				}
-			}
-			if(d2mMessage.getRemoveItems() != null) {
-				for(Object o : d2mMessage.getRemoveItems()) {
-					markM2dState(o);
-				}
-			}
+//			if(d2mMessage.getAddItems() != null){
+//				for(Object o : d2mMessage.getAddItems()) {
+//					markM2dState(o);
+//				}
+//			}
+//			if(d2mMessage.getModifyItems() != null){
+//				for(Object o : d2mMessage.getModifyItems()) {
+//					markM2dState(o);
+//				}
+//			}
+//			if(d2mMessage.getRemoveItems() != null) {
+//				for(Object o : d2mMessage.getRemoveItems()) {
+//					markM2dState(o);
+//				}
+//			}
+			markM2dState(d2mMessage, projectId, jobId);
 			syncModel.sendMessageToModel(d2mMessage);
 		}
 	}
@@ -657,8 +665,17 @@ public class SyncAppImpl implements ISyncApp {
 		}
 	}
 
-	private void markM2dState(Object item){
-		//TODO 标记数据同步状态
+	private void markM2dState(D2mMessage d2mMessage, String projectId, String jobId){
+		AdmMessageP message = new AdmMessageP();
+		message.setId(d2mMessage.getId());
+		message.setProjectId(projectId);
+		message.setTriggerType("upload");
+		message.setSender(jobId);
+		message.setContent(d2mMessage);
+		message.setStatus(AdmConst.UPLOAD_PROCESSING);
+		message.setSendTime(new Timestamp(System.currentTimeMillis()));
+
+		messageMapper.insert(message);
 	}
 
 }

+ 1 - 1
src/main/java/com/persagy/bdtp/adm/util/DataExtrasUtil.java

@@ -13,7 +13,7 @@ import java.util.Iterator;
 
 public class DataExtrasUtil {
 
-	private static HashSet<String> admObjFields = getEntityFields(ObjectDigital.class, "buildingId", "floorId", "bimId");
+	private static HashSet<String> admObjFields = getEntityFields(ObjectDigital.class, "buildingId", "floorId", "bimId", "containerId");
 
 	private static String objExtraCol = "infos";
 

+ 1 - 1
src/main/resources/application-dev.yml

@@ -8,7 +8,7 @@ spring:
           driver-class-name: com.mysql.cj.jdbc.Driver
           username: adm
           password: adm
-          url: jdbc:mysql://192.168.0.11/adm?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT
+          url: jdbc:mysql://192.168.0.11/adm?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=Asia/Shanghai
   rabbitmq:
     host: 192.168.100.93
     port: 9936

+ 1 - 1
src/main/resources/application-test.yml

@@ -8,7 +8,7 @@ spring:
           driver-class-name: com.mysql.cj.jdbc.Driver
           username: root
           password: Bdtp@1qaz@WSX
-          url: jdbc:mysql://10.0.0.5:3306/adm-poc?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT
+          url: jdbc:mysql://10.0.0.5:3306/adm-poc?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=Asia/Shanghai
   rabbitmq:
     host: 82.156.204.212
     port: 9936

+ 12 - 5
src/test/java/com/persagy/bdtp/adm/test/AdmApplicationTests.java

@@ -346,11 +346,13 @@ public class AdmApplicationTests {
 
 		List<ObjectInfoDefine> myInfos = new ArrayList<>();
 
-		myInfos.add(newInfo("equipContent", "文字描述", "STRING", groupCode));
-		myInfos.add(newInfo("equipPhoto", "设备图片", "STRING", groupCode));
-		myInfos.add(newInfo("equipCheck", "交付工作状态", "INTEGER", groupCode));
-		myInfos.add(newInfo("zRegion", "高度", "STRING", groupCode));
-		myInfos.add(newInfo("compType", "构件类型", "STRING", groupCode));
+//		myInfos.add(newInfo("equipContent", "文字描述", "STRING", groupCode));
+//		myInfos.add(newInfo("equipPhoto", "设备图片", "STRING", groupCode));
+//		myInfos.add(newInfo("equipCheck", "交付工作状态", "INTEGER", groupCode));
+//		myInfos.add(newInfo("zRegion", "高度", "STRING", groupCode));
+//		myInfos.add(newInfo("compType", "构件类型", "STRING", groupCode));
+
+		myInfos.add(newInfo("containerId", "所属容器设备id", "STRING", groupCode));
 
 		CommonResult<List<ObjectInfoDefine>> rtn = infoClient.createBatch(groupCode, projectId, AdmConst.APP_ID, userId, myInfos);
 	}
@@ -364,6 +366,11 @@ public class AdmApplicationTests {
 		info.setClassCode(AdmConst.OBJ_TYPE_EQUIPMENT);
 		info.setDataType(dataType);
 		info.setGroupCode(groupCode);
+
+		info.setCategory("STATIC");
+		info.setFirstTag("交付工具");
+		info.setValid(1);
+
 		return info;
 	}