yanguofeng %!s(int64=3) %!d(string=hai) anos
pai
achega
50e04ad5d8

+ 12 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/custom/controller/AppController.java

@@ -3,6 +3,7 @@ package com.persagy.adm.server.custom.controller;
 import cn.hutool.core.util.StrUtil;
 import com.persagy.adm.server.custom.common.AdmRequest;
 import com.persagy.adm.server.custom.datatx.DataTxHandler;
+import com.persagy.adm.server.custom.dto.HasUpdateReq;
 import com.persagy.adm.server.custom.entity.ConfigData;
 import com.persagy.adm.server.custom.entity.Dict;
 import com.persagy.adm.server.custom.entity.DownLoadData;
@@ -15,6 +16,7 @@ import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.common.utils.ResultHelper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -84,4 +86,14 @@ public class AppController {
 		return ResultHelper.single(syncApp.uploadData(admRequest.getUploadData(), admRequest.getGroupCode(), admRequest.getProjectId(), admRequest.getUserId(), admRequest.getClientId()));
 	}
 
+	/**
+	 * 是否有数据更新
+	 */
+	@PostMapping("/hasUpdate")
+	public CommonResult<Boolean> hasUpdate(@RequestBody HasUpdateReq hasUpdateReq){
+		return ResultHelper.single(syncApp.hasUpdate(hasUpdateReq));
+	}
+
+
+
 }

+ 12 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/custom/dto/HasUpdateReq.java

@@ -0,0 +1,12 @@
+package com.persagy.adm.server.custom.dto;
+
+import lombok.Data;
+
+@Data
+public class HasUpdateReq {
+    private String groupCode;
+    private String projectId;
+    private Long downloadBdtpTs;
+    private Long downloadAdmTs;
+    private Long downLoadObjRelTs;
+}

+ 7 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/custom/entity/db/AdmCad.java

@@ -6,6 +6,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.io.Serializable;
+import java.sql.Timestamp;
 
 /**
  * <p>
@@ -67,5 +68,11 @@ public class AdmCad extends AuditableEntity<AdmCad> implements Serializable {
     @TableField("project_id")
     private String projectId;
 
+    /**
+     * 乐观锁时间戳
+     */
+    @TableField("ts")
+    private Timestamp ts;
+
 
 }

+ 6 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/custom/entity/db/AdmProblem.java

@@ -26,6 +26,12 @@ public class AdmProblem extends BaseAdmDataEntity implements Serializable {
     private String projectId;
 
     /**
+     * 集团编码
+     */
+    @TableField("group_code")
+    private String groupCode;
+
+    /**
      * 建筑id
      */
     @TableField("building_id")

+ 2 - 0
adm-business/adm-server/src/main/java/com/persagy/adm/server/custom/service/ISyncApp.java

@@ -1,5 +1,6 @@
 package com.persagy.adm.server.custom.service;
 
+import com.persagy.adm.server.custom.dto.HasUpdateReq;
 import com.persagy.adm.server.custom.entity.*;
 
 import java.util.Map;
@@ -29,4 +30,5 @@ public interface ISyncApp {
 
 	UploadRtn uploadData(UploadData uploadData, String groupCode, String projectId, String userId, String clientId);
 
+	boolean hasUpdate(HasUpdateReq hasUpdateReq);
 }

+ 110 - 1
adm-business/adm-server/src/main/java/com/persagy/adm/server/custom/service/impl/SyncAppImpl.java

@@ -12,11 +12,13 @@ import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.adm.server.auth.service.AdmAuthService;
 import com.persagy.adm.server.custom.client.DicClient;
 import com.persagy.adm.server.custom.client.RwdClient;
 import com.persagy.adm.server.custom.common.AdmConst;
 import com.persagy.adm.server.custom.dao.*;
 import com.persagy.adm.server.custom.datatx.ObjectMapper4Tx;
+import com.persagy.adm.server.custom.dto.HasUpdateReq;
 import com.persagy.adm.server.custom.dto.ObjectInfoCollectDTO;
 import com.persagy.adm.server.custom.dto.ObjectTypeCollectDTO;
 import com.persagy.adm.server.custom.dto.RelationDefineCollectDTO;
@@ -27,6 +29,7 @@ import com.persagy.adm.server.custom.service.*;
 import com.persagy.adm.server.custom.util.DataExtrasUtil;
 import com.persagy.dmp.basic.model.QueryCriteria;
 import com.persagy.dmp.common.constant.ValidEnum;
+import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.digital.client.DigitalObjectClient;
 import com.persagy.dmp.digital.client.DigitalRelationClient;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -99,6 +102,9 @@ public class SyncAppImpl implements ISyncApp {
 	AdmDefineProblemInfoMapper admDefineProblemInfoMapper;
 
 	@Autowired
+	private AdmAuthService admAuthService;
+
+	@Autowired
 	public SyncAppImpl(ObjectMapper4Tx mapper4Tx) {
 		this.mapper4Tx = mapper4Tx;
 	}
@@ -127,6 +133,7 @@ public class SyncAppImpl implements ISyncApp {
 		QueryCriteria criteria = ServiceUtil.getQueryCriteria(objectMapper,AdmConst.OBJ_TYPE_SYSTEM, AdmConst.OBJ_TYPE_EQUIPMENT);
 		// 增加现场交付查询条件
 		criteria.getCriteria().put("deliveryType", DeliveryTypeEnum.SCENE.getCode());
+		criteria.getCriteria().put("projectId", projectId);
 		List<ObjectTypeCollectDTO> typeList = ServiceUtil.queryAllPage(() -> rwdClient.queryDefineTypeCollect(groupCode, projectId, AdmConst.APP_ID, userId, criteria), criteria, new Pagination(500));
 
 
@@ -149,6 +156,7 @@ public class SyncAppImpl implements ISyncApp {
 			QueryCriteria queryCriteria = new QueryCriteria();
 			ObjectNode objectNode = objectMapper.createObjectNode();
 			objectNode.put("deliveryType",DeliveryTypeEnum.SCENE.getCode());
+			objectNode.put("projectId", projectId);
 			queryCriteria.setCriteria(objectNode);
 			List<RelationDefineCollectDTO> relList = ServiceUtil.call(() -> rwdClient.queryDefineRelCollect(groupCode, projectId, AdmConst.APP_ID, userId, queryCriteria));
 			data.setRelation(relList);
@@ -158,6 +166,7 @@ public class SyncAppImpl implements ISyncApp {
 		if(includeInfos) {
 			QueryCriteria qc = new QueryCriteria();
 			ObjectNode objectNode = objectMapper.createObjectNode();
+			objectNode.put("projectId", projectId);
 			objectNode.put("deliveryType",DeliveryTypeEnum.SCENE.getCode());
 			qc.setCriteria(objectNode);
 			List<ObjectInfoCollectDTO> funcList = ServiceUtil.call(() -> rwdClient.queryDefineInfoCollect(groupCode, projectId, AdmConst.APP_ID, userId, qc));
@@ -273,7 +282,7 @@ public class SyncAppImpl implements ISyncApp {
 		List<AdmProblem> problems = problemMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<>(),projectId,buildingId,operator,admDownloadTs));
 
 		// 下载ADM图纸
-		List<AdmCad> admCads = admCadMapper.selectList(new LambdaQueryWrapper<AdmCad>().eq(AdmCad::getProjectId,projectId).eq(AdmCad::getBuildingId,buildingId));
+		List<AdmCad> admCads = admCadMapper.selectList(new LambdaQueryWrapper<AdmCad>().eq(AdmCad::getProjectId,projectId).eq(AdmCad::getBuildingId,buildingId).gt(AdmCad::getTs,admDownloadTs));
 
 		List<AdmFile> file = fileMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmFile>(), projectId, buildingId, operator, admDownloadTs));
 		List<AdmQrCode> qrCode = qrCodeMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmQrCode>(), projectId, buildingId, operator, admDownloadTs));
@@ -429,6 +438,106 @@ public class SyncAppImpl implements ISyncApp {
 		return new UploadRtn(AdmConst.UPLOAD_FINISHED);
 	}
 
+
+	/**
+	 * app端是否有数据需要更新
+	 * @param hasUpdateReq 传各个数据类型的最后更新时
+	 * @return true/false
+	 */
+	@Override
+	public boolean hasUpdate(HasUpdateReq hasUpdateReq) {
+
+		// downloadAdmTs
+		// 1.问题数据最容易变化,优先检查 adm库
+		LambdaQueryWrapper<AdmProblem> hasProblemUpdated = new LambdaQueryWrapper<AdmProblem>().select(AdmProblem::getId)
+				.gt(AdmProblem::getTs, hasUpdateReq.getDownloadAdmTs())
+				.eq(AdmProblem::getGroupCode,hasUpdateReq.getGroupCode())
+				.eq(AdmProblem::getProjectId,hasUpdateReq.getProjectId())
+				.last("limit 1");
+		AdmProblem admProblem = problemMapper.selectOne(hasProblemUpdated);
+		if (admProblem != null){
+			return true;
+		}
+
+		// downloadAdmTs
+		//管道数据,实验方案
+		AdmPipe admPipe = pipeMapper.selectOne(new LambdaQueryWrapper<AdmPipe>().select(AdmPipe::getId).eq(AdmPipe::getProjectId, hasUpdateReq.getProjectId()).gt(AdmPipe::getTs, hasUpdateReq.getDownloadAdmTs()).last("limit 1"));
+		if (admPipe != null){
+			return true;
+		}
+
+		//任务相关数据查询
+		AdmJobSpace jobSpace = jobSpaceMapper.selectOne(new LambdaQueryWrapper<AdmJobSpace>().select(AdmJobSpace::getId).eq(AdmJobSpace::getProjectId,hasUpdateReq.getProjectId()).gt(AdmJobSpace::getTs,hasUpdateReq.getDownloadAdmTs()).last("limit 1"));
+		if (jobSpace != null){
+			return true;
+		}
+
+		// 下载ADM图纸
+		AdmCad admCad = admCadMapper.selectOne(new LambdaQueryWrapper<AdmCad>().select(AdmCad::getId).eq(AdmCad::getProjectId,hasUpdateReq.getProjectId()).gt(AdmCad::getTs,hasUpdateReq.getDownloadAdmTs()).last("limit 1"));
+		if(admCad != null){
+			return true;
+		}
+
+		// 文件附件
+		AdmFile file = fileMapper.selectOne(new LambdaQueryWrapper<AdmFile>().select(AdmFile::getId).eq(AdmFile::getProjectId,hasUpdateReq.getProjectId()).gt(AdmFile::getTs,hasUpdateReq.getDownloadAdmTs()).last("limit 1"));
+		if (file != null){
+			return true;
+		}
+
+		// 二维码
+		AdmQrCode qrCode = qrCodeMapper.selectOne(new LambdaQueryWrapper<AdmQrCode>().select(AdmQrCode::getId).eq(AdmQrCode::getProjectId,hasUpdateReq.getProjectId()).gt(AdmQrCode::getTs,hasUpdateReq.getDownloadAdmTs()).last("limit 1"));
+		if (qrCode != null){
+			return true;
+		}
+
+		// 服务区域
+		AdmServeArea serveArea = serveAreaMapper.selectOne(new LambdaQueryWrapper<AdmServeArea>().select(AdmServeArea::getId).eq(AdmServeArea::getProjectId,hasUpdateReq.getProjectId()).gt(AdmServeArea::getTs,hasUpdateReq.getDownloadAdmTs()).last("limit 1"));
+		if (serveArea != null){
+			return true;
+		}
+
+//		String userId = admAuthService.loginInfo().getId();
+		String userId = "1";
+
+		// downloadBdtpTs
+		// 2.检查对象 bdtp库
+		QueryCriteria criteria = ServiceUtil.getQueryCriteria(objectMapper, AdmConst.OBJ_TYPE_BUILDING, AdmConst.OBJ_TYPE_FLOOR,AdmConst.OBJ_TYPE_SPACE, AdmConst.OBJ_TYPE_SHAFT, AdmConst.OBJ_TYPE_SYSTEM, AdmConst.OBJ_TYPE_EQUIPMENT, "ispace");
+		criteria.setOnlyCount(true);
+		criteria.setWithoutCount(true);
+		criteria.getCriteria().putObject("ts").put("$gt", hasUpdateReq.getDownloadBdtpTs());
+		CommonResult<List<ObjectNode>> query = objectClient.query(hasUpdateReq.getGroupCode(), hasUpdateReq.getProjectId(), AdmConst.APP_ID, userId, criteria);
+		if(query.getCount() > 0){
+			return true;
+		}
+
+		// downloadObjRelTs
+		// 3.检查对象关系
+		// 3.1 app端创建的关系 bdtp库
+		QueryCriteria objRelCriteria = ServiceUtil.getQueryCriteria(objectMapper);
+		objRelCriteria.getCriteria().putObject("ts").put("$gt", hasUpdateReq.getDownLoadObjRelTs());
+		objRelCriteria.getCriteria().put("createApp", AdmConst.CREATOR_APP);
+		objRelCriteria.setOnlyCount(true);
+		objRelCriteria.setWithoutCount(true);
+		CommonResult<List<ObjectNode>> objRelResult = rwdClient.queryRelation(hasUpdateReq.getGroupCode(), hasUpdateReq.getProjectId(), AdmConst.APP_ID, userId, objRelCriteria);
+		if (objRelResult.getCount() > 0){
+			return true;
+		}
+
+		// 3.2 元空间和空间的对应关系 bdtp库
+		QueryCriteria objRelCriteria2 = ServiceUtil.getQueryCriteria(objectMapper);
+		objRelCriteria2.setOnlyCount(true);
+		objRelCriteria2.setWithoutCount(true);
+		objRelCriteria2.getCriteria().put("graphCode", "MechInArch").put("relCode", "Sp2Si").put("relValue", "GeneralZone").putObject("ts").put("$gt",hasUpdateReq.getDownLoadObjRelTs());
+		CommonResult<List<ObjectNode>> objRelResult2 = rwdClient.queryRelation(hasUpdateReq.getGroupCode(), hasUpdateReq.getProjectId(), AdmConst.APP_ID, userId, objRelCriteria2);
+		if (objRelResult2.getCount() > 0){
+			return true;
+		}
+
+		return false;
+	}
+
+	private AdmM2dEquipMapper m2dEquipMapper;
+
 	private void autoRelations(List<ObjectNode> newObjs, List<ObjectNode> relations, UploadParams ps){
 		for(ObjectNode obj : newObjs) {
 			if (obj.get("objType") != null && AdmConst.OBJ_TYPE_EQUIPMENT.equals(obj.get("objType").asText())) {