浏览代码

Merge remote-tracking branch 'origin/develop' into develop

xujiaheng 3 年之前
父节点
当前提交
b94089fda7
共有 64 个文件被更改,包括 2821 次插入278 次删除
  1. 14 1
      pom.xml
  2. 3 0
      src/main/java/com/persagy/proxy/adm/constant/AdmCommonConstant.java
  3. 115 0
      src/main/java/com/persagy/proxy/adm/constant/AdmObjectInfoConstant.java
  4. 32 2
      src/main/java/com/persagy/proxy/adm/constant/AdmRelationType.java
  5. 38 0
      src/main/java/com/persagy/proxy/adm/constant/AdmRelationTypeEnum.java
  6. 43 0
      src/main/java/com/persagy/proxy/adm/constant/BusinessErrorRwdCode.java
  7. 68 0
      src/main/java/com/persagy/proxy/adm/constant/ObjTypeMapping.java
  8. 41 0
      src/main/java/com/persagy/proxy/adm/constant/SpaceTypeEnum.java
  9. 86 0
      src/main/java/com/persagy/proxy/adm/controller/AdmManualRelCalController.java
  10. 0 48
      src/main/java/com/persagy/proxy/adm/controller/AdmManualRelationCalcController.java
  11. 5 4
      src/main/java/com/persagy/proxy/adm/controller/AdmModelRelController.java
  12. 4 4
      src/main/java/com/persagy/proxy/adm/controller/REqForSpConreoller.java
  13. 174 4
      src/main/java/com/persagy/proxy/adm/controller/ReportDownloadController.java
  14. 189 0
      src/main/java/com/persagy/proxy/adm/controller/RelationSyEqController.java
  15. 3 0
      src/main/java/com/persagy/proxy/adm/model/AdmFloor.java
  16. 27 0
      src/main/java/com/persagy/proxy/adm/model/AdmManualRelCalRequest.java
  17. 26 0
      src/main/java/com/persagy/proxy/adm/model/AdmManualRelationCalcDel.java
  18. 2 1
      src/main/java/com/persagy/proxy/adm/model/AdmModelRel.java
  19. 2 1
      src/main/java/com/persagy/proxy/adm/model/AdmRelationAddRequest.java
  20. 5 1
      src/main/java/com/persagy/proxy/adm/model/AdmRelationObject.java
  21. 4 0
      src/main/java/com/persagy/proxy/adm/request/AdmCreateResponse.java
  22. 41 0
      src/main/java/com/persagy/proxy/adm/request/AdmManualRelCalResponse.java
  23. 48 0
      src/main/java/com/persagy/proxy/adm/service/AdmManualRelCalService.java
  24. 0 21
      src/main/java/com/persagy/proxy/adm/service/AdmManualRelationCalcService.java
  25. 14 1
      src/main/java/com/persagy/proxy/adm/service/IAdmModelRelService.java
  26. 14 1
      src/main/java/com/persagy/proxy/adm/service/IReportDownloadService.java
  27. 132 18
      src/main/java/com/persagy/proxy/adm/service/impl/AbstractAdmManualRelationCalcServiceImpl.java
  28. 347 4
      src/main/java/com/persagy/proxy/adm/service/impl/AdmModelRelServiceImpl.java
  29. 28 3
      src/main/java/com/persagy/proxy/adm/service/impl/ReportDownloadService.java
  30. 37 1
      src/main/java/com/persagy/proxy/adm/strategy/QueryRelationObjectContext.java
  31. 108 34
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/AbstractQueryRelationObject.java
  32. 13 8
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Eq2BdForRelationObject.java
  33. 13 8
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Eq2BdRelationObject.java
  34. 54 0
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Eq2EqEqBackupRelationObject.java
  35. 54 0
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Eq2EqEqNormalRelationObject.java
  36. 54 0
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Eq2EqSyBackupRelationObject.java
  37. 54 0
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Eq2EqSyNormalRelationObject.java
  38. 13 8
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Eq2FlForRelationObject.java
  39. 12 7
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Eq2FlRelationObject.java
  40. 14 9
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Eq2ShForRelationObject.java
  41. 13 8
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Eq2SpRelationObject.java
  42. 40 3
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/QueryRelationObjectStrategy.java
  43. 12 7
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sh2BdForRelationObject.java
  44. 13 8
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sh2FlForRelationObject.java
  45. 11 7
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sh2ShForRelationObject.java
  46. 14 9
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sh2SpForRelationObject.java
  47. 13 8
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sp2BdForRelationObject.java
  48. 13 8
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sp2FlForRelationObject.java
  49. 57 0
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sp2SpConnectRelationObject.java
  50. 57 0
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sp2SpFFCloseRelationObject.java
  51. 57 0
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sp2SpFFOpenRelationObject.java
  52. 57 0
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sp2SpMixMechRelationObject.java
  53. 57 0
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sp2SpNaturalRelationObject.java
  54. 57 0
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sp2SpNormalRelationObject.java
  55. 57 0
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sp2SpOnewayMechRelationObject.java
  56. 57 0
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sp2SpTransparentRelationObject.java
  57. 55 0
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Ss2EqShipRelationObject.java
  58. 55 0
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Ss2SpShipRelationObject.java
  59. 55 0
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Ss2SyShipRelationObject.java
  60. 12 7
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sy2BdForRelationObject.java
  61. 13 8
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sy2FlForRelationObject.java
  62. 12 7
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sy2ShForRelationObject.java
  63. 14 9
      src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sy2SpForRelationObject.java
  64. 89 0
      src/main/java/com/persagy/proxy/adm/utils/GeoToolsUtil.java

+ 14 - 1
pom.xml

@@ -38,6 +38,13 @@
 				<enabled>true</enabled>
 			</releases>
 		</repository>
+
+		<repository>
+			<id>osgeo</id>
+			<name>Open Source Geospatial Foundation Repository</name>
+			<url>https://repo.osgeo.org/repository/release/</url>
+		</repository>
+
 	</repositories>
 	<properties>
 		<java.version>1.8</java.version>
@@ -75,5 +82,11 @@
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
         </dependency>
-    </dependencies>
+		<dependency>
+			<groupId>org.geotools</groupId>
+			<artifactId>gt-main</artifactId>
+			<version>23.0</version>
+		</dependency>
+
+	</dependencies>
 </project>

+ 3 - 0
src/main/java/com/persagy/proxy/adm/constant/AdmCommonConstant.java

@@ -48,4 +48,7 @@ public interface AdmCommonConstant {
     /** 有效标示*/
     String VALID = "valid";
 
+    /** 楼层标高 */
+    String FLOOR_ELEVATION = "floorElevation";
+
 }

+ 115 - 0
src/main/java/com/persagy/proxy/adm/constant/AdmObjectInfoConstant.java

@@ -28,4 +28,119 @@ public interface AdmObjectInfoConstant {
     Set<String> CHECK_SENSOR_CODES= CollUtil.newHashSet("SPVSCM","FFEALS","FFFPSE","FFFASE","SPIASE",
             "WEGMCM","WEOFCM","WEGMPD","FFGASE","OTSESP","OTSESD","OTSETP","OTSEVD","OTSEPS","OTSEPF","OTSERH",
             "OTSEIP","OTSEIL","OTSEHT","OTSECB","OTSECT","OTSEEE","OTSEDP","OTSEFL");
+    /**重复检查主对象的type与从对象的type是否重复*/
+    Set<String> CHECK_SPECIAL_TYPES= CollUtil.newHashSet("sp2sp_RadiationNetwork_2","sp2sp_RadiationNetwork_1",
+            "sp2sp_ConvectionNetwork_2","sp2sp_ConvectionNetwork_3","sp2sp_ConvectionNetwork_1",
+            "sp2sp_TrafficNetwork_3","sp2sp_TrafficNetwork_2","sp2sp_TrafficNetwork_1");
+
+    Set<String> SOURCE_FLAG_FALSE=CollUtil.newHashSet("eq2eq_GasNetwork_2", "eq2fl",
+            "sp2sp_SpaceNeighborhood_3", "eq2sp_in", "sh2bd", "sp2sp_SpaceNeighborhood_2", "sp2sp_SpaceNeighborhood_5",
+            "eq2sp_in", "sy2sh_for", "eq2sp_for", "eq2sp_in", "eq2sy", "eq2eq_ChillWaterLoop_4", "eq2bd_for",
+            "sp2sp_SpaceNeighborhood_1", "eq2eq_ValveRelationship_vv2eq", "eq2eq_SensorNetwork_1", "eq2sp_in",
+            "eq2eq_CoolingWaterLoop_3", "eq2fl_for", "eq2eq_EquipPower_3", "eq2sp_for", "eq2eq_ACAirNetwork_3",
+            "eq2sp_for", "eq2eq_SupplyWaterNetwork_2", "eq2sy_ControlRelation_2", "eq2sp_in", "eq2sp_in",
+            "eq2eq_HeatWaterLoop_4", "bd2sp", "sp2sp_TrafficNetwork_2", "fl2sp", "Sh2Sp_ArchSubset", "eq2sp_for",
+            "sp2sp_ConvectionNetwork_2", "sy2sh", "sy2bd_MechInArch", "eq2eq_DHWNetwork_2", "eq2sp_for",
+            "sp2sp_ConvectionNetwork_3", "eq2eq_ControlEquipNetwork", "sy2fl_for", "eq2eq_RecycleWaterNetwork_2",
+            "eq2sy_SensorRelationship_ss2sy", "sp2sp_SpaceNeighborhood_4", "eq2sp_in", "eq2sp_in", "pe2fl",
+            "eq2sp_in", "eq2sp_for", "sh2sh", "eq2eq_LUDistribution_1", "eq2eq_HUDistribution_2",
+            "eq2eq_DrainingWaterNetwork_2", "fl2fl", "eq2eq_LUDistribution_2", "eq2sp_for",
+            "eq2eq_DrinkingWaterNetwork_2", "eq2sp_SensorRelationship_ss2sp", "eq2sp_in", "tn2sp",
+            "eq2eq_ChillWaterLoop_3", "eq2eq_GasNetwork_1", "sy2bd_for", "eq2eq_EquipPower_4", "eq2sp_for",
+            "eq2eq_CoolingWaterLoop_4", "eq2sp_in", "eq2sh", "pe2bd", "eq2sh_for", "eq2eq_EquipPower_2",
+            "eq2sy_ValveRelationship_vv2sy", "sp2sp_TrafficNetwork_1", "eq2sp_in", "eq2sp_in", "eq2sp_in",
+            "eq2sp_in", "sp2sp_RadiationNetwork_2", "eq2eq_FireWaterNetwork_2", "sp2sp_ConvectionNetwork_1",
+            "sp2sp_TrafficNetwork_3", "eq2eq_EquipPower_1", "sy2fl", "eq2sp_for", "eq2eq_SensorRelationship_ss2eq",
+            "eq2sp_for", "pe2sh", "eq2eq_ControlRelation_1", "sp2sp_RadiationNetwork_1", "sh2sp",
+            "eq2eq_HeatWaterLoop_3", "bd2bd_ArchForArch", "sh2fl_ArchForArch", "sh2sh_ArchForArch",
+            "sh2sp_ArchForArch", "sp2bd_ArchForArch", "sp2fl_ArchForArch", "sp2sh_ArchForArch", "sp2sp_ArchForArch",
+            "bd2fl_ArchForArch", "bd2sh_ArchForArch", "bd2sh_ArchSubset", "bd2sp_ArchForArch", "fl2bd_ArchForArch",
+            "fl2fl_ArchForArch", "fl2sh_ArchForArch", "fl2sp_ArchForArch", "sh2bd_ArchForArch", "sy2sp",
+            "syeq2bd", "sy2sp_for", "eq2sp_for", "eq2sp_for", "eq2sp_for", "eq2sp_for", "eq2sp_for",
+            "eq2eq_VentNetwork_3", "eq2eq_HUDistribution_1");
+
+    Set<String> SOURCE_FLAG_TRUE=CollUtil.newHashSet("eq2eq_DrainingWaterNetwork_1",
+            "eq2eq_ACAirNetwork_2", "eq2eq_CondWaterNetwork_1", "eq2eq_HeatWaterLoop_1", "eq2eq_DHWNetwork_1",
+            "eq2eq_RecycleWaterNetwork_1", "eq2eq_FireVentNetwork_1", "eq2eq_FireWaterNetwork_1", "eq2eq_VRFNetwork_1",
+            "eq2eq_ChillWaterLoop_2", "eq2eqFreshAirNetwork_1", "eq2eq_ChillWaterLoop_1",
+            "eq2eq_DrinkingWaterNetwork_2", "eq2eq_CoolingWaterLoop_2", "eq2eq_VentNetwork_1", "eq2eq_HeatWaterLoop_2",
+            "eq2eq_CoolingWaterLoop_1", "eq2eq_ACAirNetwork_1", "eq2eq_SupplyWaterNetwork_1");
+
+    Set<String> AUTOMATIC_FLAG_FALSE=CollUtil.newHashSet("eq2eq_GasNetwork_2", "sp2sp_SpaceNeighborhood_3", "sp2sp_SpaceNeighborhood_2",
+            "sy2sh_for", "eq2sp_for", "eq2sy", "eq2eq_ChillWaterLoop_4", "eq2bd_for", "sp2sp_SpaceNeighborhood_1",
+            "eq2eq_ValveRelationship_vv2eq", "eq2eq_SensorNetwork_1", "eq2eq_CoolingWaterLoop_3", "eq2fl_for",
+            "eq2eq_EquipPower_3", "eq2sp_for", "eq2eq_SupplyWaterNetwork_2", "eq2sy_ControlRelation_2",
+            "sp2sp_TrafficNetwork_2", "Sh2Sp_ArchSubset", "eq2sp_for", "sp2sp_ConvectionNetwork_2",
+            "sy2bd_MechInArch", "eq2eq_DHWNetwork_2", "eq2sp_for", "sp2sp_ConvectionNetwork_3",
+            "eq2eq_ControlEquipNetwork", "sy2fl_for", "eq2eq_RecycleWaterNetwork_2", "eq2sy_SensorRelationship_ss2sy",
+            "sp2sp_SpaceNeighborhood_4", "eq2sp_for", "eq2eq_LUDistribution_1", "eq2eq_HUDistribution_2",
+            "eq2eq_DrainingWaterNetwork_2", "eq2eq_LUDistribution_2", "eq2sp_for", "eq2eq_DrinkingWaterNetwork_2",
+            "tn2sp", "eq2eq_ChillWaterLoop_3", "eq2eq_GasNetwork_1", "sy2bd_for", "eq2eq_EquipPower_4", "eq2sp_for",
+            "eq2eq_CoolingWaterLoop_4", "eq2sh_for", "eq2eq_EquipPower_2", "eq2sy_ValveRelationship_vv2sy",
+            "sp2sp_RadiationNetwork_2", "eq2eq_FireWaterNetwork_2", "sp2sp_TrafficNetwork_3", "eq2eq_EquipPower_1",
+            "eq2eq_SensorRelationship_ss2eq", "eq2sp_for", "eq2eq_ControlRelation_1", "sh2sp", "eq2eq_HeatWaterLoop_3",
+            "bd2bd_ArchForArch", "sh2fl_ArchForArch", "sh2sh_ArchForArch", "sh2sp_ArchForArch", "sp2bd_ArchForArch",
+            "sp2fl_ArchForArch", "sp2sh_ArchForArch", "sp2sp_ArchForArch", "bd2fl_ArchForArch", "bd2sh_ArchForArch",
+            "bd2sh_ArchSubset", "bd2sp_ArchForArch", "fl2bd_ArchForArch", "fl2fl_ArchForArch", "fl2sh_ArchForArch",
+            "fl2sp_ArchForArch", "sh2bd_ArchForArch", "sy2sp_for", "eq2sp_for", "eq2sp_for", "eq2sp_for",
+            "eq2sp_for", "eq2sp_for", "eq2eq_VentNetwork_3", "eq2eq_HUDistribution_1");
+
+    Set<String> AUTOMATIC_FLAG_TRUE=CollUtil.newHashSet("eq2fl", "eq2sp_in", "sh2bd", "sp2sp_SpaceNeighborhood_5",
+            "eq2sp_in", "eq2eq_DrainingWaterNetwork_1", "eq2sp_in", "eq2eq_ACAirNetwork_2",
+            "eq2eq_CondWaterNetwork_1", "pe2sp", "eq2eq_VentNetwork_2", "eq2sp_in", "eq2sp_for",
+            "eq2eq_ACAirNetwork_3", "eq2sp_in", "eq2sp_in", "eq2eq_HeatWaterLoop_4", "bd2sp", "fl2sp",
+            "sy2sh", "eq2eq_HeatWaterLoop_1", "eq2eq_DHWNetwork_1", "eq2sp_in", "eq2sp_in", "pe2fl",
+            "eq2eq_RecycleWaterNetwork_1", "eq2sp_in", "sh2sh", "eq2eq_FireVentNetwork_1", "eq2eq_FireWaterNetwork_1",
+            "fl2fl", "eq2eq_VRFNetwork_1", "eq2sp_SensorRelationship_ss2sp", "eq2sp_in", "eq2eq_ChillWaterLoop_2",
+            "eq2eqFreshAirNetwork_1", "eq2sp_in", "eq2sh", "eq2eq_ChillWaterLoop_1", "eq2eq_DrinkingWaterNetwork_2",
+            "pe2bd", "eq2eq_CoolingWaterLoop_2", "sp2sp_TrafficNetwork_1", "eq2sp_in", "eq2sp_in", "eq2sp_in",
+            "eq2sp_in", "sp2sp_ConvectionNetwork_1", "eq2eq_VentNetwork_1", "sy2fl", "eq2sp_for", "pe2sh",
+            "eq2eq_HeatWaterLoop_2", "sp2sp_RadiationNetwork_1", "eq2eq_CoolingWaterLoop_1", "sy2sp",
+            "syeq2bd", "eq2eq_ACAirNetwork_1", "eq2eq_SupplyWaterNetwork_1");
+
+    Set<String> MANUAL_FLAG_TWO = CollUtil.newHashSet("eq2fl", "eq2sp_in", "sh2bd", "eq2sp_in", "eq2sp_for",
+            "eq2sp_in", "eq2sy", "eq2sp_in", "eq2sp_for", "eq2sp_for", "eq2sp_in", "eq2sp_in", "bd2sp", "fl2sp",
+            "Sh2Sp_ArchSubset", "eq2sp_for", "sy2sh", "sy2bd_MechInArch", "eq2sp_for", "eq2sp_in", "eq2sp_in",
+            "pe2fl", "eq2sp_in", "eq2sp_for", "sh2sh", "fl2fl", "eq2sp_for", "eq2sp_in", "tn2sp", "eq2sp_for",
+            "eq2sp_in", "eq2sh", "pe2bd", "eq2sp_in", "eq2sp_in", "eq2sp_in", "eq2sp_in", "sy2fl", "eq2sp_for",
+            "eq2sp_for", "sh2sp", "bd2sh_ArchSubset", "sy2sp", "syeq2bd", "eq2sp_for", "eq2sp_for", "eq2sp_for",
+            "eq2sp_for", "eq2sp_for");
+
+    Set<String> MANUAL_FLAG_THREE = CollUtil.newHashSet("eq2eq_GasNetwork_2", "sp2sp_SpaceNeighborhood_3",
+            "sp2sp_SpaceNeighborhood_2", "sp2sp_SpaceNeighborhood_5", "sy2sh_for", "eq2eq_DrainingWaterNetwork_1",
+            "eq2eq_ACAirNetwork_2", "eq2eq_ChillWaterLoop_4", "eq2bd_for", "eq2eq_CondWaterNetwork_1",
+            "sp2sp_SpaceNeighborhood_1", "eq2eq_ValveRelationship_vv2eq", "pe2sp", "eq2eq_VentNetwork_2",
+            "eq2eq_SensorNetwork_1", "eq2eq_CoolingWaterLoop_3", "eq2fl_for", "eq2eq_EquipPower_3",
+            "eq2eq_ACAirNetwork_3", "eq2eq_SupplyWaterNetwork_2", "eq2sy_ControlRelation_2", "eq2eq_HeatWaterLoop_4",
+            "sp2sp_TrafficNetwork_2", "sp2sp_ConvectionNetwork_2", "eq2eq_DHWNetwork_2", "eq2eq_HeatWaterLoop_1",
+            "sp2sp_ConvectionNetwork_3", "eq2eq_ControlEquipNetwork", "sy2fl_for", "eq2eq_DHWNetwork_1",
+            "eq2eq_RecycleWaterNetwork_2", "eq2sy_SensorRelationship_ss2sy", "sp2sp_SpaceNeighborhood_4",
+            "eq2eq_RecycleWaterNetwork_1", "eq2eq_LUDistribution_1", "eq2eq_FireVentNetwork_1",
+            "eq2eq_FireWaterNetwork_1", "eq2eq_HUDistribution_2", "eq2eq_DrainingWaterNetwork_2",
+            "eq2eq_VRFNetwork_1", "eq2eq_LUDistribution_2", "eq2eq_DrinkingWaterNetwork_2",
+            "eq2sp_SensorRelationship_ss2sp", "eq2eq_ChillWaterLoop_3", "eq2eq_ChillWaterLoop_2",
+            "eq2eq_GasNetwork_1", "sy2bd_for", "eq2eqFreshAirNetwork_1", "eq2eq_EquipPower_4",
+            "eq2eq_CoolingWaterLoop_4", "eq2eq_ChillWaterLoop_1", "eq2eq_DrinkingWaterNetwork_2", "eq2sh_for",
+            "eq2eq_EquipPower_2", "eq2eq_CoolingWaterLoop_2", "eq2sy_ValveRelationship_vv2sy", "sp2sp_TrafficNetwork_1",
+            "sp2sp_RadiationNetwork_2", "eq2eq_FireWaterNetwork_2", "sp2sp_ConvectionNetwork_1", "eq2eq_VentNetwork_1",
+            "sp2sp_TrafficNetwork_3", "eq2eq_EquipPower_1", "eq2eq_SensorRelationship_ss2eq", "pe2sh",
+            "eq2eq_HeatWaterLoop_2", "eq2eq_ControlRelation_1", "sp2sp_RadiationNetwork_1", "eq2eq_HeatWaterLoop_3",
+            "eq2eq_CoolingWaterLoop_1", "bd2bd_ArchForArch", "sh2fl_ArchForArch", "sh2sh_ArchForArch",
+            "sh2sp_ArchForArch", "sp2bd_ArchForArch", "sp2fl_ArchForArch", "sp2sh_ArchForArch", "sp2sp_ArchForArch",
+            "bd2fl_ArchForArch", "bd2sh_ArchForArch", "bd2sp_ArchForArch", "fl2bd_ArchForArch", "fl2fl_ArchForArch",
+            "fl2sh_ArchForArch", "fl2sp_ArchForArch", "sh2bd_ArchForArch", "sy2sp_for", "eq2eq_ACAirNetwork_1",
+            "eq2eq_SupplyWaterNetwork_1", "eq2eq_VentNetwork_3", "eq2eq_HUDistribution_1");
+    /**系统类型,风系统1,水系统0*/
+    Set<String> SYSTEM_TYPE_FALSE = CollUtil.newHashSet("eq2eq_GasNetwork_2", "eq2eq_DrainingWaterNetwork_1",
+            "eq2eq_CondWaterNetwork_1", "eq2eq_CoolingWaterLoop_3", "eq2eq_SupplyWaterNetwork_2",
+            "eq2eq_HeatWaterLoop_4", "eq2eq_DHWNetwork_2", "eq2eq_HeatWaterLoop_1", "eq2eq_DHWNetwork_1",
+            "eq2eq_RecycleWaterNetwork_2", "eq2eq_RecycleWaterNetwork_1", "eq2eq_FireWaterNetwork_1",
+            "eq2eq_DrainingWaterNetwork_2", "eq2eq_VRFNetwork_1", "eq2eq_DrinkingWaterNetwork_2",
+            "eq2eq_ChillWaterLoop_3", "eq2eq_ChillWaterLoop_2", "eq2eq_GasNetwork_1", "eq2eq_CoolingWaterLoop_4",
+            "eq2eq_ChillWaterLoop_1", "eq2eq_DrinkingWaterNetwork_2", "eq2eq_CoolingWaterLoop_2",
+            "eq2eq_FireWaterNetwork_2", "eq2eq_HeatWaterLoop_2", "eq2eq_HeatWaterLoop_3",
+            "eq2eq_CoolingWaterLoop_1", "eq2eq_SupplyWaterNetwork_1");
+    /**系统类型,风系统1,水系统0*/
+    Set<String> SYSTEM_TYPE_TRUE = CollUtil.newHashSet("eq2eq_VentNetwork_2", "eq2eq_ACAirNetwork_3",
+            "eq2eq_FireVentNetwork_1", "eq2eq_VentNetwork_1", "eq2eq_ACAirNetwork_1", "eq2eq_VentNetwork_3");
 }

+ 32 - 2
src/main/java/com/persagy/proxy/adm/constant/AdmRelationType.java

@@ -14,6 +14,8 @@ public interface AdmRelationType {
 	String EQ2BD = "eq2bd";
 	
 	String EQ2FL = "eq2fl";
+	
+	String EQ2SP = "eq2sp";
 
 	String EQ2BD_FOR = "eq2bd_for";
 	
@@ -29,8 +31,6 @@ public interface AdmRelationType {
 	
 	String SY2SP_FOR = "sy2sp_for";
 	
-	String EQ2SP_SENSORRELATIONSHIP_SS2SP = "eq2sp_SensorRelationship_ss2sp";
-	
 	String SH2BD_ARCHFORARCH = "sh2bd_ArchForArch";
 	
 	String SH2FL_ARCHFORARCH = "sh2fl_ArchForArch";
@@ -43,4 +43,34 @@ public interface AdmRelationType {
 	
 	String SP2FL_ARCHFORARCH ="sp2fl_ArchForArch";
 	
+	String SP2SP_RADIATIONNETWORK_2 = "sp2sp_RadiationNetwork_2";
+	
+	String SP2SP_RADIATIONNETWORK_1 = "sp2sp_RadiationNetwork_1";
+	
+	String SP2SP_CONVECTIONNETWORK_2 = "sp2sp_ConvectionNetwork_2";
+	
+	String SP2SP_CONVECTIONNETWORK_3 = "sp2sp_ConvectionNetwork_3";
+	
+	String SP2SP_CONVECTIONNETWORK_1 = "sp2sp_ConvectionNetwork_1";
+	
+	String SP2SP_TRAFFICNETWORK_3 = "sp2sp_TrafficNetwork_3";
+	
+	String SP2SP_TRAFFICNETWORK_2 = "sp2sp_TrafficNetwork_2";
+	
+	String SP2SP_TRAFFICNETWORK_1 = "sp2sp_TrafficNetwork_1";
+	
+	String EQ2EQ_EQUIPPOWER_1 = "eq2eq_EquipPower_1";
+	
+	String EQ2EQ_EQUIPPOWER_2 = "eq2eq_EquipPower_2";
+	
+	String EQ2EQ_EQUIPPOWER_3 = "eq2eq_EquipPower_3";
+	
+	String EQ2EQ_EQUIPPOWER_4 = "eq2eq_EquipPower_4";
+	
+	String EQ2EQ_SENSORRELATIONSHIP_SS2EQ = "eq2eq_SensorRelationship_ss2eq";
+	
+	String EQ2SY_SENSORRELATIONSHIP_SS2SY = "eq2sy_SensorRelationship_ss2sy";
+	
+	String EQ2SP_SENSORRELATIONSHIP_SS2SP = "eq2sp_SensorRelationship_ss2sp";
+	
 }

+ 38 - 0
src/main/java/com/persagy/proxy/adm/constant/AdmRelationTypeEnum.java

@@ -270,6 +270,16 @@ public enum AdmRelationTypeEnum {
     private Set<String> checkClassCodes;
     /**是否检查传感器使用的传感器类型*/
     private Set<String> checkSensorCodes;
+    /**是否需要配置源末端,0-不需要,1-需要*/
+    private Integer sourceFlag;
+    /**是否自动计算类型,0-不自动计算,1-自动计算*/
+    private Integer automaticFlag;
+    /**手动计算类型 1 禁用  2提示引导 3手动维护*/
+    private Integer manualFlag;
+    /**风系统1,水系统0*/
+    private Integer systemType;
+    ///**业务分区类型*/
+//    private String zoneType;
 
     /***
      * Description: 构造函数
@@ -300,6 +310,34 @@ public enum AdmRelationTypeEnum {
         this.hasCheckClassCode = hasCheckClassCode;
         this.checkClassCodes = CollUtil.newHashSet(AdmObjectInfoConstant.CHECK_CLASS_CODES);
         this.checkSensorCodes = CollUtil.newHashSet(AdmObjectInfoConstant.CHECK_SENSOR_CODES);
+        this.sourceFlag=null;
+        if (AdmObjectInfoConstant.SOURCE_FLAG_FALSE.contains(relationType)){
+            this.sourceFlag=0;
+        }
+        if (AdmObjectInfoConstant.SOURCE_FLAG_TRUE.contains(relationType)){
+            this.sourceFlag=1;
+        }
+        this.automaticFlag=null;
+        if (AdmObjectInfoConstant.AUTOMATIC_FLAG_FALSE.contains(relationType)){
+            this.automaticFlag=0;
+        }
+        if (AdmObjectInfoConstant.AUTOMATIC_FLAG_TRUE.contains(relationType)){
+            this.automaticFlag=1;
+        }
+        this.manualFlag=null;
+        if (AdmObjectInfoConstant.MANUAL_FLAG_TWO.contains(relationType)){
+            this.manualFlag=2;
+        }
+        if (AdmObjectInfoConstant.MANUAL_FLAG_THREE.contains(relationType)){
+            this.manualFlag=3;
+        }
+        this.systemType=null;
+        if (AdmObjectInfoConstant.SYSTEM_TYPE_FALSE.contains(relationType)){
+            this.systemType=0;
+        }
+        if (AdmObjectInfoConstant.SYSTEM_TYPE_TRUE.contains(relationType)){
+            this.systemType=1;
+        }
     }
     /***
      * Description: 构造函数

+ 43 - 0
src/main/java/com/persagy/proxy/adm/constant/BusinessErrorRwdCode.java

@@ -0,0 +1,43 @@
+package com.persagy.proxy.adm.constant;
+
+/***
+ * Description: rwd定制的错误返回码
+ * @author : lijie
+ * @date :2021/9/3 14:25
+ * Update By lijie 2021/9/3 14:25
+ */
+public enum BusinessErrorRwdCode {
+    /**
+     * A73XX:代表关系计算的错误码
+     *
+     * */
+	A7301("A7301", ":不存在"),
+    A7302("A7302", ":存在多个实例"),
+    A7303("A7303", ":不存在"),
+    A7304("A7304", ":存在多个实例"),
+    A7305("A7305", ":错误的类型参考:这里的传感器包含车库摄像头,车位检测器,办公摄像头,火灾探测器,燃气探测器,漏电探测器,消防设备电源传感器,监控摄像头,入侵报警探测器,以及传感器系统下所有设备类型"),
+    A7306("A7306", ":不符合主对象条件限制");
+
+    private String code;
+
+    private String desc;
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    private BusinessErrorRwdCode(String code, String desc) {
+        this.desc = desc;
+        this.code = code;
+    }
+
+    @Override
+    public String toString() {
+        return this.code + "_" + this.desc;
+    }
+
+}

+ 68 - 0
src/main/java/com/persagy/proxy/adm/constant/ObjTypeMapping.java

@@ -0,0 +1,68 @@
+package com.persagy.proxy.adm.constant;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import cn.hutool.core.util.StrUtil;
+
+/**
+ * 对象类型的前缀与全名的来回映射,以及根据边类型获取对应的对象类型前缀
+ * 
+ * @version 1.0.0
+ * @company persagy 
+ * @author zhangqiankun
+ * @date 202193日 下午9:16:10
+ */
+public class ObjTypeMapping {
+
+	/** example: Sp -> space */
+	public static final Map<String, String> PREFIX_FULLNAME = new HashMap<String, String>();
+	
+	/** example: space -> Sp */
+	public static final Map<String, String> FULLNAME_PREFIX = new HashMap<String, String>();
+	
+	static {
+	    
+		PREFIX_FULLNAME.put("Pj", "project");
+		PREFIX_FULLNAME.put("Bd", "building");
+		PREFIX_FULLNAME.put("Fl", "floor");
+		PREFIX_FULLNAME.put("Sp", "space");
+		PREFIX_FULLNAME.put("Sy", "system");
+		PREFIX_FULLNAME.put("Eq", "equipment");
+		PREFIX_FULLNAME.put("Sh", "shaft");
+		PREFIX_FULLNAME.put("Ec", "component");
+		PREFIX_FULLNAME.put("Pe", "property");
+		
+		FULLNAME_PREFIX.put("project", "Pj");
+		FULLNAME_PREFIX.put("building", "Bd");
+		FULLNAME_PREFIX.put("floor", "Fl");
+		FULLNAME_PREFIX.put("space", "Sp");
+		FULLNAME_PREFIX.put("system", "Sy");
+		FULLNAME_PREFIX.put("equipment", "Eq");
+		FULLNAME_PREFIX.put("shaft", "Sh");
+		FULLNAME_PREFIX.put("component", "Ec");
+		FULLNAME_PREFIX.put("property", "Pe");
+		
+	}
+	
+	/**
+	 * 获取中台中,边类型编码的前两位
+	 * 
+	 * @param relCode 最低2位,不然抛异常
+	 * @return 空字符串或者对应前缀
+	 */
+	public static String getRelCodePrefix(String relCode) {
+		return StrUtil.isBlank(relCode) ? AdmCommonConstant.EMPTY : relCode.substring(0, 2);
+	}
+	
+	/**
+	 * 获取中台中对象类型的前两位
+	 * 
+	 * @param objType 最低5位,不然抛异常
+	 * @return 空字符串或者对应后缀
+	 */
+	public static String getRelCodeSuffix(String relCode) {
+		return StrUtil.isBlank(relCode) ? AdmCommonConstant.EMPTY : relCode.substring(3, 5);
+	}
+	
+}

+ 41 - 0
src/main/java/com/persagy/proxy/adm/constant/SpaceTypeEnum.java

@@ -0,0 +1,41 @@
+package com.persagy.proxy.adm.constant;
+
+import lombok.Getter;
+
+/**
+ * 业务空间类型
+ * 
+ * @version 1.0.0
+ * @company persagy 
+ * @author zhangqiankun
+ * @date 202196日 下午3:43:35
+ */
+@Getter
+public enum SpaceTypeEnum {
+
+	GeneralZone("GeneralZone", "物业分区"),
+	PowerSupplyZone("PowerSupplyZone", "供电分区"),
+	LightingZone("LightingZone", "照明分区"),
+	NetworkZone("NetworkZone", "网络分区"),
+	AirConditioningZone("AirConditioningZone", "空调分区"),
+	HeatingZone("HeatingZone", "采暖分区"),
+	CleanZone("CleanZone", "洁净分区"),
+	DomesticWaterSupplyZone("DomesticWaterSupplyZone", "生活给水分区"),
+	FireZone("FireZone", "防火分区"),
+	SecurityZone("SecurityZone", "安防分区"),
+	TenantZone("TenantZone", "租户分区"),
+	FunctionZone("FunctionZone", "功能分区"),
+	PassengerFlowZone("PassengerFlowZone", "客流分区"),
+	EvacuateZone("EvacuateZone", "疏散分区"),
+	EnvironmentZone("EnvironmentZone", "环境分区"),
+	OtherZone("OtherZone", "其他分区");
+
+	private String code;
+    private String desc;
+
+    SpaceTypeEnum(String code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+    
+}

+ 86 - 0
src/main/java/com/persagy/proxy/adm/controller/AdmManualRelCalController.java

@@ -0,0 +1,86 @@
+package com.persagy.proxy.adm.controller;
+
+import com.persagy.proxy.adm.constant.AdmCommonConstant;
+import com.persagy.proxy.adm.model.AdmManualRelCalRequest;
+import com.persagy.proxy.adm.model.AdmManualRelationCalcDel;
+import com.persagy.proxy.adm.model.AdmRelationAddRequest;
+import com.persagy.proxy.adm.request.AdmCreateResponse;
+import com.persagy.proxy.adm.request.AdmManualRelCalResponse;
+import com.persagy.proxy.adm.request.AdmResponse;
+import com.persagy.proxy.adm.service.AdmManualRelCalService;
+import com.persagy.proxy.common.entity.InstanceUrlParam;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.validation.annotation.Validated;
+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;
+
+import javax.ws.rs.QueryParam;
+
+/***
+ * Description:手动计算输入类
+ * @author : lijie
+ * @date :2021/8/31 11:37
+ * Update By lijie 2021/8/31 11:37
+ */
+@RestController
+@RequestMapping("/rel-manual-calc/")
+@RequiredArgsConstructor
+public class AdmManualRelCalController {
+
+    private final AdmManualRelCalService admManualRelationCalcService;
+    @Value("${middleware.group.code}")
+    private String groupCode;
+    
+    /***
+     * Description: 添加关系
+     * @param request : 请求参数
+     * @return : com.persagy.proxy.adm.request.AdmCreateResponse  
+     * @author : lijie
+     * @date :2021/8/31 12:10
+     * Update By lijie 2021/8/31 12:10
+     */
+    @PostMapping(value = "add")
+    public AdmCreateResponse addRels(@QueryParam("projectId") String projectId,
+                                     @RequestBody AdmRelationAddRequest request) throws Exception {
+        // 组装上下文条件
+        InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
+        return admManualRelationCalcService.addRels(context,request);
+    }
+    /***
+     * Description: 删除关系
+     * @param admManualRelationCalcDel : 请求参数
+     * @return : com.persagy.proxy.adm.request.AdmCreateResponse
+     * @author : lijie
+     * @date :2021/8/31 12:10
+     * Update By lijie 2021/8/31 12:10
+     */
+    @PostMapping(value = "del")
+    public AdmCreateResponse delRels(@QueryParam("projectId") String projectId,
+                                     @Validated @RequestBody AdmManualRelationCalcDel admManualRelationCalcDel) throws Exception {
+        // 组装上下文条件
+        InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
+        return admManualRelationCalcService.delRels(context,admManualRelationCalcDel);
+    }
+    /***
+     * Description: 查询关系数据
+     * @param admManualRelCalRequest : 请求参数
+     * @return : com.persagy.proxy.adm.request.AdmCreateResponse
+     * @author : lijie
+     * @date :2021/8/31 12:10
+     * Update By lijie 2021/8/31 12:10
+     */
+    @PostMapping(value = "query")
+    public AdmResponse query(@QueryParam("projectId") String projectId,
+                             @Validated @RequestBody AdmManualRelCalRequest admManualRelCalRequest) throws Exception {
+        // 组装上下文条件
+        InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
+        return admManualRelationCalcService.query(context,admManualRelCalRequest);
+    }
+
+
+
+
+}

+ 0 - 48
src/main/java/com/persagy/proxy/adm/controller/AdmManualRelationCalcController.java

@@ -1,48 +0,0 @@
-package com.persagy.proxy.adm.controller;
-
-import com.persagy.proxy.adm.constant.AdmCommonConstant;
-import com.persagy.proxy.adm.model.AdmRelationAddRequest;
-import com.persagy.proxy.adm.model.AdmTenant;
-import com.persagy.proxy.adm.request.AdmCreateResponse;
-import com.persagy.proxy.adm.request.AdmQueryCriteria;
-import com.persagy.proxy.adm.request.AdmResponse;
-import com.persagy.proxy.adm.service.AdmManualRelationCalcService;
-import com.persagy.proxy.common.entity.InstanceUrlParam;
-import lombok.RequiredArgsConstructor;
-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;
-
-import javax.ws.rs.QueryParam;
-
-/***
- * Description:手动计算输入类
- * @author : lijie
- * @date :2021/8/31 11:37
- * Update By lijie 2021/8/31 11:37
- */
-@RestController
-@RequestMapping("/rel-manual-calc/")
-@RequiredArgsConstructor
-public class AdmManualRelationCalcController {
-
-    private final AdmManualRelationCalcService admManualRelationCalcService;
-    
-    /***
-     * Description: 添加关系
-     * @param request : 请求参数
-     * @return : com.persagy.proxy.adm.request.AdmCreateResponse  
-     * @author : lijie
-     * @date :2021/8/31 12:10
-     * Update By lijie 2021/8/31 12:10
-     */
-    @PostMapping(value = "add")
-    public AdmCreateResponse addRels(@RequestBody AdmRelationAddRequest request) throws Exception {
-        return admManualRelationCalcService.addRels(request);
-    }
-
-
-
-
-}

+ 5 - 4
src/main/java/com/persagy/proxy/adm/controller/AdmModelRelController.java

@@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.ws.rs.QueryParam;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -40,16 +41,16 @@ public class AdmModelRelController {
 
     /**
      * 模型修改设备元空间的建筑楼层信息
-     * @param createRequest
+     * @param admModelRel
      * @return
      * @throws Exception
      */
     @PostMapping("/equip-ispace")
-    public AdmResponse update(@RequestBody AdmCreateRequest<AdmModelRel> createRequest, @QueryParam("projectId") String projectId) throws Exception {
+    public AdmResponse update(@RequestBody AdmModelRel admModelRel, @QueryParam("projectId") String projectId) throws Exception {
         // 组装上下文条件
         InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
-        List<AdmModelRel> vos = CollUtil.newArrayList(createRequest.getContent());
-       // vos = service.doUpdate(context, AdmModelRel.class, vos);
+        List<AdmModelRel> vos = new ArrayList<>();
+        vos = service.doUpdateModelInfo(context, AdmModelRel.class,admModelRel);
         return AdmResponse.success(vos);
     }
 

+ 4 - 4
src/main/java/com/persagy/proxy/adm/controller/REqForSpConreoller.java

@@ -27,7 +27,7 @@ import java.util.List;
  */
 @RestController
 @RequestMapping("/rel/eq-for-sp-base")
-public class REqForSpConreoller {
+public class RelationEqForSpConreoller {
 
     @Autowired
     private IAdmRelationService service;
@@ -62,7 +62,7 @@ public class REqForSpConreoller {
                 return AdmResponse.failure("必填项:EquipId(设备id)、SpaceId(业务空间id)");
             }
             // 创建关系对象 - 参考(datasyn中DataCenterSync.kt)
-            voList.add(new RelationDTO(null, "EquipforSpace", "Eq2Sp", type, equipId, spaceId));
+            voList.add(new RelationDTO(null, "MechForArch", "Eq2Sp", type, equipId, spaceId));
         }
         // 组装上下文条件
         InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
@@ -96,7 +96,7 @@ public class REqForSpConreoller {
                 continue;
             }
             // 创建关系对象 - 参考(datasyn中DataCenterSync.kt)
-            voList.add(new RelationDTO(null, "EquipforSpace", "Eq2Sp", type, equipId, spaceId));
+            voList.add(new RelationDTO(null, "MechForArch", "Eq2Sp", type, equipId, spaceId));
         }
         // 组装上下文条件
         InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
@@ -131,7 +131,7 @@ public class REqForSpConreoller {
                 return AdmResponse.failure("必填项:EquipId(设备id)、SpaceId(业务空间id)");
             }
             ObjectNode node = JsonNodeFactory.instance.objectNode();
-            node.put("graphCode", "EquipforSpace");
+            node.put("graphCode", "MechForArch");
             node.put("relCode", "Eq2Sp");
             node.put("relValue", type);
             node.put("objFrom", equipId);

+ 174 - 4
src/main/java/com/persagy/proxy/adm/controller/ReportDownloadController.java

@@ -2,24 +2,39 @@ package com.persagy.proxy.adm.controller;
 
 import java.io.File;
 import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.poi.xssf.usermodel.XSSFCell;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.ResourceUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.ExcelWriter;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.Lists;
 import com.persagy.proxy.adm.constant.AdmCommonConstant;
 import com.persagy.proxy.adm.model.AdmRelationObject;
-import com.persagy.proxy.adm.service.IReportDownloadService;
+import com.persagy.proxy.adm.request.AdmResponse;
+import com.persagy.proxy.adm.service.IRelationReportService;
+import com.persagy.proxy.adm.strategy.QueryRelationObjectContext;
 
 import cn.hutool.core.util.StrUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -34,12 +49,15 @@ import lombok.extern.slf4j.Slf4j;
  */
 @Slf4j
 @RestController
-public class ReportDownloadController {
+public class RelationReportController {
 
 	public static final String EXPORT_SHEET_NAME = "关系维护";
 	
 	@Autowired
-	private IReportDownloadService reportDownloadService;
+	private IRelationReportService relationReportService;
+	
+	@Autowired
+	private QueryRelationObjectContext queryRelationObjectContext;
 	
 	/**
 	 * 下载报告-设备静态信息维护模板
@@ -207,7 +225,7 @@ public class ReportDownloadController {
 			response.setCharacterEncoding(encode);
 			response.setHeader("Content-disposition", "attachment;filename=relation-template.xlsx");
 			
-			List<AdmRelationObject> relationObjects = this.reportDownloadService.reportRelationObject(groupCode, projectId, relType, code, zoneType);
+			List<AdmRelationObject> relationObjects = this.relationReportService.reportRelationObject(groupCode, projectId, relType, code, zoneType);
 			
 			File templateFile = this.getTemplateFile("relation-template.xlsx");
 			EasyExcel.write(response.getOutputStream()).withTemplate(templateFile).sheet(EXPORT_SHEET_NAME).needHead(false).doWrite(relationObjects);
@@ -220,6 +238,121 @@ public class ReportDownloadController {
 		}
 	}
 	
+	
+	/************************************************** 文件上传 ***********************************************/
+	
+	/**
+	 * 文件导入,这里由于需要回写文件,且存储到本地,采用原始POI文件解析、上传、回写、存储
+	 * 
+	 * @param relType
+	 * @param code
+	 * @param zoneType
+	 * @param request
+	 * @param response
+	 */
+	@SuppressWarnings("resource")
+	@RequestMapping("/graphic/import")
+	public AdmResponse importFile(@RequestParam("file") MultipartFile file, @RequestParam String relType, @RequestParam(required = false) String zoneType, 
+			HttpServletRequest request, HttpServletResponse response) {
+		String failure = null;
+		FileOutputStream fileOutputStream = null;
+		try {
+			if (file == null) {
+				return AdmResponse.failure("未选择文件");
+			}
+			
+			int failurNum = 0;
+			int successNum = 0;
+			String graphId = null;
+			// 临时存储行号
+			Set<Integer> rowNums = new HashSet<Integer>();
+			// 批量更新数据
+			List<ObjectNode> relationObjects = new ArrayList<ObjectNode>();
+			
+			String groupCode = request.getHeader(AdmCommonConstant.GROUP_CODE_HEADER);
+			String projectId = request.getHeader(AdmCommonConstant.PROJECT_ID_HEADER);
+			
+			XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream());
+		    XSSFSheet sheet = workbook.getSheet("关系维护");
+		    // 获取识别码的属性
+		    String code = sheet.getRow(2).getCell(1).toString();
+		    int lastRowNum = sheet.getLastRowNum();
+		    for (int i = 4; i < lastRowNum; i++) {
+		    	XSSFRow xssfRow = sheet.getRow(i);
+		    	if (xssfRow == null) {
+					continue;
+				}
+		    	// 封装cell数据
+		    	XSSFCell masterCodeCell = xssfRow.getCell(0);
+		    	XSSFCell slaveCodeCell = xssfRow.getCell(8);
+		    	XSSFCell masterIdCell = xssfRow.getCell(3);
+		    	XSSFCell slaveIdCell = xssfRow.getCell(11);
+		    	
+		    	AdmRelationObject relationObject = new AdmRelationObject();
+		    	relationObject.setMasterCode(masterCodeCell == null ? null : masterCodeCell.getStringCellValue());
+		    	relationObject.setSlaveCode(slaveCodeCell == null ? null : slaveCodeCell.getStringCellValue());
+		    	relationObject.setMasterId(masterIdCell == null ? null : masterIdCell.getStringCellValue());
+		    	relationObject.setSlaveId(slaveIdCell == null ? null : slaveIdCell.getStringCellValue());
+		    	
+		    	// 校验数据
+				Object result = this.queryRelationObjectContext.checkRelationObject(relationObject, groupCode, projectId, relType, code);
+				if (result instanceof String) {
+					failurNum++;
+					xssfRow.createCell(16).setCellValue((String)result);
+					continue;
+				}
+				ObjectNode relation = (ObjectNode) result;
+				graphId = relation.get("graphId") == null ? graphId : relation.get("graphId").asText();
+				
+				// 每一千条数据,批量新增一次
+				rowNums.add(i);
+				relationObjects.add(relation);
+				if (relationObjects.size() >= 1000) {
+					boolean objects = this.queryRelationObjectContext.saveRelationObjects(relationObjects, groupCode, projectId, relType);
+					if (objects) {
+						successNum += relationObjects.size();
+					} else {
+						failurNum += relationObjects.size();
+						for (int rowNum : rowNums) {
+							sheet.getRow(rowNum).createCell(16).setCellValue("调用中台,存储失败");
+						}
+					}
+					rowNums.clear();
+					relationObjects.clear();
+				}
+			}
+		    
+        	try {
+        		// 调用中台存储完成之后,此文件存储至本地
+        		String uploadFile = projectId + AdmCommonConstant.LINE_THROUGH + relType + AdmCommonConstant.EXCEL_SUFFIX_XLSX;
+        		File templateFile = this.createTemplateFile(uploadFile);
+        		fileOutputStream = new FileOutputStream(templateFile);
+        		workbook.write(fileOutputStream);
+			} catch (Exception e) {
+				log.error("文件存储失败", e);
+			}
+        	
+        	return AdmResponse.success(Lists.newArrayList(this.getImportResult(graphId, successNum, failurNum)));
+		} catch (Exception e) {
+			log.error("文件导入失败", e);
+			failure = e.getMessage();
+		} finally {
+			if (fileOutputStream != null) {
+				try {
+					fileOutputStream.flush();
+					fileOutputStream.close();
+				} catch (IOException e) {}
+			}
+		}
+		return AdmResponse.failure(failure);
+	}
+	
+	
+	
+	
+	/************************************************** 本地文件获取、创建 ***********************************************/
+	
+	
 	/**
 	 * 获取对应的文件,或者默认文件
 	 * 不同路径,防止镜像部署时获取不到
@@ -262,5 +395,42 @@ public class ReportDownloadController {
 		}
 		return file;
 	}
+	
+	/**
+	 * 创建本地文件,这里不再在classpath下创建
+	 * 
+	 * @param uploadFile 文件名称,带后缀
+	 * @throws IOException 
+	 */
+	private File createTemplateFile(String uploadFile) throws IOException {
+		String path = AdmCommonConstant.SERVER_ROOT_PATH + "/template/" + uploadFile;
+		File file = new File(path);
+		if (file == null || !file.exists()) {
+			file.createNewFile();
+		}
+		return file;
+	}
+	
+	/**
+	 * 获取导入结果
+	 * 
+	 * @return
+	 */
+	private JSONObject getImportResult(String graphId, int successNum, int failureNum) {
+		JSONObject result = new JSONObject();
+		result.put("relationType", graphId);
+		result.put("successCount", successNum);
+		result.put("failCount", failureNum);
+		String state = null;
+        if (successNum > 0 && failureNum > 0) {
+        	state = "1";
+        } else if (successNum > 0 && failureNum == 0) {
+            state = "0";
+        } else {
+            state = "2";
+        }
+        result.put("state", state);
+		return result;
+	}
 
 }

+ 189 - 0
src/main/java/com/persagy/proxy/adm/controller/RelationSyEqController.java

@@ -0,0 +1,189 @@
+package com.persagy.proxy.adm.controller;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.proxy.adm.constant.AdmCommonConstant;
+import com.persagy.proxy.adm.request.AdmResponse;
+import com.persagy.proxy.adm.service.IAdmRelationService;
+import com.persagy.proxy.common.entity.InstanceUrlParam;
+import com.persagy.proxy.common.entity.RelationDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @description:系统下的设备设施
+ * @author:lgy
+ * @data:2021/9/3 15:25
+ */
+@RestController
+@RequestMapping("/rel/sy-in-eq")
+public class RelationSyEqController {
+
+    @Autowired
+    private IAdmRelationService service;
+    @Value("${middleware.group.code}")
+    private String groupCode;
+
+
+    /**
+     * 创建系统下的设备关系,数据叠加,不会覆盖以前的数据
+     * 必填项:EquipID(设备id)、SysID(系统id)
+     * @param param
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = {"/link-sy-eq","/link"})
+    public AdmResponse create(@RequestParam("projectId") String projectId,
+                                @RequestBody JSONObject param) throws Exception {
+        String equipId = param.getString("equipId");
+        String sysID = param.getString("sysId");
+        if(!StrUtil.isAllNotEmpty(equipId,sysID)) {
+            return AdmResponse.failure("必填项:EquipID(设备id)、SysID(系统id)");
+        }
+        // 创建关系对象
+        List<RelationDTO> voList = new ArrayList<>();
+        voList.add(new RelationDTO(null, "MechSubset", "Sy2Eq", null, sysID , equipId));
+        // 组装上下文条件
+        InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
+        service.doSave(context, voList);
+        return AdmResponse.success();
+    }
+
+    /**
+     * 根据对象删除系统和设备的关系,只针对一个对象
+     *必填项:EquipID(设备id)、SysID(系统id)
+     * @param   param      对象
+     * @return             删除的结果信息
+     */
+
+    @PostMapping("/unlink")
+    public AdmResponse delete(@RequestParam String projectId,
+                              @RequestBody JSONObject param) throws Exception {
+        if(CollUtil.isEmpty(param)) {
+            return AdmResponse.success();
+        }
+        // 组装上下文条件
+        InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
+        // 组装条件
+        QueryCriteria criteria = new QueryCriteria();
+        String equipId = param.getString("equipId");
+        String sysID = param.getString("sysId");
+        if(!StrUtil.isAllNotEmpty(equipId,sysID)) {
+            return AdmResponse.failure("必填项:EquipID(设备id)、SysID(系统id)");
+        }
+        ObjectNode node = JsonNodeFactory.instance.objectNode();
+        node.put("graphCode", "MechSubset");
+        node.put("relCode", "Sy2Eq");
+        node.put("objFrom", sysID);
+        node.put("objTo", equipId);
+        criteria.setCriteria(node);
+        service.doDelete(context, criteria);
+        return AdmResponse.success();
+    }
+
+    /**
+     * 创建系统下的设备关系
+     *
+     * @param   syEqList           系统和设备的关系对象
+     * @return                  创建结果信息
+     */
+    @PostMapping("/link-eq")
+    public AdmResponse createBatchWithDeleteOldsysIdRelation(@RequestParam("projectId") String projectId,
+                              @RequestBody JSONObject syEqList) throws Exception {
+        JSONArray equipIdList = syEqList.getJSONArray("equipIdList");
+        String sysId = syEqList.getString("sysId");
+        if(StrUtil.isBlank(sysId) || CollUtil.isEmpty(equipIdList)) {
+            return AdmResponse.failure("必填项:EquipIdList(设备id列表)、SysID(系统id)");
+        }
+        InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
+        QueryCriteria queryRequest = new QueryCriteria();
+        ObjectNode node = JsonNodeFactory.instance.objectNode();
+        node.put("graphCode", "MechSubset");
+        node.put("relCode", "Sy2Eq");
+        node.put("objFrom", sysId);
+        queryRequest.setCriteria(node);
+        service.doDelete(context,queryRequest);
+        // 创建关系对象
+        List<RelationDTO> voList = new ArrayList<>();
+        for (int i = 0; i < equipIdList.size(); i++) {
+            voList.add(new RelationDTO(null, "MechSubset", "Sy2Eq", null, sysId , equipIdList.getString(i)));
+        }
+        // 组装上下文条件
+        service.doSave(context, voList);
+        return AdmResponse.success();
+    }
+
+    /**
+     * 创建系统下的设备关系
+     *
+     * @param   param           系统和设备的关系对象
+     * @return                  创建结果信息
+     */
+    @PostMapping("/link-sy")
+    public AdmResponse createDistinctEq(@RequestParam("projectId") String projectId,
+                              @RequestBody JSONObject param) throws Exception {
+        String equipId = param.getString("equipId");
+        String sysID = param.getString("sysId");
+        if(!StrUtil.isAllNotEmpty(equipId,sysID)) {
+            return AdmResponse.failure("必填项:EquipId(设备id)、sysIdList(系统id列表)");
+        }
+        InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
+        QueryCriteria queryRequest = new QueryCriteria();
+        ObjectNode node = JsonNodeFactory.instance.objectNode();
+        node.put("graphCode", "MechSubset");
+        node.put("relCode", "Sy2Eq");
+        node.put("objTo", equipId);
+        queryRequest.setCriteria(node);
+        service.doDelete(context,queryRequest);
+        // 创建关系对象
+        List<RelationDTO> voList = new ArrayList<>();
+        voList.add(new RelationDTO(null, "MechSubset", "Sy2Eq", null, sysID , equipId));
+        // 组装上下文条件
+        service.doSave(context, voList);
+        return AdmResponse.success();
+    }
+
+
+    /**
+     * 根据对象删除系统和设备的关系
+     *
+     * @param   entytyList           根据对象删除系统和设备的关系
+     * @return                  创建结果信息
+     */
+    public AdmResponse deleteBatch(@RequestParam String projectId,
+                              @RequestBody JSONArray entytyList) throws Exception {
+        if(CollUtil.isEmpty(entytyList)) {
+            return AdmResponse.success();
+        }
+        // 组装上下文条件
+        InstanceUrlParam context = new InstanceUrlParam(groupCode, null, projectId, AdmCommonConstant.APP_ID);
+        for (int i = 0; i < entytyList.size(); i++) {
+            JSONObject entity = entytyList.getJSONObject(i);
+            // 组装条件
+            QueryCriteria criteria = new QueryCriteria();
+            String equipId = entity.getString("equipId");
+            String sysID = entity.getString("sysId");
+            if(!StrUtil.isAllNotEmpty(equipId,sysID)) {
+                continue;
+            }
+            ObjectNode node = JsonNodeFactory.instance.objectNode();
+            node.put("graphCode", "MechSubset");
+            node.put("relCode", "Sy2Eq");
+            node.put("objFrom", sysID);
+            node.put("objTo", equipId);
+            criteria.setCriteria(node);
+            service.doDelete(context, criteria);
+        }
+        return AdmResponse.success();
+    }
+
+}

+ 3 - 0
src/main/java/com/persagy/proxy/adm/model/AdmFloor.java

@@ -87,4 +87,7 @@ public class AdmFloor {
     @CascadeColumn(graphCode = "ArchSubset", relCode = "Fl2Sp")
     private List<AdmSpace> spaceList;
 
+    /** 楼层平面图地址 */
+    private String floorMap;
+
 }

+ 27 - 0
src/main/java/com/persagy/proxy/adm/model/AdmManualRelCalRequest.java

@@ -0,0 +1,27 @@
+package com.persagy.proxy.adm.model;
+
+import lombok.Data;
+
+@Data
+public class AdmManualRelCalRequest {
+
+    /**主从对象类型,主1、从2*/
+    private String objectType;
+    /**关系类型*/
+    private String relType;
+    /**分类类型*/
+    private String category;
+    /**楼层id,未明确楼层传(isNull)*/
+    private String floorId;
+    /**建筑id,未明确建筑传(isNull)*/
+    private String buildingId;
+    /**模糊查询 关键词*/
+    private String vague;
+    /**模糊查询 关键词*/
+    private String vagueTo;
+    /** 第几页(从1开始) */
+    private Integer pageNumber;
+    /** 每页记录数(0 < 记录数 < 1000) */
+    private Integer pageSize;
+
+}

+ 26 - 0
src/main/java/com/persagy/proxy/adm/model/AdmManualRelationCalcDel.java

@@ -0,0 +1,26 @@
+package com.persagy.proxy.adm.model;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class AdmManualRelationCalcDel {
+
+    /**主对象Id*/
+    @NotNull(message = "主对象 id 不可以为空")
+    private String fromId;
+
+    /**从对象 Id*/
+    @NotNull(message = "从对象 id 不可以为空")
+    private String toId;
+
+    /**关系类型*/
+    @NotNull(message = "关系类型不可以为空")
+    String relType;
+
+    /**图类型*/
+    @NotNull(message = "图类型不可以为空")
+    String graphicType;
+
+}

+ 2 - 1
src/main/java/com/persagy/proxy/adm/model/AdmModelRel.java

@@ -1,5 +1,6 @@
 package com.persagy.proxy.adm.model;
 
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import lombok.Data;
 
 /**
@@ -28,5 +29,5 @@ public class AdmModelRel {
     private String modelId;
 
     /** 自定义属性 */
-    private String attributeMap;
+    private ObjectNode attributeMap;
 }

+ 2 - 1
src/main/java/com/persagy/proxy/adm/model/AdmRelationAddRequest.java

@@ -11,6 +11,7 @@ import lombok.NoArgsConstructor;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 
 @Data
 @Builder
@@ -27,7 +28,7 @@ public class AdmRelationAddRequest implements Serializable {
     private String mainContent;
 
     /**从对象内容*/
-    private List<String> fromContent;
+    private Set<String> fromContent;
 
     /**图类型编码*/
     @JsonAlias({"graphicType","graphic_type"})

+ 5 - 1
src/main/java/com/persagy/proxy/adm/model/AdmRelationObject.java

@@ -69,6 +69,10 @@ public class AdmRelationObject {
 	@ExcelProperty(value = "所属建筑楼层", index = 15)
 	private String slaveBelong;
 	
+	// 失败原因
+	@ExcelProperty(index = 16)
+	private String failureMsg;			// 失败原因
+	
 	@ExcelIgnore
 	private String masterBuildingName;	// 建筑本地名称
 
@@ -77,7 +81,7 @@ public class AdmRelationObject {
 	
 	@ExcelIgnore
 	private String slaveBuildingName;	// 建筑本地名称
-
+	
 	@ExcelIgnore
 	private String slaveFloorName;		// 楼层本地名称
 	

+ 4 - 0
src/main/java/com/persagy/proxy/adm/request/AdmCreateResponse.java

@@ -34,6 +34,10 @@ public class AdmCreateResponse {
         return new AdmCreateResponse(SUCCESS, null, null, null);
     }
 
+    public static AdmCreateResponse success(String message) {
+        return new AdmCreateResponse(SUCCESS, message, null, null);
+    }
+
     public static AdmCreateResponse failure(String message) {
         return new AdmCreateResponse(FAILURE, message, null, new ArrayList<>());
     }

+ 41 - 0
src/main/java/com/persagy/proxy/adm/request/AdmManualRelCalResponse.java

@@ -0,0 +1,41 @@
+package com.persagy.proxy.adm.request;
+
+import lombok.*;
+
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@AllArgsConstructor
+@NoArgsConstructor
+public class AdmManualRelCalResponse extends AdmResponse {
+
+    private final static String SUCCESS = "success";
+    private final static String FAILURE = "failure";
+
+    /** 方向 Left、right */
+    private String direction;
+
+    public AdmManualRelCalResponse(String result, String message, Long total, Integer pageNumber, Integer pageSize, List<?> content, String direction) {
+        this.setResult(result);
+        this.setMessage(message);
+        this.setTotal(total);
+        this.setPageNumber(pageNumber);
+        this.setPageSize(pageSize);
+        this.setContent(content);
+        this.setDirection(direction);
+    }
+
+    public static AdmResponse success() {
+        return new AdmManualRelCalResponse(SUCCESS, null, null, null, null, null,null);
+    }
+
+    public static AdmResponse failure(String message, String direction) {
+        return new AdmManualRelCalResponse(FAILURE, message, null, null, null, null,direction);
+    }
+
+    public static AdmResponse success(List<?> content, String direction) {
+        return new AdmManualRelCalResponse(SUCCESS, null, null, null, null, content,direction);
+    }
+}

+ 48 - 0
src/main/java/com/persagy/proxy/adm/service/AdmManualRelCalService.java

@@ -0,0 +1,48 @@
+package com.persagy.proxy.adm.service;
+
+import com.persagy.proxy.adm.model.AdmManualRelCalRequest;
+import com.persagy.proxy.adm.model.AdmManualRelationCalcDel;
+import com.persagy.proxy.adm.model.AdmRelationAddRequest;
+import com.persagy.proxy.adm.request.AdmCreateResponse;
+import com.persagy.proxy.adm.request.AdmManualRelCalResponse;
+import com.persagy.proxy.adm.request.AdmResponse;
+import com.persagy.proxy.common.entity.InstanceUrlParam;
+
+/***
+ * Description: 手动关系计算逻辑处理接口
+ * @author : lijie
+ * @date :2021/8/31 12:14
+ * Update By lijie 2021/8/31 12:14
+ */
+public interface AdmManualRelCalService {
+    /***
+     * Description: 添加关系
+     *
+     * @param context: 存储集团编码及项目id的上下文
+     * @param request : 请求参数
+     * @return : com.persagy.proxy.adm.request.AdmCreateResponse
+     * @author : lijie
+     * @date :2021/8/31 12:14
+     * Update By lijie 2021/8/31 12:14
+     */
+    AdmCreateResponse addRels(InstanceUrlParam context, AdmRelationAddRequest request);
+    /***
+     * Description: 删除关系
+     * @param admManualRelationCalcDel : 请求参数
+     * @return : com.persagy.proxy.adm.request.AdmCreateResponse
+     * @author : lijie
+     * @date :2021/8/31 12:10
+     * Update By lijie 2021/8/31 12:10
+     */
+    AdmCreateResponse delRels(InstanceUrlParam context, AdmManualRelationCalcDel admManualRelationCalcDel);
+    /***
+     * Description: 查询关系数据
+     * @param admManualRelCalRequest : 请求参数
+     * @return : com.persagy.proxy.adm.request.AdmCreateResponse
+     * @author : lijie
+     * @date :2021/8/31 12:10
+     * Update By lijie 2021/8/31 12:10
+     */
+    AdmResponse query(InstanceUrlParam context, AdmManualRelCalRequest admManualRelCalRequest);
+
+}

+ 0 - 21
src/main/java/com/persagy/proxy/adm/service/AdmManualRelationCalcService.java

@@ -1,21 +0,0 @@
-package com.persagy.proxy.adm.service;
-
-import com.persagy.proxy.adm.model.AdmRelationAddRequest;
-import com.persagy.proxy.adm.request.AdmCreateResponse;
-/***
- * Description: 手动关系计算逻辑处理接口
- * @author : lijie
- * @date :2021/8/31 12:14
- * Update By lijie 2021/8/31 12:14
- */
-public interface AdmManualRelationCalcService {
-    /***
-     * Description: 添加关系
-     * @param request : 请求参数
-     * @return : com.persagy.proxy.adm.request.AdmCreateResponse  
-     * @author : lijie
-     * @date :2021/8/31 12:14
-     * Update By lijie 2021/8/31 12:14
-     */
-    AdmCreateResponse addRels(AdmRelationAddRequest request);
-}

+ 14 - 1
src/main/java/com/persagy/proxy/adm/service/IAdmModelRelService.java

@@ -1,6 +1,10 @@
 package com.persagy.proxy.adm.service;
 
 import com.persagy.proxy.adm.model.AdmLocationPoint;
+import com.persagy.proxy.adm.model.AdmModelRel;
+import com.persagy.proxy.common.entity.InstanceUrlParam;
+
+import java.util.List;
 
 /**
  * @ClassName IAdmModelRelService
@@ -9,5 +13,14 @@ import com.persagy.proxy.adm.model.AdmLocationPoint;
  * @Date 2021/8/31 14:30
  * @Version V1.0
  **/
-public interface IAdmModelRelService extends IAdmBaseService<AdmLocationPoint>{
+public interface IAdmModelRelService extends IAdmBaseService<AdmModelRel>{
+
+    /**
+     * 修改
+     * @param context
+     * @param clazz
+     * @param vo
+     * @return
+     */
+    List<AdmModelRel> doUpdateModelInfo(InstanceUrlParam context, Class<AdmModelRel> clazz, AdmModelRel vo)  throws Exception;
 }

+ 14 - 1
src/main/java/com/persagy/proxy/adm/service/IReportDownloadService.java

@@ -14,7 +14,7 @@ import com.persagy.proxy.adm.model.AdmRelationObject;
  * @author zhangqiankun
  * @date 2021831日 下午4:42:51
  */
-public interface IReportDownloadService {
+public interface IRelationReportService {
 
 	/**
 	 * 获取指定对象信息
@@ -27,6 +27,19 @@ public interface IReportDownloadService {
 	ObjectNode getObjectNode(String groupCode, String projectId, String id);
 	
 	/**
+	 * 获取指定对象信息
+	 * <p>定制接口,不建议兼容额外的处理方案</p>
+	 * 
+	 * @param groupCode
+	 * @param projectId
+	 * @param objType
+	 * @param code	ADM-中的code类型,请参考{@link com.persagy.proxy.adm.strategy.relationdata.QueryRelationObjectStrategy#OBJNAME_2_TYPE}
+	 * @param value 属性值
+	 * @return
+	 */
+	List<ObjectNode> findObjectNodes(String groupCode, String projectId, String objType, String code, String value);
+	
+	/**
 	 * 获取对象,通过关系对象的id和rel_code
 	 * 
 	 * @param groupCode

+ 132 - 18
src/main/java/com/persagy/proxy/adm/service/impl/AbstractAdmManualRelationCalcServiceImpl.java

@@ -1,17 +1,34 @@
 package com.persagy.proxy.adm.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.StrUtil;
+import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.common.context.AppContext;
+import com.persagy.dmp.common.model.response.CommonResult;
+import com.persagy.dmp.digital.client.DigitalObjectClient;
+import com.persagy.dmp.digital.client.DigitalObjectFacade;
+import com.persagy.dmp.digital.client.DigitalRelationCaclClient;
+import com.persagy.dmp.digital.entity.ObjectDigital;
+import com.persagy.dmp.digital.entity.ObjectRelation;
 import com.persagy.proxy.adm.constant.AdmObjectInfoConstant;
+import com.persagy.proxy.adm.constant.BusinessErrorRwdCode;
+import com.persagy.proxy.adm.model.AdmManualRelCalRequest;
+import com.persagy.proxy.adm.model.AdmManualRelationCalcDel;
 import com.persagy.proxy.adm.model.AdmRelationAddRequest;
 import com.persagy.proxy.adm.request.AdmCreateResponse;
-import com.persagy.proxy.adm.service.AdmManualRelationCalcService;
+import com.persagy.proxy.adm.request.AdmManualRelCalResponse;
+import com.persagy.proxy.adm.request.AdmResponse;
+import com.persagy.proxy.adm.service.AdmManualRelCalService;
 import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
+import com.persagy.proxy.common.entity.InstanceUrlParam;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /***
  * Description: 手动计算逻辑处理类
@@ -21,10 +38,18 @@ import java.util.Map;
  */
 @Service
 @Slf4j
-public class AbstractAdmManualRelationCalcServiceImpl implements AdmManualRelationCalcService {
+@RequiredArgsConstructor
+public class AdmManualRelCalServiceImpl implements AdmManualRelCalService {
+
+    private final DigitalRelationCaclClient digitalRelationCaclClient;
+    private final DigitalObjectClient digitalObjectClient;
+
+
 
     /***
      * Description: 添加关系
+     *
+     * @param context
      * @param request : 请求参数
      * @return : com.persagy.proxy.adm.request.AdmCreateResponse
      * @author : lijie
@@ -32,7 +57,7 @@ public class AbstractAdmManualRelationCalcServiceImpl implements AdmManualRelati
      * Update By lijie 2021/8/31 12:14
      */
     @Override
-    public AdmCreateResponse addRels(AdmRelationAddRequest request) {
+    public AdmCreateResponse addRels(InstanceUrlParam context, AdmRelationAddRequest request) {
         // 获取项目id
         String projectId = AppContext.getContext().getProjectId();
         if (StrUtil.isBlank(request.getRelType())){
@@ -66,14 +91,45 @@ public class AbstractAdmManualRelationCalcServiceImpl implements AdmManualRelati
         if (AdmObjectInfoConstant.CADID.equals(request.getType()) && relationTypeEnum.getHasCheckCadId()){
             return AdmCreateResponse.failure("从对象不存在CADID编码","2");
         }
-
-
-
-
-        // 1.根据项目id和关系类型更新计算时间为当前时间
-        // 2.根据不同关系类型进行处理
-
-
+        // relType为下面几种的从对象不能重复,主对象和从对象不能重复
+        if (AdmObjectInfoConstant.CHECK_SPECIAL_TYPES.contains(request.getRelType())){
+            Set<String> fromContent = request.getFromContent();
+            if (fromContent.contains(request.getMainContent())){
+                return AdmCreateResponse.failure(request.getMainContent()+":从对象不能重复","2");
+            }
+        }
+        RequestData requestData = RequestData.builder()
+                .graphCode(relationTypeEnum.getGraphCode())
+                .relCode(relationTypeEnum.getRelCode())
+                .masterObjType(relationTypeEnum.getMasterObjType())
+                .slaveObjType(relationTypeEnum.getSlaveObjType())
+                .type(request.getType())
+                .hasRelValue(relationTypeEnum.getHasRelValue())
+                .hasFilterMasterId(relationTypeEnum.getHasFilterMasterId())
+                .hasFilterClassCode(relationTypeEnum.getHasFilterClassCode())
+                .hasCheckSensor(relationTypeEnum.getHasCheckSensor())
+                .hasCheckClassCode(relationTypeEnum.getHasCheckClassCode())
+                .checkClassCodes(relationTypeEnum.getCheckClassCodes())
+                .checkSensorCodes(relationTypeEnum.getCheckSensorCodes())
+                .sign("1")
+                .mainContent(request.getMainContent())
+                .fromContent(request.getFromContent())
+                .build();
+        CommonResult<List<ObjectRelation>> commonResult = digitalRelationCaclClient
+                .createObjRelationsByKeywordAndObjType(context.getGroupCode(), context.getProjectId(),
+                        context.getAppId(), "0", requestData);
+        if (BusinessErrorRwdCode.A7301.getCode().equals(commonResult.getResult())
+                || BusinessErrorRwdCode.A7302.getCode().equals(commonResult.getResult())
+                || BusinessErrorRwdCode.A7305.getCode().equals(commonResult.getResult())
+                || BusinessErrorRwdCode.A7306.getCode().equals(commonResult.getResult())){
+            return AdmCreateResponse.failure(commonResult.getMessage(),"1");
+        }
+        if (BusinessErrorRwdCode.A7303.getCode().equals(commonResult.getResult())
+                || BusinessErrorRwdCode.A7304.getCode().equals(commonResult.getResult())){
+            return AdmCreateResponse.failure(commonResult.getMessage(),"2");
+        }
+        return AdmCreateResponse.success("添加成功");
+        // 原数据中心逻辑
         // 2.2 特殊类型的判断
         // *******
         // sp2sp_RadiationNetwork_2,sp2sp_RadiationNetwork_1 && classCode!=LightingZone errorType=1,不是照明分区类型
@@ -219,17 +275,75 @@ public class AbstractAdmManualRelationCalcServiceImpl implements AdmManualRelati
         // 传感器类型检查
         // eq2sp_SensorRelationship_ss2sp:图类型为SensorRelationship,边类型为Ss2Sp
         // *****
-        // eq2sp_x
+        // eq2sp_x,已经不存在的类型
         // bd2bd_ArchForArch,bd2fl_ArchForArch,bd2sh_ArchForArch,bd2sp_ArchForArch,fl2bd_ArchForArch,fl2fl_ArchForArch
         // fl2sh_ArchForArch,fl2sp_ArchForArch,sh2bd_ArchForArch,sh2fl_ArchForArch,sh2sh_ArchForArch,sh2sp_ArchForArch
         // sp2bd_ArchForArch,sp2fl_ArchForArch,sp2sh_ArchForArch,sp2sp_ArchForArch
 
+    }
+    /***
+     * Description: 删除关系
+     * @param admManualRelationCalcDel : 请求参数
+     * @return : com.persagy.proxy.adm.request.AdmCreateResponse
+     * @author : lijie
+     * @date :2021/8/31 12:10
+     * Update By lijie 2021/8/31 12:10
+     */
+    @Override
+    public AdmCreateResponse delRels(InstanceUrlParam context, AdmManualRelationCalcDel admManualRelationCalcDel) {
+        ObjectRelation objectRelation = new ObjectRelation();
+        Map<String, AdmRelationTypeEnum> relationTypeMap = AdmRelationTypeEnum.getRelationTypeMap();
+        if (relationTypeMap.containsKey(admManualRelationCalcDel.getRelType())){
+            return AdmCreateResponse.failure("不存在的关系类型");
+        }
+        AdmRelationTypeEnum relationTypeEnum = relationTypeMap.get(admManualRelationCalcDel.getRelType());
+        objectRelation.setGraphCode(relationTypeEnum.getGraphCode());
+        objectRelation.setRelCode(relationTypeEnum.getRelCode());
+        objectRelation.setObjFrom(admManualRelationCalcDel.getFromId());
+        objectRelation.setObjTo(admManualRelationCalcDel.getToId());
+        CommonResult<List<ObjectRelation>> commonResult = digitalRelationCaclClient.deleteObjRelationsByRelId(context.getGroupCode(),
+                context.getProjectId(), context.getAppId(), "0", objectRelation);
+        if (!"success".equals(commonResult.getResult())){
+            return AdmCreateResponse.failure(commonResult.getMessage());
+        }
+        return AdmCreateResponse.success("删除关系成功");
+    }
 
-
-
-
-
-
-        return null;
+    /***
+     * Description: 查询关系数据
+     * @param admManualRelCalRequest : 请求参数
+     * @return : com.persagy.proxy.adm.request.AdmCreateResponse
+     * @author : lijie
+     * @date :2021/8/31 12:10
+     * Update By lijie 2021/8/31 12:10
+     */
+    @Override
+    public AdmResponse query(InstanceUrlParam context, AdmManualRelCalRequest admManualRelCalRequest) {
+        Map<String, AdmRelationTypeEnum> relationTypeMap = AdmRelationTypeEnum.getRelationTypeMap();
+        if (relationTypeMap.containsKey(admManualRelCalRequest.getRelType())){
+            return AdmManualRelCalResponse.failure("不存在的关系类型");
+        }
+        AdmRelationTypeEnum relationTypeEnum = relationTypeMap.get(admManualRelCalRequest.getRelType());
+        RequestData requestData = RequestData.builder()
+                .graphCode(relationTypeEnum.getGraphCode())
+                .relCode(relationTypeEnum.getRelCode())
+                .relValue(admManualRelCalRequest.getCategory())
+                .mainContent(admManualRelCalRequest.getVague())
+                .build();
+        if (null!=admManualRelCalRequest.getPageNumber()){
+            requestData.setPage(Long.valueOf(admManualRelCalRequest.getPageNumber()));
+        }
+        if (null!=admManualRelCalRequest.getPageSize()){
+            requestData.setSize(Long.valueOf(admManualRelCalRequest.getPageSize()));
+        }
+        if (StrUtil.isNotBlank(admManualRelCalRequest.getVagueTo())){
+            requestData.setFromContent(CollUtil.newHashSet(admManualRelCalRequest.getVagueTo()));
+        }
+        CommonResult<List<ObjectDigital>> commonResult = digitalObjectClient
+                .queryObjectListByGraphCodeAndRelCode(context.getGroupCode(), context.getProjectId(),
+                        context.getAppId(), "0", requestData);
+        return new AdmManualRelCalResponse(commonResult.getResult(),commonResult.getMessage(),commonResult.getCount(),
+                admManualRelCalRequest.getPageNumber(),admManualRelCalRequest.getPageSize(),
+                commonResult.getData(),"Left");
     }
 }

+ 347 - 4
src/main/java/com/persagy/proxy/adm/service/impl/AdmModelRelServiceImpl.java

@@ -1,10 +1,27 @@
 package com.persagy.proxy.adm.service.impl;
 
-import com.persagy.proxy.adm.model.AdmLocationPoint;
-import com.persagy.proxy.adm.service.IAdmLocationPointService;
-import com.persagy.proxy.adm.service.IAdmModelRelService;
+import cn.hutool.core.collection.CollUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.proxy.adm.constant.AdmCommonConstant;
+import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
+import com.persagy.proxy.adm.model.*;
+import com.persagy.proxy.adm.request.AdmQueryCriteria;
+import com.persagy.proxy.adm.request.AdmResponse;
+import com.persagy.proxy.adm.service.*;
+import com.persagy.proxy.adm.utils.GeoToolsUtil;
+import com.persagy.proxy.common.entity.InstanceUrlParam;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
 /**
  * @ClassName AdmModelRelServiceImpl
  * @Description: 模型修改设备元空间的建筑楼层信息
@@ -13,6 +30,332 @@ import org.springframework.stereotype.Service;
  * @Version V1.0
  **/
 @Service
-public class AdmModelRelServiceImpl extends AbstractAdmBaseServiceImpl<AdmLocationPoint> implements IAdmModelRelService {
+@Slf4j
+public class AdmModelRelServiceImpl extends AbstractAdmBaseServiceImpl<AdmModelRel> implements IAdmModelRelService {
+
+
+    @Autowired
+    private IAdmFloorService floorService;
+
+    @Autowired
+    private IAdmEquipmentService equipmentService;
+
+    @Autowired
+    private IAdmISpaceService iSpaceService;
+
+    /**
+     * 模型修改设备元空间的建筑楼层信息
+     * @param context
+     * @param clazz
+     * @param vo
+     * @return
+     */
+    @Override
+    public List<AdmModelRel> doUpdateModelInfo(InstanceUrlParam context, Class<AdmModelRel> clazz, AdmModelRel vo) throws Exception{
+
+        //1.查询模型文件是否有楼层在使用
+        AdmModelRel floorCriteria = new AdmModelRel();
+        floorCriteria.setModelId(vo.getModelId());
+        List<AdmFloor> floorList = queryFloorEntity(context,floorCriteria);
+        if(CollUtil.isNotEmpty(floorList)){
+            List<String> floorQueryTypes = getFloorQueryTypes(floorList);
+            //根据类型查询relation_type_project
+            //更新边类型计算状态:computationalState为2
+
+        }
+        //2.修改设备和元空间的建筑楼层信息
+        String oldBimId = vo.getOldBimId();
+        String bimId = vo.getBimId();
+
+        if(StringUtils.isNotEmpty(oldBimId)  && !oldBimId.equals(bimId)){
+            //根据模型id重置设备元空间的建筑楼层信息
+            resetEquipIspaceInfo(context,vo);
+        }
+
+        //查询楼层实体
+        floorCriteria = new AdmModelRel();
+        floorCriteria.setFloorId(vo.getFloorId());
+        List<AdmFloor> admFloors = queryFloorEntity(context, floorCriteria);
+        if(CollUtil.isEmpty(admFloors)){
+            throw new Exception("楼层不存在");
+        }
+        AdmFloor floorEntity = admFloors.get(0);
+        //2.1 模型修改设备的建筑楼层信息
+        if(CollUtil.isEmpty(floorEntity.getOutline())){
+            //如果楼层的轮廓线为空的话,直接修改
+            updateEquipModelInfo(context, vo,floorEntity);
+        }else{
+            //判断该设备的坐标是否在层楼的轮廓中,若在,修改;不在,不修改
+            List<AdmEquipment> admEquipments = queryModelEquip(context, vo);
+            Boolean pointInPolygon = isPointInPolygon(admEquipments, floorEntity);
+            if(pointInPolygon){
+                updateEquipModelInfo(context, vo,floorEntity);
+            }
+        }
+        //2.2 模型修改元空间的建筑楼层信息
+        updateIspaceModelInfo(context, vo,floorEntity);
+
+        //3. 修改楼层平面图地址
+        if(StringUtils.isNotEmpty(vo.getFloorMap())){
+            floorEntity.setFloorMap(vo.getFloorMap());
+        }
+        floorEntity.setModelId(vo.getModelId());
+        floorEntity.setBimIdPre(vo.getBimId());
+
+        //4.处理楼层自定义属性:楼层标高
+        ObjectNode attributeMap = vo.getAttributeMap();
+        if(attributeMap!=null){
+            updateFloorElevation(vo.getAttributeMap().toString(),floorEntity);
+        }
+
+        //5.修改楼层信息
+        ArrayList<AdmFloor> floors = new ArrayList<>();
+        floors.add(floorEntity);
+        List<AdmFloor> floorUpresult = floorService.doUpdate(context, AdmFloor.class, floors);
+        if(CollUtil.isEmpty(floorUpresult)) {
+            //6.发送消息,BDTP已发送,不再重复发送修改对象消息
+        }
+        return null;
+    }
+
+    /**
+     * 模型修改设备的建筑楼层信息
+     */
+    private void updateEquipModelInfo(InstanceUrlParam context, AdmModelRel modelRel,AdmFloor floorEntity){
+
+        //查询模型下的设备信息
+        AdmQueryCriteria criteria = new AdmQueryCriteria();
+        criteria.setFilters("bimId = "+modelRel.getBimId());
+        criteria.setFilters("floorId = "+modelRel.getFloorId());
+        AdmResponse admResponse = equipmentService.doQuery(context, criteria, AdmEquipment.class);
+        List<AdmEquipment> content = (List<AdmEquipment>) admResponse.getContent();
+        if(CollUtil.isEmpty(content)){
+            return;
+        }
+        for (AdmEquipment admEquipment : content) {
+            //修改设备的建筑楼层信息
+            admEquipment.setBuildingId(floorEntity.getBuildingId());
+            admEquipment.setFloorId(floorEntity.getId());
+        }
+        List<AdmEquipment> admEquipments = equipmentService.doUpdate(context, AdmEquipment.class, content);
+        log.info("模型修改设备建筑楼层信息结果"+admEquipments);
+    }
+
+
+    /**
+     * 模型修改元空间的建筑楼层信息
+     */
+    private void updateIspaceModelInfo(InstanceUrlParam context, AdmModelRel modelRel,AdmFloor floorEntity){
+
+        //查询模型下的元空间信息
+        AdmQueryCriteria criteria = new AdmQueryCriteria();
+        criteria.setFilters("bimId = "+modelRel.getBimId());
+        criteria.setFilters("floorId = "+modelRel.getFloorId());
+        AdmResponse admResponse = iSpaceService.doQuery(context, criteria, AdmISpace.class);
+        List<AdmISpace> content = (List<AdmISpace>) admResponse.getContent();
+        if(CollUtil.isEmpty(content)){
+            return;
+        }
+        for (AdmISpace admIspace : content) {
+            //修改设备的建筑楼层信息
+            admIspace.setBuildingId(floorEntity.getBuildingId());
+            admIspace.setFloorId(floorEntity.getId());
+        }
+        List<AdmISpace> admEquipments = iSpaceService.doUpdate(context, AdmISpace.class, content);
+        log.info("模型修改元空间的建筑楼层信息结果"+admEquipments);
+    }
+
+
+    /**
+     * 判断点是否在面中
+     * @return
+     */
+    private Boolean isPointInPolygon(List<AdmEquipment> equipments,AdmFloor floor){
+        if(CollUtil.isEmpty(equipments)){
+            return false;
+        }
+        Boolean flag = true;
+        //楼层轮廓线
+        List<ObjectNode> outline = floor.getOutline();
+        for (AdmEquipment equipment : equipments) {
+            //设备BIM坐标
+            String bimLocation = equipment.getBimLocation();
+            //判断点是否在面中:即设备位置是否在该楼层轮廓线中
+            if(StringUtils.isEmpty(bimLocation)){
+                continue;
+            }
+            String[] split = bimLocation.split(",");
+            ObjectNode node = JsonNodeFactory.instance.objectNode();
+            node.put("X",split[0]);
+            node.put("Y",split[1]);
+            node.put("Z",split[2]);
+            flag = GeoToolsUtil.isPointInPoly(node,outline);
+            if(!flag){
+                return flag;
+            }
+        }
+        return flag;
+    }
+
+
+    /**
+     * 楼层属性修改
+     * @param floorMapStr
+     * @param floorEntity
+     */
+    private void updateFloorMap(String floorMapStr,AdmFloor floorEntity){
+        if(StringUtils.isEmpty(floorMapStr)){
+            return;
+        }
+        Map<String, Object> floorMap = JSONObject.toJavaObject(JSON.parseObject(floorMapStr), Map.class);
+        Map<String, Object> infos = floorEntity.getInfos();
+        for(Map.Entry<String,Object> map : floorMap.entrySet()){
+            infos.put(map.getKey(),map.getValue());
+        }
+        floorEntity.setInfos(infos);
+    }
+
+    /**
+     * 处理楼层标高
+     * @param floorMapStr
+     * @param floorEntity
+     */
+    private void updateFloorElevation(String floorMapStr,AdmFloor floorEntity){
+        if(StringUtils.isEmpty(floorMapStr)){
+            return;
+        }
+        Map<String, Object> floorMap = JSONObject.toJavaObject(JSON.parseObject(floorMapStr), Map.class);
+
+        Map<String, Object> infos = floorEntity.getInfos();
+        if(floorMap.containsKey(AdmCommonConstant.FLOOR_ELEVATION)){
+            Object object = floorMap.get(AdmCommonConstant.FLOOR_ELEVATION);
+            if(object != null){
+                double floorElevation = (Double) object / 1000;
+                infos.put(AdmCommonConstant.FLOOR_ELEVATION,floorElevation);
+            }
+        }
+    }
+
+
+    /**
+     * 根据模型id重置设备元空间的建筑楼层信息
+     * @param context
+     * @param vo
+     */
+    private void resetEquipIspaceInfo(InstanceUrlParam context, AdmModelRel vo){
+        //重置历史设备的建筑楼层信息
+        List<AdmEquipment> admEquipments = queryEquipmentByBimId(context, vo);
+        if(CollUtil.isNotEmpty(admEquipments)){
+            admEquipments.forEach(item->{
+                item.setFloorId(null);
+                item.setBuildingId(null);
+            });
+        }
+        equipmentService.doUpdate(context,AdmEquipment.class,admEquipments);
+
+        //重置历史元空间的建筑楼层信息
+        List<AdmISpace> admISpaces = queryIspaceByBimId(context, vo);
+        if(CollUtil.isNotEmpty(admISpaces)){
+            admISpaces.forEach(item->{
+                item.setFloorId(null);
+                item.setBuildingId(null);
+            });
+        }
+       iSpaceService.doUpdate(context,AdmISpace.class,admISpaces);
+    }
+
+
+    /**
+     * 查询设备信息
+     * @param context
+     * @param modelRel
+     */
+    private List<AdmEquipment> queryModelEquip(InstanceUrlParam context, AdmModelRel modelRel){
+        //查询模型下的设备信息
+        AdmQueryCriteria criteria = new AdmQueryCriteria();
+        criteria.setFilters("bimId = '"+modelRel.getBimId()+"'");
+        criteria.setFilters("floorId = '"+modelRel.getFloorId()+"'");
+        AdmResponse admResponse = equipmentService.doQuery(context, criteria, AdmEquipment.class);
+        if(CollUtil.isEmpty(admResponse.getContent())){
+            return new ArrayList<>();
+        }
+        return (List<AdmEquipment>) admResponse.getContent();
+    }
+
+    /**
+     * 根据BIMID查询历史设备信息
+     */
+    private List<AdmEquipment> queryEquipmentByBimId(InstanceUrlParam context, AdmModelRel vo){
+        AdmQueryCriteria criteria = new AdmQueryCriteria();
+        criteria.setFilters("bimId = '"+vo.getOldBimId()+"'");
+        AdmResponse admResponse = equipmentService.doQuery(context, criteria, AdmEquipment.class);
+        return (List<AdmEquipment>)admResponse.getContent();
+    }
+
+
+    /**
+     * 根据BIMID查询历史元空间信息
+     */
+    private List<AdmISpace> queryIspaceByBimId(InstanceUrlParam context, AdmModelRel vo){
+        AdmQueryCriteria criteria = new AdmQueryCriteria();
+        criteria.setFilters("bimId = '"+vo.getOldBimId()+"'");
+        AdmResponse admResponse = iSpaceService.doQuery(context, criteria, AdmISpace.class);
+        return (List<AdmISpace>)admResponse.getContent();
+    }
+
+
+    /**
+     * 查询模型文件是否有楼层在使用
+     */
+    private List<AdmFloor> queryFloorEntity(InstanceUrlParam context, AdmModelRel vo){
+        AdmQueryCriteria criteria = new AdmQueryCriteria();
+        if(StringUtils.isNotEmpty(vo.getModelId())){
+            criteria.setFilters("modelId = '"+vo.getModelId()+"'");
+        }
+        if(StringUtils.isNotEmpty(vo.getFloorId())){
+            criteria.setFilters("id = '"+vo.getFloorId()+"'");
+        }
+        AdmResponse admResponse = floorService.doQuery(context, criteria, AdmFloor.class);
+        return (List<AdmFloor>)admResponse.getContent();
+    }
+
 
+    /**
+     * 获取楼层查询类型
+     * @param floorList
+     */
+    private List<String> getFloorQueryTypes(List<AdmFloor> floorList){
+        List<String> types = new ArrayList<>();
+        for (AdmFloor admFloor : floorList) {
+            if(CollUtil.isNotEmpty(admFloor.getOutline())){
+                types.add("eq2fl");
+                types.add("fl2sp");
+                types.add("bd2sp");
+            }
+            types.add(AdmRelationTypeEnum.EQ2SP_IN.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_ACAIRNETWORK_2.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_CONDWATERNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_VENTNETWORK_2.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_ACAIRNETWORK_3.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_HEATWATERLOOP_4.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_HEATWATERLOOP_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_DHWNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_RECYCLEWATERNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_FIREVENTNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_FIREWATERNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_VRFNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_CHILLWATERLOOP_2.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQFRESHAIRNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_CHILLWATERLOOP_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_DRINKINGWATERNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_COOLINGWATERLOOP_2.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_VENTNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_HEATWATERLOOP_2.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_COOLINGWATERLOOP_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_ACAIRNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_SUPPLYWATERNETWORK_1.getRelCode());
+            types.add(AdmRelationTypeEnum.EQ2EQ_DRAININGWATERNETWORK_1.getRelCode());
+        }
+        return types;
+    }
 }

+ 28 - 3
src/main/java/com/persagy/proxy/adm/service/impl/ReportDownloadService.java

@@ -15,9 +15,11 @@ import com.persagy.dmp.digital.client.DigitalObjectFacade;
 import com.persagy.dmp.digital.client.DigitalRelationFacade;
 import com.persagy.dmp.digital.entity.ObjectRelation;
 import com.persagy.proxy.adm.constant.AdmCommonConstant;
+import com.persagy.proxy.adm.constant.AdmRelationType;
 import com.persagy.proxy.adm.model.AdmRelationObject;
-import com.persagy.proxy.adm.service.IReportDownloadService;
+import com.persagy.proxy.adm.service.IRelationReportService;
 import com.persagy.proxy.adm.strategy.QueryRelationObjectContext;
+import com.persagy.proxy.adm.strategy.relationdata.QueryRelationObjectStrategy;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
@@ -33,7 +35,7 @@ import lombok.extern.slf4j.Slf4j;
  */
 @Slf4j
 @Service
-public class ReportDownloadService implements IReportDownloadService {
+public class RelationReportService implements IRelationReportService {
 
 	public static final String cADID = "cADID";
 	
@@ -58,6 +60,26 @@ public class ReportDownloadService implements IReportDownloadService {
 	}
 	
 	@Override
+	public List<ObjectNode> findObjectNodes(String groupCode, String projectId, String objType, String code, String value) {
+		if (StrUtil.isBlank(code)) {
+			return null;
+		}
+		String key = QueryRelationObjectStrategy.OBJNAME_2_TYPE.get(code);
+		if (StrUtil.isBlank(key)) {
+			return null;
+		}
+		
+		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
+		QueryCriteria queryCriteria = new QueryCriteria();
+		ObjectNode objectNode = objectMapper.createObjectNode();
+		objectNode.put(key, value);
+		objectNode.put("objType", objType);
+		queryCriteria.setCriteria(objectNode);
+		List<ObjectNode> objectNodes = DigitalObjectFacade.query(groupCode, projectId, AdmCommonConstant.APP_ID, AdmCommonConstant.USER_ID, queryCriteria);
+		return objectNodes;
+	}
+	
+	@Override
 	public ObjectNode getObjectByCodeAndId(String groupCode, String projectId, String graphCode, String relCode, String objFrom, String objTo) {
 		groupCode = StrUtil.isBlank(groupCode) ? defaultCode : groupCode;
 		
@@ -102,8 +124,11 @@ public class ReportDownloadService implements IReportDownloadService {
 	@Override
 	public List<AdmRelationObject> reportRelationObject(String groupCode, String projectId, String relType, String code, String zoneType) {
 		groupCode = StrUtil.isBlank(groupCode) ? defaultCode : groupCode;
+		if (AdmRelationType.EQ2SP_SENSORRELATIONSHIP_SS2SP.equals(relType)){
+			relType = AdmRelationType.EQ2SP;
+        }
 		log.info("下载报表: groupCode[{}], projectId[{}], relType[{}], code[{}]", groupCode, projectId, relType, code);
 		return this.queryRelationObjectContext.findRelationObject(groupCode, projectId, relType);
 	}
-	
+
 }

+ 37 - 1
src/main/java/com/persagy/proxy/adm/strategy/QueryRelationObjectContext.java

@@ -7,6 +7,7 @@ import javax.annotation.Resource;
 
 import org.springframework.stereotype.Component;
 
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.Lists;
 import com.persagy.proxy.adm.model.AdmRelationObject;
 import com.persagy.proxy.adm.strategy.relationdata.QueryRelationObjectStrategy;
@@ -47,7 +48,42 @@ public class QueryRelationObjectContext {
 	 */
 	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId, String relType) {
 		QueryRelationObjectStrategy strategy = this.relationObjectStrategyMap.get(relType);
-		return strategy == null ? Lists.newArrayList() : strategy.findRelationObject(groupCode, projectId, relType);
+		return strategy == null ? Lists.newArrayList() : strategy.findRelationObject(groupCode, projectId);
 	}
 	
+	/**
+	 * 检查关联对象的合法性
+	 * 
+	 * @param relationObject 当前需要校验的对象
+	 * @param relType ADM-类型
+	 * @param code 获取对象的依据
+	 * @return String - 校验失败的原因, ObjectNode -- BDTP接口的参数,不会返回null,请用instanceOf 判断返回值
+	 */
+	public Object checkRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String relType, String code) {
+		QueryRelationObjectStrategy strategy = this.relationObjectStrategyMap.get(relType);
+		if (strategy == null) {
+			return "不存在此策略类";
+		}
+		
+		return strategy.beforeSaveRelationObject(relationObject, groupCode, projectId, code);
+	}
+	
+	/**
+	 * 批量保存对象之间的关系
+	 * 
+	 * @param admRelationObject
+	 * @param groupCode
+	 * @param projectId
+	 * @param relType ADM-传过来的边类型
+	 * @return 
+	 */
+	public boolean saveRelationObjects(List<ObjectNode> relationObjects, String groupCode, String projectId, String relType) {
+		QueryRelationObjectStrategy strategy = this.relationObjectStrategyMap.get(relType);
+		if (strategy == null) {
+			return false;
+		}
+		
+		return strategy.saveRelationObjects(relationObjects, groupCode, projectId);
+	}
+
 }

+ 108 - 34
src/main/java/com/persagy/proxy/adm/strategy/relationdata/AbstractQueryRelationObject.java

@@ -8,11 +8,16 @@ import java.util.Map;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.basic.model.QueryCriteria;
 import com.persagy.dmp.digital.client.DigitalObjectFacade;
+import com.persagy.dmp.digital.client.DigitalRelationFacade;
+import com.persagy.dmp.digital.entity.ObjectRelation;
 import com.persagy.proxy.adm.constant.AdmCommonConstant;
+import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
+import com.persagy.proxy.adm.constant.ObjTypeMapping;
 import com.persagy.proxy.adm.model.AdmRelationObject;
-import com.persagy.proxy.adm.service.IReportDownloadService;
+import com.persagy.proxy.adm.service.IRelationReportService;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
 
 /**
  * 
@@ -23,47 +28,27 @@ import cn.hutool.core.collection.CollectionUtil;
  */
 public abstract class AbstractQueryRelationObject implements QueryRelationObjectStrategy {
 
-	protected String groupCode;
+	protected IRelationReportService relationReportService;
 	
-	protected String projectId;
-	
-	protected IReportDownloadService reportDownloadService;
-	
-	public AbstractQueryRelationObject(IReportDownloadService reportDownloadService) {
-		this.reportDownloadService = reportDownloadService;
-	}
-	
-	@Override
-	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId, String relType) {
-		this.groupCode = groupCode;
-		this.projectId = projectId;
-		return this.findRelationObject(relType);
+	public AbstractQueryRelationObject(IRelationReportService reportDownloadService) {
+		this.relationReportService = reportDownloadService;
 	}
 	
 	/**
-	 * 查询出指定设备信息
-	 * 
-	 * @param relType
-	 * @return 返回ADM所需要的数据
-	 */
-	protected abstract List<AdmRelationObject> findRelationObject(String relType);
-	
-	/**
 	 * 根据项目ID,查询出所有的对象信息
 	 * 
 	 * @param requestData
-	 * @param relType
 	 * @param extraMapping
 	 * @return
 	 */
-	protected List<AdmRelationObject> queryAllObjectInfo(QueryCriteria queryCriteria, String relType) {
+	protected List<AdmRelationObject> queryAllObjectInfo(QueryCriteria queryCriteria, String groupCode, String projectId) {
 		List<ObjectNode> tempList = new ArrayList<ObjectNode>();
 		
 		// 获取数据
-		this.queryPageObjectInfo(tempList, queryCriteria, queryCriteria.getPage());
+		this.queryPageObjectInfo(tempList, queryCriteria, groupCode, projectId, queryCriteria.getPage());
 		
 		// 转换中台数据
-		return this.handleObjectDigital(tempList, relType);
+		return this.handleObjectDigital(tempList, groupCode, projectId);
 	}
 	
 	/**
@@ -76,14 +61,14 @@ public abstract class AbstractQueryRelationObject implements QueryRelationObject
 	 * @param page
 	 * @param pageSize
 	 */
-	protected void queryPageObjectInfo(List<ObjectNode> tempList, QueryCriteria queryCriteria, Long page) {
+	protected void queryPageObjectInfo(List<ObjectNode> tempList, QueryCriteria queryCriteria, String groupCode, String projectId, Long page) {
 		queryCriteria.setPage(page);
 		List<ObjectNode> objectNodes = DigitalObjectFacade.query(groupCode, projectId, AdmCommonConstant.APP_ID, AdmCommonConstant.USER_ID, queryCriteria);
 		if (CollectionUtil.isEmpty(objectNodes)) {
 			return;
 		}
 		tempList.addAll(objectNodes);
-		this.queryPageObjectInfo(tempList, queryCriteria, ++page);
+		this.queryPageObjectInfo(tempList, queryCriteria, groupCode, projectId, ++page);
 	}
 	
 	/**
@@ -92,10 +77,9 @@ public abstract class AbstractQueryRelationObject implements QueryRelationObject
 	 * @param tempList
 	 * @param groupCode
 	 * @param projectId
-	 * @param relType
 	 * @return
 	 */
-	private List<AdmRelationObject> handleObjectDigital(List<ObjectNode> tempList, String relType) {
+	private List<AdmRelationObject> handleObjectDigital(List<ObjectNode> tempList, String groupCode, String projectId) {
 		// 第一次遍历
 		// id -> object
 		Map<String, ObjectNode> tempAllMap = new HashMap<String, ObjectNode>(tempList.size());
@@ -104,18 +88,19 @@ public abstract class AbstractQueryRelationObject implements QueryRelationObject
 			tempAllMap.put(id, objectNode);
 		}
 		
-		return this.handleObjectDigital(tempAllMap, relType);
+		return this.handleObjectDigital(tempAllMap, groupCode, projectId);
 	}
 	
 	
 	/**
 	 * 处理中台响应数据,转换为ADM所需要的数据
 	 * 
+	 * @param groupCode
+	 * @param projectId
 	 * @param tempAllMap 对象ID -> 对象
-	 * @param relType
 	 * @return 不允许返回null
 	 */
-	protected abstract List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String relType);	
+	protected abstract List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode, String projectId);	
 	
 	/**
 	 * 封装响应数据,具体的传值,请仔细侦查,这里仅返回共有字段,特殊字段,自行赋值
@@ -162,4 +147,93 @@ public abstract class AbstractQueryRelationObject implements QueryRelationObject
 		return relationObject;
 	}
 	
+	
+	@Override
+	public boolean saveRelationObjects(List<ObjectNode> relationObjects, String groupCode, String projectId) {
+		List<ObjectRelation> create = DigitalRelationFacade.create(groupCode, projectId, AdmCommonConstant.APP_ID, AdmCommonConstant.USER_ID, relationObjects);
+		return 	CollectionUtil.isEmpty(create) ? false : true;
+	}
+	
+	/**
+	 * 检查关系对象数据的正确性,并完成额外字段的赋值功能
+	 * 
+	 * @param relationObject
+	 * @param relationTypeEnum AdmRelationTypeEnum枚举类
+	 * @param code
+	 * @return String - 校验失败的原因, ObjectNode -- BDTP接口的参数,不会返回null,请用instanceOf 判断返回值
+	 */
+	protected Object beforeSaveRelationObject(AdmRelationObject relationObject, AdmRelationTypeEnum relationTypeEnum,
+			String groupCode, String projectId, String code) {
+		if (!StrUtil.isAllNotBlank(relationObject.getMasterCode(), relationObject.getSlaveCode())) {
+			return "主对象或从对象的识别编码为空";
+		}
+		if (!StrUtil.isAllNotBlank(relationObject.getMasterId(), relationObject.getSlaveId())) {
+			return "主对象或从对象的ID为空";
+		}
+		
+		String relCode = relationTypeEnum.getRelCode();
+		String relCodePrefix = ObjTypeMapping.getRelCodePrefix(relCode);
+		String masterObjType = ObjTypeMapping.PREFIX_FULLNAME.get(relCodePrefix);
+		if (StrUtil.isBlank(masterObjType)) {
+			return "边类型错误";
+		}
+		String slaveObjType = ObjTypeMapping.PREFIX_FULLNAME.get(ObjTypeMapping.getRelCodePrefix(relCode));
+		if (StrUtil.isBlank(slaveObjType)) {
+			return "边类型错误";
+		}
+		// 查询出对象信息
+		List<ObjectNode> masters = this.relationReportService.findObjectNodes(groupCode, projectId, masterObjType, code, relationObject.getMasterCode());
+		if (CollectionUtil.isEmpty(masters)) {
+			return "未找到主对象";
+		}
+		if (masters.size() > 1) {
+			return "匹配到多个主对象";
+		}
+		// 查询出从对象
+		List<ObjectNode> slaves = this.relationReportService.findObjectNodes(groupCode, projectId, slaveObjType, code, relationObject.getSlaveCode());
+		if (CollectionUtil.isEmpty(slaves)) {
+			return "未找到从对象";
+		}
+		if (masters.size() > 1) {
+			return "匹配到多个从对象";
+		}
+		
+		// 添加关系数据
+		ObjectNode master = masters.get(0);
+		ObjectNode slave = slaves.get(0);
+		String masterClassCode = master.get("classCode") == null ? AdmCommonConstant.EMPTY : master.get("classCode").asText();
+		String slaveClassCode = slave.get("classCode") == null ? AdmCommonConstant.EMPTY : slave.get("classCode").asText();
+		
+		String result = this.checkRelationObject(master, masterClassCode, slave, slaveClassCode);
+		if (StrUtil.isBlank(result)) {
+			ObjectNode objectNode = OBJECT_MAPPER.createObjectNode();
+			String graphCode = relationTypeEnum.getGraphCode();
+			objectNode.put("graphId", "Gt" + graphCode + "001");
+			objectNode.put("graphCode", graphCode);
+			objectNode.put("relCode", relCode);
+			if ("Sp".equals(relCodePrefix)) {
+				objectNode.put("relValue", masterClassCode);
+			}
+			objectNode.put("objFrom", relationObject.getMasterId());
+			objectNode.put("objTo", relationObject.getSlaveId());
+			return objectNode;
+		}
+		
+		return result; 
+	} 
+	
+	/**
+	 * 检查关系对象数据的正确性,并可完成额外字段的赋值功能
+	 * 默认不实现,由子类实现
+	 * 
+	 * @param master
+	 * @param masterClassCode
+	 * @param slave
+	 * @param slaveClassCode
+	 * @return 当为null时,检查通过,否则失败,返回失败原因
+	 */
+	protected String checkRelationObject(ObjectNode master, String masterClassCode, ObjectNode slave, String slaveClassCode) {
+		return null;
+	}
+
 }

+ 13 - 8
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Eq2BdForRelationObject.java

@@ -19,7 +19,7 @@ import com.persagy.proxy.adm.constant.AdmRelationType;
 import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
 import com.persagy.proxy.adm.constant.RelCodeEnum;
 import com.persagy.proxy.adm.model.AdmRelationObject;
-import com.persagy.proxy.adm.service.IReportDownloadService;
+import com.persagy.proxy.adm.service.IRelationReportService;
 
 import cn.hutool.core.util.StrUtil;
 
@@ -33,12 +33,12 @@ import cn.hutool.core.util.StrUtil;
 @Component(value = AdmRelationType.EQ2BD_FOR)
 public class Eq2BdForRelationObject extends AbstractQueryRelationObject {
 
-	public Eq2BdForRelationObject(IReportDownloadService reportDownloadService) {
-		super(reportDownloadService);
+	public Eq2BdForRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
 	}
 
 	@Override
-	protected List<AdmRelationObject> findRelationObject(String relType) {
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
 		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
 		QueryCriteria queryCriteria = new QueryCriteria();
 		ObjectNode criteria = objectMapper.createObjectNode();
@@ -52,15 +52,15 @@ public class Eq2BdForRelationObject extends AbstractQueryRelationObject {
 		queryCriteria.setPage(1L);
 		queryCriteria.setSize(1000L);
 		
-		return this.queryAllObjectInfo(queryCriteria, relType);
+		return this.queryAllObjectInfo(queryCriteria, groupCode, projectId);
 	}
 
 	@Override
-	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String relType) {
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode, String projectId) {
 		Set<String> allKeys = tempAllMap.keySet();
 		List<AdmRelationObject> resultList = new ArrayList<AdmRelationObject>();
 		
-		List<ObjectRelation> relationList = this.reportDownloadService.findObjectRelationList(groupCode, projectId, 
+		List<ObjectRelation> relationList = this.relationReportService.findObjectRelationList(groupCode, projectId, 
 				AdmRelationTypeEnum.EQ2BD_FOR.getGraphCode(), AdmRelationTypeEnum.EQ2BD_FOR.getRelCode());
 		for (ObjectRelation objectRelation : relationList) {
 			String equipId = objectRelation.getObjFrom();
@@ -72,7 +72,7 @@ public class Eq2BdForRelationObject extends AbstractQueryRelationObject {
 			ObjectNode building = tempAllMap.get(buildingId);
 			
 			// 获取楼层信息
-			ObjectNode floorInfo = this.reportDownloadService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.EQ2BD_FOR.getGraphCode(), 
+			ObjectNode floorInfo = this.relationReportService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.EQ2BD_FOR.getGraphCode(), 
 					RelCodeEnum.Eq2Fl.name(), equipId, null);
 			
 			AdmRelationObject convertObject = this.convertObject(equipment, "设备", building, "建筑");
@@ -94,4 +94,9 @@ public class Eq2BdForRelationObject extends AbstractQueryRelationObject {
 		return resultList;
 	}
 
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.EQ2BD_FOR, groupCode, projectId, code);
+	}
+
 }

+ 13 - 8
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Eq2BdRelationObject.java

@@ -19,7 +19,7 @@ import com.persagy.proxy.adm.constant.AdmRelationType;
 import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
 import com.persagy.proxy.adm.constant.RelCodeEnum;
 import com.persagy.proxy.adm.model.AdmRelationObject;
-import com.persagy.proxy.adm.service.IReportDownloadService;
+import com.persagy.proxy.adm.service.IRelationReportService;
 
 /**
  * 
@@ -31,12 +31,12 @@ import com.persagy.proxy.adm.service.IReportDownloadService;
 @Component(value = AdmRelationType.EQ2BD)
 public class Eq2BdRelationObject extends AbstractQueryRelationObject {
 
-	public Eq2BdRelationObject(IReportDownloadService reportDownloadService) {
-		super(reportDownloadService);
+	public Eq2BdRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
 	}
 
 	@Override
-	protected List<AdmRelationObject> findRelationObject(String relType) {
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
 		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
 		QueryCriteria queryCriteria = new QueryCriteria();
 		ObjectNode criteria = objectMapper.createObjectNode();
@@ -50,15 +50,15 @@ public class Eq2BdRelationObject extends AbstractQueryRelationObject {
 		queryCriteria.setPage(1L);
 		queryCriteria.setSize(1000L);
 		
-		return this.queryAllObjectInfo(queryCriteria, relType);
+		return this.queryAllObjectInfo(queryCriteria, groupCode, projectId);
 	}
 
 	@Override
-	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String relType) {
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode, String projectId) {
 		Set<String> allKeys = tempAllMap.keySet();
 		List<AdmRelationObject> resultList = new ArrayList<AdmRelationObject>();
 		
-		List<ObjectRelation> relationList = this.reportDownloadService.findObjectRelationList(groupCode, projectId, 
+		List<ObjectRelation> relationList = this.relationReportService.findObjectRelationList(groupCode, projectId, 
 				AdmRelationTypeEnum.EQ2BD.getGraphCode(), AdmRelationTypeEnum.EQ2BD.getRelCode());
 		for (ObjectRelation objectRelation : relationList) {
 			String equipId = objectRelation.getObjFrom();
@@ -70,7 +70,7 @@ public class Eq2BdRelationObject extends AbstractQueryRelationObject {
 			ObjectNode building = tempAllMap.get(buildingId);
 			
 			// 获取楼层信息
-			ObjectNode floorInfo = this.reportDownloadService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.EQ2BD.getGraphCode(), 
+			ObjectNode floorInfo = this.relationReportService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.EQ2BD.getGraphCode(), 
 					RelCodeEnum.Eq2Fl.name(), equipId, null);
 			
 			AdmRelationObject convertObject = this.convertObject(equipment, "设备", building, "建筑");
@@ -85,4 +85,9 @@ public class Eq2BdRelationObject extends AbstractQueryRelationObject {
 		return resultList;
 	}
 
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.EQ2BD, groupCode, projectId, code);
+	}
+
 }

+ 54 - 0
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Eq2EqEqBackupRelationObject.java

@@ -0,0 +1,54 @@
+package com.persagy.proxy.adm.strategy.relationdata;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.proxy.adm.constant.AdmObjectInfoConstant;
+import com.persagy.proxy.adm.constant.AdmRelationType;
+import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
+import com.persagy.proxy.adm.model.AdmRelationObject;
+import com.persagy.proxy.adm.service.IRelationReportService;
+
+/**
+ * 
+ * @version 1.0.0
+ * @company persagy
+ * @author zhangqiankun
+ * @date 202193日 上午9:42:46
+ */
+@Component(value = AdmRelationType.EQ2EQ_EQUIPPOWER_2)
+public class Eq2EqEqBackupRelationObject extends AbstractQueryRelationObject {
+	
+	public Eq2EqEqBackupRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
+	}
+
+	@Override
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode,
+			String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.EQ2EQ_EQUIPPOWER_2, groupCode, projectId, code);
+	}
+
+	@Override
+	protected String checkRelationObject(ObjectNode master, String masterClassCode, ObjectNode slave,
+			String slaveClassCode) {
+		if (!AdmObjectInfoConstant.CHECK_CLASS_CODES.contains(masterClassCode)) {
+			return "主对象不属于低/高压开关柜,请参考规则";
+		}
+		return null;
+	}
+	
+}

+ 54 - 0
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Eq2EqEqNormalRelationObject.java

@@ -0,0 +1,54 @@
+package com.persagy.proxy.adm.strategy.relationdata;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.proxy.adm.constant.AdmObjectInfoConstant;
+import com.persagy.proxy.adm.constant.AdmRelationType;
+import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
+import com.persagy.proxy.adm.model.AdmRelationObject;
+import com.persagy.proxy.adm.service.IRelationReportService;
+
+/**
+ * 
+ * @version 1.0.0
+ * @company persagy
+ * @author zhangqiankun
+ * @date 202193日 上午9:42:46
+ */
+@Component(value = AdmRelationType.EQ2EQ_EQUIPPOWER_1)
+public class Eq2EqEqNormalRelationObject extends AbstractQueryRelationObject {
+	
+	public Eq2EqEqNormalRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
+	}
+
+	@Override
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode,
+			String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.EQ2EQ_EQUIPPOWER_1, groupCode, projectId, code);
+	}
+
+	@Override
+	protected String checkRelationObject(ObjectNode master, String masterClassCode, ObjectNode slave,
+			String slaveClassCode) {
+		if (!AdmObjectInfoConstant.CHECK_CLASS_CODES.contains(masterClassCode)) {
+			return "主对象不属于低/高压开关柜,请参考规则";
+		}
+		return null;
+	}
+	
+}

+ 54 - 0
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Eq2EqSyBackupRelationObject.java

@@ -0,0 +1,54 @@
+package com.persagy.proxy.adm.strategy.relationdata;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.proxy.adm.constant.AdmObjectInfoConstant;
+import com.persagy.proxy.adm.constant.AdmRelationType;
+import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
+import com.persagy.proxy.adm.model.AdmRelationObject;
+import com.persagy.proxy.adm.service.IRelationReportService;
+
+/**
+ * 
+ * @version 1.0.0
+ * @company persagy
+ * @author zhangqiankun
+ * @date 202193日 上午9:42:46
+ */
+@Component(value = AdmRelationType.EQ2EQ_EQUIPPOWER_4)
+public class Eq2EqSyBackupRelationObject extends AbstractQueryRelationObject {
+	
+	public Eq2EqSyBackupRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
+	}
+
+	@Override
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode,
+			String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.EQ2EQ_EQUIPPOWER_4, groupCode, projectId, code);
+	}
+
+	@Override
+	protected String checkRelationObject(ObjectNode master, String masterClassCode, ObjectNode slave,
+			String slaveClassCode) {
+		if (!AdmObjectInfoConstant.CHECK_CLASS_CODES.contains(masterClassCode)) {
+			return "主对象不属于低/高压开关柜,请参考规则";
+		}
+		return null;
+	}
+	
+}

+ 54 - 0
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Eq2EqSyNormalRelationObject.java

@@ -0,0 +1,54 @@
+package com.persagy.proxy.adm.strategy.relationdata;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.proxy.adm.constant.AdmObjectInfoConstant;
+import com.persagy.proxy.adm.constant.AdmRelationType;
+import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
+import com.persagy.proxy.adm.model.AdmRelationObject;
+import com.persagy.proxy.adm.service.IRelationReportService;
+
+/**
+ * 
+ * @version 1.0.0
+ * @company persagy
+ * @author zhangqiankun
+ * @date 202193日 上午9:42:46
+ */
+@Component(value = AdmRelationType.EQ2EQ_EQUIPPOWER_3)
+public class Eq2EqSyNormalRelationObject extends AbstractQueryRelationObject {
+	
+	public Eq2EqSyNormalRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
+	}
+
+	@Override
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode,
+			String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.EQ2EQ_EQUIPPOWER_3, groupCode, projectId, code);
+	}
+
+	@Override
+	protected String checkRelationObject(ObjectNode master, String masterClassCode, ObjectNode slave,
+			String slaveClassCode) {
+		if (!AdmObjectInfoConstant.CHECK_CLASS_CODES.contains(masterClassCode)) {
+			return "主对象不属于低/高压开关柜,请参考规则";
+		}
+		return null;
+	}
+	
+}

+ 13 - 8
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Eq2FlForRelationObject.java

@@ -19,7 +19,7 @@ import com.persagy.proxy.adm.constant.AdmRelationType;
 import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
 import com.persagy.proxy.adm.constant.RelCodeEnum;
 import com.persagy.proxy.adm.model.AdmRelationObject;
-import com.persagy.proxy.adm.service.IReportDownloadService;
+import com.persagy.proxy.adm.service.IRelationReportService;
 
 import cn.hutool.core.util.StrUtil;
 
@@ -33,12 +33,12 @@ import cn.hutool.core.util.StrUtil;
 @Component(value = AdmRelationType.EQ2FL_FOR)
 public class Eq2FlForRelationObject extends AbstractQueryRelationObject {
 
-	public Eq2FlForRelationObject(IReportDownloadService reportDownloadService) {
-		super(reportDownloadService);
+	public Eq2FlForRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
 	}
 
 	@Override
-	protected List<AdmRelationObject> findRelationObject(String relType) {
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
 		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
 		QueryCriteria queryCriteria = new QueryCriteria();
 		ObjectNode criteria = objectMapper.createObjectNode();
@@ -52,15 +52,15 @@ public class Eq2FlForRelationObject extends AbstractQueryRelationObject {
 		queryCriteria.setPage(1L);
 		queryCriteria.setSize(1000L);
 		
-		return this.queryAllObjectInfo(queryCriteria, relType);
+		return this.queryAllObjectInfo(queryCriteria, groupCode, projectId);
 	}
 
 	@Override
-	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String relType) {
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode, String projectId) {
 		Set<String> allKeys = tempAllMap.keySet();
 		List<AdmRelationObject> resultList = new ArrayList<AdmRelationObject>();
 		
-		List<ObjectRelation> relationList = this.reportDownloadService.findObjectRelationList(groupCode, projectId, 
+		List<ObjectRelation> relationList = this.relationReportService.findObjectRelationList(groupCode, projectId, 
 				AdmRelationTypeEnum.EQ2FL_FOR.getGraphCode(), AdmRelationTypeEnum.EQ2FL_FOR.getRelCode());
 		for (ObjectRelation objectRelation : relationList) {
 			String equipId = objectRelation.getObjFrom();
@@ -72,7 +72,7 @@ public class Eq2FlForRelationObject extends AbstractQueryRelationObject {
 			ObjectNode floor = tempAllMap.get(floorId);
 			
 			// 获取建筑信息
-			ObjectNode buildingInfo = this.reportDownloadService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.EQ2FL_FOR.getGraphCode(), 
+			ObjectNode buildingInfo = this.relationReportService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.EQ2FL_FOR.getGraphCode(), 
 					RelCodeEnum.Eq2Bd.name(), equipId, null);
 			
 			AdmRelationObject convertObject = this.convertObject(equipment, "设备", floor, "楼层");
@@ -94,5 +94,10 @@ public class Eq2FlForRelationObject extends AbstractQueryRelationObject {
 		
 		return resultList;
 	}
+	
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.EQ2FL_FOR, groupCode, projectId, code);
+	}
 
 }

+ 12 - 7
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Eq2FlRelationObject.java

@@ -18,7 +18,7 @@ import com.persagy.proxy.adm.constant.AdmObjectType;
 import com.persagy.proxy.adm.constant.AdmRelationType;
 import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
 import com.persagy.proxy.adm.model.AdmRelationObject;
-import com.persagy.proxy.adm.service.IReportDownloadService;
+import com.persagy.proxy.adm.service.IRelationReportService;
 
 /**
  * 
@@ -30,12 +30,12 @@ import com.persagy.proxy.adm.service.IReportDownloadService;
 @Component(value = AdmRelationType.EQ2FL)
 public class Eq2FlRelationObject extends AbstractQueryRelationObject {
 
-	public Eq2FlRelationObject(IReportDownloadService reportDownloadService) {
-		super(reportDownloadService);
+	public Eq2FlRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
 	}
 
 	@Override
-	protected List<AdmRelationObject> findRelationObject(String relType) {
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
 		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
 		QueryCriteria queryCriteria = new QueryCriteria();
 		ObjectNode criteria = objectMapper.createObjectNode();
@@ -49,15 +49,15 @@ public class Eq2FlRelationObject extends AbstractQueryRelationObject {
 		queryCriteria.setPage(1L);
 		queryCriteria.setSize(1000L);
 		
-		return this.queryAllObjectInfo(queryCriteria, relType);
+		return this.queryAllObjectInfo(queryCriteria, groupCode, projectId);
 	}
 
 	@Override
-	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String relType) {
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode, String projectId) {
 		Set<String> allKeys = tempAllMap.keySet();
 		List<AdmRelationObject> resultList = new ArrayList<AdmRelationObject>();
 		
-		List<ObjectRelation> relationList = this.reportDownloadService.findObjectRelationList(groupCode, projectId, 
+		List<ObjectRelation> relationList = this.relationReportService.findObjectRelationList(groupCode, projectId, 
 				AdmRelationTypeEnum.EQ2FL.getGraphCode(), AdmRelationTypeEnum.EQ2FL.getRelCode());
 		for (ObjectRelation objectRelation : relationList) {
 			String equipId = objectRelation.getObjFrom();
@@ -79,4 +79,9 @@ public class Eq2FlRelationObject extends AbstractQueryRelationObject {
 		return resultList;
 	}
 
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.EQ2FL, groupCode, projectId, code);
+	}
+	
 }

+ 14 - 9
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Eq2ShForRelationObject.java

@@ -19,7 +19,7 @@ import com.persagy.proxy.adm.constant.AdmRelationType;
 import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
 import com.persagy.proxy.adm.constant.RelCodeEnum;
 import com.persagy.proxy.adm.model.AdmRelationObject;
-import com.persagy.proxy.adm.service.IReportDownloadService;
+import com.persagy.proxy.adm.service.IRelationReportService;
 
 import cn.hutool.core.util.StrUtil;
 
@@ -33,12 +33,12 @@ import cn.hutool.core.util.StrUtil;
 @Component(value = AdmRelationType.EQ2SH_FOR)
 public class Eq2ShForRelationObject extends AbstractQueryRelationObject {
 
-	public Eq2ShForRelationObject(IReportDownloadService reportDownloadService) {
-		super(reportDownloadService);
+	public Eq2ShForRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
 	}
 
 	@Override
-	protected List<AdmRelationObject> findRelationObject(String relType) {
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
 		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
 		QueryCriteria queryCriteria = new QueryCriteria();
 		ObjectNode criteria = objectMapper.createObjectNode();
@@ -52,15 +52,15 @@ public class Eq2ShForRelationObject extends AbstractQueryRelationObject {
 		queryCriteria.setPage(1L);
 		queryCriteria.setSize(1000L);
 		
-		return this.queryAllObjectInfo(queryCriteria, relType);
+		return this.queryAllObjectInfo(queryCriteria, groupCode, projectId);
 	}
 
 	@Override
-	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String relType) {
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode, String projectId) {
 		Set<String> allKeys = tempAllMap.keySet();
 		List<AdmRelationObject> resultList = new ArrayList<AdmRelationObject>();
 		
-		List<ObjectRelation> relationList = this.reportDownloadService.findObjectRelationList(groupCode, projectId, 
+		List<ObjectRelation> relationList = this.relationReportService.findObjectRelationList(groupCode, projectId, 
 				AdmRelationTypeEnum.EQ2SH_FOR.getGraphCode(), AdmRelationTypeEnum.EQ2SH_FOR.getRelCode());
 		for (ObjectRelation objectRelation : relationList) {
 			String equipId = objectRelation.getObjFrom();
@@ -72,9 +72,9 @@ public class Eq2ShForRelationObject extends AbstractQueryRelationObject {
 			ObjectNode shaft = tempAllMap.get(shaftId);
 			
 			// 获取楼层信息
-			ObjectNode floorInfo = this.reportDownloadService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.EQ2SH_FOR.getGraphCode(), 
+			ObjectNode floorInfo = this.relationReportService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.EQ2SH_FOR.getGraphCode(), 
 					RelCodeEnum.Eq2Fl.name(), equipId, null);
-			ObjectNode buildingInfo = this.reportDownloadService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.EQ2SH_FOR.getGraphCode(), 
+			ObjectNode buildingInfo = this.relationReportService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.EQ2SH_FOR.getGraphCode(), 
 					RelCodeEnum.Eq2Bd.name(), equipId, null);
 			
 			AdmRelationObject convertObject = this.convertObject(equipment, "设备", shaft, "竖井");
@@ -94,4 +94,9 @@ public class Eq2ShForRelationObject extends AbstractQueryRelationObject {
 		return resultList;
 	}
 
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.EQ2SH_FOR, groupCode, projectId, code);
+	}
+	
 }

+ 13 - 8
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Eq2SpRelationObject.java

@@ -17,7 +17,7 @@ import com.persagy.proxy.adm.constant.AdmObjectType;
 import com.persagy.proxy.adm.constant.AdmRelationType;
 import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
 import com.persagy.proxy.adm.model.AdmRelationObject;
-import com.persagy.proxy.adm.service.IReportDownloadService;
+import com.persagy.proxy.adm.service.IRelationReportService;
 
 /**
  * 此类型需转为 AdmRelationTypeEnum.EQ2SP_IN 进行数据查询
@@ -27,15 +27,15 @@ import com.persagy.proxy.adm.service.IReportDownloadService;
  * @author zhangqiankun
  * @date 202193日 上午9:42:46
  */
-@Component(value = AdmRelationType.EQ2SP_SENSORRELATIONSHIP_SS2SP)
+@Component(value = AdmRelationType.EQ2SP)
 public class Eq2SpRelationObject extends AbstractQueryRelationObject {
 
-	public Eq2SpRelationObject(IReportDownloadService reportDownloadService) {
-		super(reportDownloadService);
+	public Eq2SpRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
 	}
 
 	@Override
-	protected List<AdmRelationObject> findRelationObject(String relType) {
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
 		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
 		QueryCriteria queryCriteria = new QueryCriteria();
 		ObjectNode criteria = objectMapper.createObjectNode();
@@ -49,15 +49,15 @@ public class Eq2SpRelationObject extends AbstractQueryRelationObject {
 		queryCriteria.setPage(1L);
 		queryCriteria.setSize(1000L);
 		
-		return this.queryAllObjectInfo(queryCriteria, relType);
+		return this.queryAllObjectInfo(queryCriteria, groupCode, projectId);
 	}
 
 	@Override
-	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String relType) {
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode, String projectId) {
 		Set<String> allKeys = tempAllMap.keySet();
 		List<AdmRelationObject> resultList = new ArrayList<AdmRelationObject>();
 		
-		List<ObjectRelation> relationList = this.reportDownloadService.findObjectRelationList(groupCode, projectId, AdmRelationTypeEnum.EQ2SP_IN.getGraphCode(), AdmRelationTypeEnum.EQ2SP_IN.getRelCode());
+		List<ObjectRelation> relationList = this.relationReportService.findObjectRelationList(groupCode, projectId, AdmRelationTypeEnum.EQ2SP_IN.getGraphCode(), AdmRelationTypeEnum.EQ2SP_IN.getRelCode());
 		for (ObjectRelation objectRelation : relationList) {
 			String equipId = objectRelation.getObjFrom();
 			String spaceId = objectRelation.getObjTo();
@@ -74,4 +74,9 @@ public class Eq2SpRelationObject extends AbstractQueryRelationObject {
 		return resultList;
 	}
 
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.EQ2SP_IN, groupCode, projectId, code);
+	}
+	
 }

+ 40 - 3
src/main/java/com/persagy/proxy/adm/strategy/relationdata/QueryRelationObjectStrategy.java

@@ -1,7 +1,12 @@
 package com.persagy.proxy.adm.strategy.relationdata;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.common.helper.SpringHelper;
 import com.persagy.proxy.adm.model.AdmRelationObject;
 
 /**
@@ -17,15 +22,47 @@ public interface QueryRelationObjectStrategy {
 	
 	String OBJ_TYPE = "objType";
 	
+	ObjectMapper OBJECT_MAPPER = SpringHelper.getBean(ObjectMapper.class);
+	
+	Map<String, String> OBJNAME_2_TYPE = new HashMap<String,String>(){
+		private static final long serialVersionUID = 1L;
+		{
+            put("对象ID", "id");
+            put("对象名称", "name");
+            put("对象本地编码", "local_id");
+            put("对象本地名称", "local_name");
+            put("设计图纸中编码", "cad_id");
+        }
+    };
+    
 	/**
 	 * 查询出所有的关系信息
-	 * <p>因原代码中,不存在zoneType类型不为空时对应的方法,所以此处不再进行此数据的判断</p>
 	 * 
 	 * @param groupCode 集团编码
 	 * @param projectId 项目ID
-	 * @param relType   边类型--ADM的
 	 * @return 不会返回null
 	 */
-	List<AdmRelationObject> findRelationObject(String groupCode, String projectId, String relType);
+	List<AdmRelationObject> findRelationObject(String groupCode, String projectId);
 	
+	/**
+	 * 保存之前校验数据的合法性
+	 * 
+	 * @param relationObject 需要校验的对象
+	 * @param groupCode
+	 * @param projectId
+	 * @param code 参考 OBJNAME_2_TYPE
+	 * @return String - 校验失败的原因, ObjectNode -- BDTP接口的参数,不会返回null,请用instanceOf 判断返回值
+	 */
+	Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code);
+
+	/**
+	 * 批量保存对象之间的关系
+	 * 
+	 * @param admRelationObject
+	 * @param groupCode
+	 * @param projectId
+	 * @return 
+	 */
+	boolean saveRelationObjects(List<ObjectNode> relationObjects, String groupCode, String projectId);
+
 }

+ 12 - 7
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sh2BdForRelationObject.java

@@ -17,7 +17,7 @@ import com.persagy.proxy.adm.constant.AdmObjectType;
 import com.persagy.proxy.adm.constant.AdmRelationType;
 import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
 import com.persagy.proxy.adm.model.AdmRelationObject;
-import com.persagy.proxy.adm.service.IReportDownloadService;
+import com.persagy.proxy.adm.service.IRelationReportService;
 
 /**
  * 
@@ -29,12 +29,12 @@ import com.persagy.proxy.adm.service.IReportDownloadService;
 @Component(value = AdmRelationType.SH2BD_ARCHFORARCH)
 public class Sh2BdForRelationObject extends AbstractQueryRelationObject {
 
-	public Sh2BdForRelationObject(IReportDownloadService reportDownloadService) {
-		super(reportDownloadService);
+	public Sh2BdForRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
 	}
 
 	@Override
-	protected List<AdmRelationObject> findRelationObject(String relType) {
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
 		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
 		QueryCriteria queryCriteria = new QueryCriteria();
 		ObjectNode criteria = objectMapper.createObjectNode();
@@ -48,15 +48,15 @@ public class Sh2BdForRelationObject extends AbstractQueryRelationObject {
 		queryCriteria.setPage(1L);
 		queryCriteria.setSize(1000L);
 		
-		return this.queryAllObjectInfo(queryCriteria, relType);
+		return this.queryAllObjectInfo(queryCriteria, groupCode, projectId);
 	}
 
 	@Override
-	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String relType) {
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode, String projectId) {
 		Set<String> allKeys = tempAllMap.keySet();
 		List<AdmRelationObject> resultList = new ArrayList<AdmRelationObject>();
 		
-		List<ObjectRelation> relationList = this.reportDownloadService.findObjectRelationList(groupCode, projectId, 
+		List<ObjectRelation> relationList = this.relationReportService.findObjectRelationList(groupCode, projectId, 
 				AdmRelationTypeEnum.SH2BD_ARCHFORARCH.getGraphCode(), AdmRelationTypeEnum.SH2BD_ARCHFORARCH.getRelCode());
 		for (ObjectRelation objectRelation : relationList) {
 			String equipId = objectRelation.getObjFrom();
@@ -74,4 +74,9 @@ public class Sh2BdForRelationObject extends AbstractQueryRelationObject {
 		return resultList;
 	}
 
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.SH2BD_ARCHFORARCH, groupCode, projectId, code);
+	}
+	
 }

+ 13 - 8
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sh2FlForRelationObject.java

@@ -19,7 +19,7 @@ import com.persagy.proxy.adm.constant.AdmRelationType;
 import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
 import com.persagy.proxy.adm.constant.RelCodeEnum;
 import com.persagy.proxy.adm.model.AdmRelationObject;
-import com.persagy.proxy.adm.service.IReportDownloadService;
+import com.persagy.proxy.adm.service.IRelationReportService;
 
 /**
  * 
@@ -31,12 +31,12 @@ import com.persagy.proxy.adm.service.IReportDownloadService;
 @Component(value = AdmRelationType.SH2FL_ARCHFORARCH)
 public class Sh2FlForRelationObject extends AbstractQueryRelationObject {
 
-	public Sh2FlForRelationObject(IReportDownloadService reportDownloadService) {
-		super(reportDownloadService);
+	public Sh2FlForRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
 	}
 
 	@Override
-	protected List<AdmRelationObject> findRelationObject(String relType) {
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
 		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
 		QueryCriteria queryCriteria = new QueryCriteria();
 		ObjectNode criteria = objectMapper.createObjectNode();
@@ -50,15 +50,15 @@ public class Sh2FlForRelationObject extends AbstractQueryRelationObject {
 		queryCriteria.setPage(1L);
 		queryCriteria.setSize(1000L);
 		
-		return this.queryAllObjectInfo(queryCriteria, relType);
+		return this.queryAllObjectInfo(queryCriteria, groupCode, projectId);
 	}
 
 	@Override
-	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String relType) {
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode, String projectId) {
 		Set<String> allKeys = tempAllMap.keySet();
 		List<AdmRelationObject> resultList = new ArrayList<AdmRelationObject>();
 		
-		List<ObjectRelation> relationList = this.reportDownloadService.findObjectRelationList(groupCode, projectId, 
+		List<ObjectRelation> relationList = this.relationReportService.findObjectRelationList(groupCode, projectId, 
 				AdmRelationTypeEnum.SH2FL_ARCHFORARCH.getGraphCode(), AdmRelationTypeEnum.SH2FL_ARCHFORARCH.getRelCode());
 		for (ObjectRelation objectRelation : relationList) {
 			String shaftId = objectRelation.getObjFrom();
@@ -69,7 +69,7 @@ public class Sh2FlForRelationObject extends AbstractQueryRelationObject {
 			ObjectNode shaft = tempAllMap.get(shaftId);
 			ObjectNode floor = tempAllMap.get(floorId);
 			// 获取建筑的信息
-			ObjectNode buildingInfo = this.reportDownloadService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.SH2FL_ARCHFORARCH.getGraphCode(), 
+			ObjectNode buildingInfo = this.relationReportService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.SH2FL_ARCHFORARCH.getGraphCode(), 
 					RelCodeEnum.Sh2Bd.name(), shaftId, null);
 
 			AdmRelationObject convertObject = this.convertObject(shaft, "竖井", floor, "楼层");
@@ -82,4 +82,9 @@ public class Sh2FlForRelationObject extends AbstractQueryRelationObject {
 		return resultList;
 	}
 
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.SH2FL_ARCHFORARCH, groupCode, projectId, code);
+	}
+	
 }

+ 11 - 7
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sh2ShForRelationObject.java

@@ -17,7 +17,7 @@ import com.persagy.proxy.adm.constant.AdmObjectType;
 import com.persagy.proxy.adm.constant.AdmRelationType;
 import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
 import com.persagy.proxy.adm.model.AdmRelationObject;
-import com.persagy.proxy.adm.service.IReportDownloadService;
+import com.persagy.proxy.adm.service.IRelationReportService;
 
 /**
  * 
@@ -29,12 +29,12 @@ import com.persagy.proxy.adm.service.IReportDownloadService;
 @Component(value = AdmRelationType.SH2SH_ARCHFORARCH)
 public class Sh2ShForRelationObject extends AbstractQueryRelationObject {
 
-	public Sh2ShForRelationObject(IReportDownloadService reportDownloadService) {
-		super(reportDownloadService);
+	public Sh2ShForRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
 	}
 
 	@Override
-	protected List<AdmRelationObject> findRelationObject(String relType) {
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
 		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
 		QueryCriteria queryCriteria = new QueryCriteria();
 		ObjectNode criteria = objectMapper.createObjectNode();
@@ -48,15 +48,15 @@ public class Sh2ShForRelationObject extends AbstractQueryRelationObject {
 		queryCriteria.setPage(1L);
 		queryCriteria.setSize(1000L);
 		
-		return this.queryAllObjectInfo(queryCriteria, relType);
+		return this.queryAllObjectInfo(queryCriteria, groupCode, projectId);
 	}
 
 	@Override
-	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String relType) {
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode, String projectId) {
 		Set<String> allKeys = tempAllMap.keySet();
 		List<AdmRelationObject> resultList = new ArrayList<AdmRelationObject>();
 		
-		List<ObjectRelation> relationList = this.reportDownloadService.findObjectRelationList(groupCode, projectId, 
+		List<ObjectRelation> relationList = this.relationReportService.findObjectRelationList(groupCode, projectId, 
 				AdmRelationTypeEnum.SH2SH_ARCHFORARCH.getGraphCode(), AdmRelationTypeEnum.SH2SH_ARCHFORARCH.getRelCode());
 		for (ObjectRelation objectRelation : relationList) {
 			String shaftIdF = objectRelation.getObjFrom();
@@ -74,4 +74,8 @@ public class Sh2ShForRelationObject extends AbstractQueryRelationObject {
 		return resultList;
 	}
 
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.SH2SH_ARCHFORARCH, groupCode, projectId, code);
+	}
 }

+ 14 - 9
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sh2SpForRelationObject.java

@@ -19,7 +19,7 @@ import com.persagy.proxy.adm.constant.AdmRelationType;
 import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
 import com.persagy.proxy.adm.constant.RelCodeEnum;
 import com.persagy.proxy.adm.model.AdmRelationObject;
-import com.persagy.proxy.adm.service.IReportDownloadService;
+import com.persagy.proxy.adm.service.IRelationReportService;
 
 import cn.hutool.core.util.StrUtil;
 
@@ -33,12 +33,12 @@ import cn.hutool.core.util.StrUtil;
 @Component(value = AdmRelationType.SH2SP_ARCHFORARCH)
 public class Sh2SpForRelationObject extends AbstractQueryRelationObject {
 
-	public Sh2SpForRelationObject(IReportDownloadService reportDownloadService) {
-		super(reportDownloadService);
+	public Sh2SpForRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
 	}
 
 	@Override
-	protected List<AdmRelationObject> findRelationObject(String relType) {
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
 		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
 		QueryCriteria queryCriteria = new QueryCriteria();
 		ObjectNode criteria = objectMapper.createObjectNode();
@@ -52,15 +52,15 @@ public class Sh2SpForRelationObject extends AbstractQueryRelationObject {
 		queryCriteria.setPage(1L);
 		queryCriteria.setSize(1000L);
 		
-		return this.queryAllObjectInfo(queryCriteria, relType);
+		return this.queryAllObjectInfo(queryCriteria, groupCode, projectId);
 	}
 
 	@Override
-	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String relType) {
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode, String projectId) {
 		Set<String> allKeys = tempAllMap.keySet();
 		List<AdmRelationObject> resultList = new ArrayList<AdmRelationObject>();
 		
-		List<ObjectRelation> relationList = this.reportDownloadService.findObjectRelationList(groupCode, projectId, 
+		List<ObjectRelation> relationList = this.relationReportService.findObjectRelationList(groupCode, projectId, 
 				AdmRelationTypeEnum.SH2SP_ARCHFORARCH.getGraphCode(), AdmRelationTypeEnum.SH2SP_ARCHFORARCH.getRelCode());
 		for (ObjectRelation objectRelation : relationList) {
 			String shaftId = objectRelation.getObjFrom();
@@ -71,9 +71,9 @@ public class Sh2SpForRelationObject extends AbstractQueryRelationObject {
 			ObjectNode shaft = tempAllMap.get(shaftId);
 			ObjectNode space = tempAllMap.get(spaceId);
 			// 获取建筑的信息
-			ObjectNode floorInfo = this.reportDownloadService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.SH2SP_ARCHFORARCH.getGraphCode(), 
+			ObjectNode floorInfo = this.relationReportService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.SH2SP_ARCHFORARCH.getGraphCode(), 
 					RelCodeEnum.Sh2Fl.name(), shaftId, null);
-			ObjectNode buildingInfo = this.reportDownloadService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.SH2SP_ARCHFORARCH.getGraphCode(), 
+			ObjectNode buildingInfo = this.relationReportService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.SH2SP_ARCHFORARCH.getGraphCode(), 
 					RelCodeEnum.Sh2Bd.name(), shaftId, null);
 			
 			AdmRelationObject convertObject = this.convertObject(shaft, "竖井", space, "空间");
@@ -93,5 +93,10 @@ public class Sh2SpForRelationObject extends AbstractQueryRelationObject {
 		
 		return resultList;
 	}
+	
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.SH2SP_ARCHFORARCH, groupCode, projectId, code);
+	}
 
 }

+ 13 - 8
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sp2BdForRelationObject.java

@@ -19,7 +19,7 @@ import com.persagy.proxy.adm.constant.AdmRelationType;
 import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
 import com.persagy.proxy.adm.constant.RelCodeEnum;
 import com.persagy.proxy.adm.model.AdmRelationObject;
-import com.persagy.proxy.adm.service.IReportDownloadService;
+import com.persagy.proxy.adm.service.IRelationReportService;
 
 import cn.hutool.core.util.StrUtil;
 
@@ -33,12 +33,12 @@ import cn.hutool.core.util.StrUtil;
 @Component(value = AdmRelationType.SP2BD_ARCHFORARCH)
 public class Sp2BdForRelationObject extends AbstractQueryRelationObject {
 
-	public Sp2BdForRelationObject(IReportDownloadService reportDownloadService) {
-		super(reportDownloadService);
+	public Sp2BdForRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
 	}
 
 	@Override
-	protected List<AdmRelationObject> findRelationObject(String relType) {
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
 		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
 		QueryCriteria queryCriteria = new QueryCriteria();
 		ObjectNode criteria = objectMapper.createObjectNode();
@@ -52,15 +52,15 @@ public class Sp2BdForRelationObject extends AbstractQueryRelationObject {
 		queryCriteria.setPage(1L);
 		queryCriteria.setSize(1000L);
 		
-		return this.queryAllObjectInfo(queryCriteria, relType);
+		return this.queryAllObjectInfo(queryCriteria, groupCode, projectId);
 	}
 
 	@Override
-	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String relType) {
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode, String projectId) {
 		Set<String> allKeys = tempAllMap.keySet();
 		List<AdmRelationObject> resultList = new ArrayList<AdmRelationObject>();
 		
-		List<ObjectRelation> relationList = this.reportDownloadService.findObjectRelationList(groupCode, projectId, 
+		List<ObjectRelation> relationList = this.relationReportService.findObjectRelationList(groupCode, projectId, 
 				AdmRelationTypeEnum.SP2BD_ARCHFORARCH.getGraphCode(), AdmRelationTypeEnum.SP2BD_ARCHFORARCH.getRelCode());
 		for (ObjectRelation objectRelation : relationList) {
 			String spaceId = objectRelation.getObjFrom();
@@ -71,7 +71,7 @@ public class Sp2BdForRelationObject extends AbstractQueryRelationObject {
 			ObjectNode space = tempAllMap.get(spaceId);
 			ObjectNode building = tempAllMap.get(buildingId);
 			// 获取楼层的信息
-			ObjectNode floorInfo = this.reportDownloadService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.SP2BD_ARCHFORARCH.getGraphCode(), 
+			ObjectNode floorInfo = this.relationReportService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.SP2BD_ARCHFORARCH.getGraphCode(), 
 					RelCodeEnum.Sp2Fl.name(), spaceId, null);
 			
 			// 这里最后一个参数,写为空间,和ADM保持一致
@@ -92,4 +92,9 @@ public class Sp2BdForRelationObject extends AbstractQueryRelationObject {
 		return resultList;
 	}
 
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.SP2BD_ARCHFORARCH, groupCode, projectId, code);
+	}
+	
 }

+ 13 - 8
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sp2FlForRelationObject.java

@@ -19,7 +19,7 @@ import com.persagy.proxy.adm.constant.AdmRelationType;
 import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
 import com.persagy.proxy.adm.constant.RelCodeEnum;
 import com.persagy.proxy.adm.model.AdmRelationObject;
-import com.persagy.proxy.adm.service.IReportDownloadService;
+import com.persagy.proxy.adm.service.IRelationReportService;
 
 import cn.hutool.core.util.StrUtil;
 
@@ -33,12 +33,12 @@ import cn.hutool.core.util.StrUtil;
 @Component(value = AdmRelationType.SP2FL_ARCHFORARCH)
 public class Sp2FlForRelationObject extends AbstractQueryRelationObject {
 
-	public Sp2FlForRelationObject(IReportDownloadService reportDownloadService) {
-		super(reportDownloadService);
+	public Sp2FlForRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
 	}
 
 	@Override
-	protected List<AdmRelationObject> findRelationObject(String relType) {
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
 		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
 		QueryCriteria queryCriteria = new QueryCriteria();
 		ObjectNode criteria = objectMapper.createObjectNode();
@@ -52,15 +52,15 @@ public class Sp2FlForRelationObject extends AbstractQueryRelationObject {
 		queryCriteria.setPage(1L);
 		queryCriteria.setSize(1000L);
 		
-		return this.queryAllObjectInfo(queryCriteria, relType);
+		return this.queryAllObjectInfo(queryCriteria, groupCode, projectId);
 	}
 
 	@Override
-	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String relType) {
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode, String projectId) {
 		Set<String> allKeys = tempAllMap.keySet();
 		List<AdmRelationObject> resultList = new ArrayList<AdmRelationObject>();
 		
-		List<ObjectRelation> relationList = this.reportDownloadService.findObjectRelationList(groupCode, projectId, 
+		List<ObjectRelation> relationList = this.relationReportService.findObjectRelationList(groupCode, projectId, 
 				AdmRelationTypeEnum.SP2FL_ARCHFORARCH.getGraphCode(), AdmRelationTypeEnum.SP2FL_ARCHFORARCH.getRelCode());
 		for (ObjectRelation objectRelation : relationList) {
 			String spaceId = objectRelation.getObjFrom();
@@ -71,7 +71,7 @@ public class Sp2FlForRelationObject extends AbstractQueryRelationObject {
 			ObjectNode space = tempAllMap.get(spaceId);
 			ObjectNode floor = tempAllMap.get(floorId);
 			// 获取建筑的信息
-			ObjectNode buildingInfo = this.reportDownloadService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.SP2FL_ARCHFORARCH.getGraphCode(), 
+			ObjectNode buildingInfo = this.relationReportService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.SP2FL_ARCHFORARCH.getGraphCode(), 
 					RelCodeEnum.Sp2Bd.name(), spaceId, null);
 			
 			AdmRelationObject convertObject = this.convertObject(space, "空间", floor, "楼层");
@@ -94,4 +94,9 @@ public class Sp2FlForRelationObject extends AbstractQueryRelationObject {
 		return resultList;
 	}
 
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.SP2FL_ARCHFORARCH, groupCode, projectId, code);
+	}
+	
 }

+ 57 - 0
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sp2SpConnectRelationObject.java

@@ -0,0 +1,57 @@
+package com.persagy.proxy.adm.strategy.relationdata;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.proxy.adm.constant.AdmRelationType;
+import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
+import com.persagy.proxy.adm.constant.SpaceTypeEnum;
+import com.persagy.proxy.adm.model.AdmRelationObject;
+import com.persagy.proxy.adm.service.IRelationReportService;
+
+/**
+ * 
+ * @version 1.0.0
+ * @company persagy
+ * @author zhangqiankun
+ * @date 202193日 上午9:42:46
+ */
+@Component(value = AdmRelationType.SP2SP_RADIATIONNETWORK_2)
+public class Sp2SpConnectRelationObject extends AbstractQueryRelationObject {
+	
+	public Sp2SpConnectRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
+	}
+
+	@Override
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode,
+			String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.SP2SP_RADIATIONNETWORK_2, groupCode, projectId, code);
+	}
+
+	@Override
+	protected String checkRelationObject(ObjectNode master, String masterClassCode, ObjectNode slave,
+			String slaveClassCode) {
+		if (!SpaceTypeEnum.LightingZone.getCode().equals(masterClassCode)) {
+			return "主对象不属于照明分区类型,请参考规则";
+		}
+		if (!SpaceTypeEnum.LightingZone.getCode().equals(slaveClassCode)) {
+			return "从对象不属于照明分区类型,请参考规则";
+		}
+		return null;
+	}
+	
+}

+ 57 - 0
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sp2SpFFCloseRelationObject.java

@@ -0,0 +1,57 @@
+package com.persagy.proxy.adm.strategy.relationdata;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.proxy.adm.constant.AdmRelationType;
+import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
+import com.persagy.proxy.adm.constant.SpaceTypeEnum;
+import com.persagy.proxy.adm.model.AdmRelationObject;
+import com.persagy.proxy.adm.service.IRelationReportService;
+
+/**
+ * 
+ * @version 1.0.0
+ * @company persagy
+ * @author zhangqiankun
+ * @date 202193日 上午9:42:46
+ */
+@Component(value = AdmRelationType.SP2SP_TRAFFICNETWORK_3)
+public class Sp2SpFFCloseRelationObject extends AbstractQueryRelationObject {
+	
+	public Sp2SpFFCloseRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
+	}
+
+	@Override
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode,
+			String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.SP2SP_TRAFFICNETWORK_3, groupCode, projectId, code);
+	}
+
+	@Override
+	protected String checkRelationObject(ObjectNode master, String masterClassCode, ObjectNode slave,
+			String slaveClassCode) {
+		if (!SpaceTypeEnum.GeneralZone.getCode().equals(masterClassCode)) {
+			return "主对象不属于物业分区类型,请参考规则";
+		}
+		if (!SpaceTypeEnum.GeneralZone.getCode().equals(slaveClassCode)) {
+			return "从对象不属于物业分区类型,请参考规则";
+		}
+		return null;
+	}
+	
+}

+ 57 - 0
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sp2SpFFOpenRelationObject.java

@@ -0,0 +1,57 @@
+package com.persagy.proxy.adm.strategy.relationdata;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.proxy.adm.constant.AdmRelationType;
+import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
+import com.persagy.proxy.adm.constant.SpaceTypeEnum;
+import com.persagy.proxy.adm.model.AdmRelationObject;
+import com.persagy.proxy.adm.service.IRelationReportService;
+
+/**
+ * 
+ * @version 1.0.0
+ * @company persagy
+ * @author zhangqiankun
+ * @date 202193日 上午9:42:46
+ */
+@Component(value = AdmRelationType.SP2SP_TRAFFICNETWORK_2)
+public class Sp2SpFFOpenRelationObject extends AbstractQueryRelationObject {
+	
+	public Sp2SpFFOpenRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
+	}
+
+	@Override
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode,
+			String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.SP2SP_TRAFFICNETWORK_2, groupCode, projectId, code);
+	}
+
+	@Override
+	protected String checkRelationObject(ObjectNode master, String masterClassCode, ObjectNode slave,
+			String slaveClassCode) {
+		if (!SpaceTypeEnum.GeneralZone.getCode().equals(masterClassCode)) {
+			return "主对象不属于物业分区类型,请参考规则";
+		}
+		if (!SpaceTypeEnum.GeneralZone.getCode().equals(slaveClassCode)) {
+			return "从对象不属于物业分区类型,请参考规则";
+		}
+		return null;
+	}
+	
+}

+ 57 - 0
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sp2SpMixMechRelationObject.java

@@ -0,0 +1,57 @@
+package com.persagy.proxy.adm.strategy.relationdata;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.proxy.adm.constant.AdmRelationType;
+import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
+import com.persagy.proxy.adm.constant.SpaceTypeEnum;
+import com.persagy.proxy.adm.model.AdmRelationObject;
+import com.persagy.proxy.adm.service.IRelationReportService;
+
+/**
+ * 
+ * @version 1.0.0
+ * @company persagy
+ * @author zhangqiankun
+ * @date 202193日 上午9:42:46
+ */
+@Component(value = AdmRelationType.SP2SP_CONVECTIONNETWORK_2)
+public class Sp2SpMixMechRelationObject extends AbstractQueryRelationObject {
+	
+	public Sp2SpMixMechRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
+	}
+
+	@Override
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode,
+			String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.SP2SP_CONVECTIONNETWORK_2, groupCode, projectId, code);
+	}
+
+	@Override
+	protected String checkRelationObject(ObjectNode master, String masterClassCode, ObjectNode slave,
+			String slaveClassCode) {
+		if (!SpaceTypeEnum.AirConditioningZone.getCode().equals(masterClassCode)) {
+			return "主对象不属于空调分区类型,请参考规则";
+		}
+		if (!SpaceTypeEnum.AirConditioningZone.getCode().equals(slaveClassCode)) {
+			return "从对象不属于空调分区类型,请参考规则";
+		}
+		return null;
+	}
+	
+}

+ 57 - 0
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sp2SpNaturalRelationObject.java

@@ -0,0 +1,57 @@
+package com.persagy.proxy.adm.strategy.relationdata;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.proxy.adm.constant.AdmRelationType;
+import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
+import com.persagy.proxy.adm.constant.SpaceTypeEnum;
+import com.persagy.proxy.adm.model.AdmRelationObject;
+import com.persagy.proxy.adm.service.IRelationReportService;
+
+/**
+ * 
+ * @version 1.0.0
+ * @company persagy
+ * @author zhangqiankun
+ * @date 202193日 上午9:42:46
+ */
+@Component(value = AdmRelationType.SP2SP_CONVECTIONNETWORK_1)
+public class Sp2SpNaturalRelationObject extends AbstractQueryRelationObject {
+	
+	public Sp2SpNaturalRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
+	}
+
+	@Override
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode,
+			String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.SP2SP_CONVECTIONNETWORK_1, groupCode, projectId, code);
+	}
+
+	@Override
+	protected String checkRelationObject(ObjectNode master, String masterClassCode, ObjectNode slave,
+			String slaveClassCode) {
+		if (!SpaceTypeEnum.AirConditioningZone.getCode().equals(masterClassCode)) {
+			return "主对象不属于空调分区类型,请参考规则";
+		}
+		if (!SpaceTypeEnum.AirConditioningZone.getCode().equals(slaveClassCode)) {
+			return "从对象不属于空调分区类型,请参考规则";
+		}
+		return null;
+	}
+	
+}

+ 57 - 0
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sp2SpNormalRelationObject.java

@@ -0,0 +1,57 @@
+package com.persagy.proxy.adm.strategy.relationdata;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.proxy.adm.constant.AdmRelationType;
+import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
+import com.persagy.proxy.adm.constant.SpaceTypeEnum;
+import com.persagy.proxy.adm.model.AdmRelationObject;
+import com.persagy.proxy.adm.service.IRelationReportService;
+
+/**
+ * 
+ * @version 1.0.0
+ * @company persagy
+ * @author zhangqiankun
+ * @date 202193日 上午9:42:46
+ */
+@Component(value = AdmRelationType.SP2SP_TRAFFICNETWORK_1)
+public class Sp2SpNormalRelationObject extends AbstractQueryRelationObject {
+	
+	public Sp2SpNormalRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
+	}
+
+	@Override
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode,
+			String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.SP2SP_TRAFFICNETWORK_1, groupCode, projectId, code);
+	}
+
+	@Override
+	protected String checkRelationObject(ObjectNode master, String masterClassCode, ObjectNode slave,
+			String slaveClassCode) {
+		if (!SpaceTypeEnum.GeneralZone.getCode().equals(masterClassCode)) {
+			return "主对象不属于物业分区类型,请参考规则";
+		}
+		if (!SpaceTypeEnum.GeneralZone.getCode().equals(slaveClassCode)) {
+			return "从对象不属于物业分区类型,请参考规则";
+		}
+		return null;
+	}
+	
+}

+ 57 - 0
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sp2SpOnewayMechRelationObject.java

@@ -0,0 +1,57 @@
+package com.persagy.proxy.adm.strategy.relationdata;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.proxy.adm.constant.AdmRelationType;
+import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
+import com.persagy.proxy.adm.constant.SpaceTypeEnum;
+import com.persagy.proxy.adm.model.AdmRelationObject;
+import com.persagy.proxy.adm.service.IRelationReportService;
+
+/**
+ * 
+ * @version 1.0.0
+ * @company persagy
+ * @author zhangqiankun
+ * @date 202193日 上午9:42:46
+ */
+@Component(value = AdmRelationType.SP2SP_CONVECTIONNETWORK_3)
+public class Sp2SpOnewayMechRelationObject extends AbstractQueryRelationObject {
+	
+	public Sp2SpOnewayMechRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
+	}
+
+	@Override
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode,
+			String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.SP2SP_CONVECTIONNETWORK_3, groupCode, projectId, code);
+	}
+
+	@Override
+	protected String checkRelationObject(ObjectNode master, String masterClassCode, ObjectNode slave,
+			String slaveClassCode) {
+		if (!SpaceTypeEnum.AirConditioningZone.getCode().equals(masterClassCode)) {
+			return "主对象不属于空调分区类型,请参考规则";
+		}
+		if (!SpaceTypeEnum.AirConditioningZone.getCode().equals(slaveClassCode)) {
+			return "从对象不属于空调分区类型,请参考规则";
+		}
+		return null;
+	}
+	
+}

+ 57 - 0
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sp2SpTransparentRelationObject.java

@@ -0,0 +1,57 @@
+package com.persagy.proxy.adm.strategy.relationdata;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.proxy.adm.constant.AdmRelationType;
+import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
+import com.persagy.proxy.adm.constant.SpaceTypeEnum;
+import com.persagy.proxy.adm.model.AdmRelationObject;
+import com.persagy.proxy.adm.service.IRelationReportService;
+
+/**
+ * 
+ * @version 1.0.0
+ * @company persagy
+ * @author zhangqiankun
+ * @date 202193日 上午9:42:46
+ */
+@Component(value = AdmRelationType.SP2SP_RADIATIONNETWORK_1)
+public class Sp2SpTransparentRelationObject extends AbstractQueryRelationObject {
+	
+	public Sp2SpTransparentRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
+	}
+
+	@Override
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode,
+			String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.SP2SP_RADIATIONNETWORK_1, groupCode, projectId, code);
+	}
+
+	@Override
+	protected String checkRelationObject(ObjectNode master, String masterClassCode, ObjectNode slave,
+			String slaveClassCode) {
+		if (!SpaceTypeEnum.LightingZone.getCode().equals(masterClassCode)) {
+			return "主对象不属于照明分区类型,请参考规则";
+		}
+		if (!SpaceTypeEnum.LightingZone.getCode().equals(slaveClassCode)) {
+			return "从对象不属于照明分区类型,请参考规则";
+		}
+		return null;
+	}
+	
+}

+ 55 - 0
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Ss2EqShipRelationObject.java

@@ -0,0 +1,55 @@
+package com.persagy.proxy.adm.strategy.relationdata;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.proxy.adm.constant.AdmObjectInfoConstant;
+import com.persagy.proxy.adm.constant.AdmRelationType;
+import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
+import com.persagy.proxy.adm.model.AdmRelationObject;
+import com.persagy.proxy.adm.service.IRelationReportService;
+
+/**
+ * 图类型编码 -- SensorRelationship
+ * 
+ * @version 1.0.0
+ * @company persagy
+ * @author zhangqiankun
+ * @date 202193日 上午9:42:46
+ */
+@Component(value = AdmRelationType.EQ2EQ_SENSORRELATIONSHIP_SS2EQ)
+public class Ss2EqShipRelationObject extends AbstractQueryRelationObject {
+	
+	public Ss2EqShipRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
+	}
+
+	@Override
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode,
+			String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.EQ2EQ_SENSORRELATIONSHIP_SS2EQ, groupCode, projectId, code);
+	}
+
+	@Override
+	protected String checkRelationObject(ObjectNode master, String masterClassCode, ObjectNode slave,
+			String slaveClassCode) {
+		if (!AdmObjectInfoConstant.CHECK_SENSOR_CODES.contains(masterClassCode)) {
+			return "主对象不是传感器,请参考规则";
+		}
+		return null;
+	}
+	
+}

+ 55 - 0
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Ss2SpShipRelationObject.java

@@ -0,0 +1,55 @@
+package com.persagy.proxy.adm.strategy.relationdata;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.proxy.adm.constant.AdmObjectInfoConstant;
+import com.persagy.proxy.adm.constant.AdmRelationType;
+import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
+import com.persagy.proxy.adm.model.AdmRelationObject;
+import com.persagy.proxy.adm.service.IRelationReportService;
+
+/**
+ * 图类型编码 -- SensorRelationship
+ * 
+ * @version 1.0.0
+ * @company persagy
+ * @author zhangqiankun
+ * @date 202193日 上午9:42:46
+ */
+@Component(value = AdmRelationType.EQ2SP_SENSORRELATIONSHIP_SS2SP)
+public class Ss2SpShipRelationObject extends AbstractQueryRelationObject {
+	
+	public Ss2SpShipRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
+	}
+
+	@Override
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode,
+			String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.EQ2SP_SENSORRELATIONSHIP_SS2SP, groupCode, projectId, code);
+	}
+
+	@Override
+	protected String checkRelationObject(ObjectNode master, String masterClassCode, ObjectNode slave,
+			String slaveClassCode) {
+		if (!AdmObjectInfoConstant.CHECK_SENSOR_CODES.contains(masterClassCode)) {
+			return "主对象不是传感器,请参考规则";
+		}
+		return null;
+	}
+	
+}

+ 55 - 0
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Ss2SyShipRelationObject.java

@@ -0,0 +1,55 @@
+package com.persagy.proxy.adm.strategy.relationdata;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.proxy.adm.constant.AdmObjectInfoConstant;
+import com.persagy.proxy.adm.constant.AdmRelationType;
+import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
+import com.persagy.proxy.adm.model.AdmRelationObject;
+import com.persagy.proxy.adm.service.IRelationReportService;
+
+/**
+ * 图类型编码 -- SensorRelationship
+ * 
+ * @version 1.0.0
+ * @company persagy
+ * @author zhangqiankun
+ * @date 202193日 上午9:42:46
+ */
+@Component(value = AdmRelationType.EQ2SY_SENSORRELATIONSHIP_SS2SY)
+public class Ss2SyShipRelationObject extends AbstractQueryRelationObject {
+	
+	public Ss2SyShipRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
+	}
+
+	@Override
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode,
+			String projectId) {
+		throw new UnsupportedOperationException("未实现的策略类");
+	}
+
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.EQ2SY_SENSORRELATIONSHIP_SS2SY, groupCode, projectId, code);
+	}
+
+	@Override
+	protected String checkRelationObject(ObjectNode master, String masterClassCode, ObjectNode slave,
+			String slaveClassCode) {
+		if (!AdmObjectInfoConstant.CHECK_SENSOR_CODES.contains(masterClassCode)) {
+			return "主对象不是传感器,请参考规则";
+		}
+		return null;
+	}
+	
+}

+ 12 - 7
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sy2BdForRelationObject.java

@@ -17,7 +17,7 @@ import com.persagy.proxy.adm.constant.AdmObjectType;
 import com.persagy.proxy.adm.constant.AdmRelationType;
 import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
 import com.persagy.proxy.adm.model.AdmRelationObject;
-import com.persagy.proxy.adm.service.IReportDownloadService;
+import com.persagy.proxy.adm.service.IRelationReportService;
 
 /**
  * 
@@ -29,12 +29,12 @@ import com.persagy.proxy.adm.service.IReportDownloadService;
 @Component(value = AdmRelationType.SY2BD_FOR)
 public class Sy2BdForRelationObject extends AbstractQueryRelationObject {
 
-	public Sy2BdForRelationObject(IReportDownloadService reportDownloadService) {
-		super(reportDownloadService);
+	public Sy2BdForRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
 	}
 
 	@Override
-	protected List<AdmRelationObject> findRelationObject(String relType) {
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
 		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
 		QueryCriteria queryCriteria = new QueryCriteria();
 		ObjectNode criteria = objectMapper.createObjectNode();
@@ -48,15 +48,15 @@ public class Sy2BdForRelationObject extends AbstractQueryRelationObject {
 		queryCriteria.setPage(1L);
 		queryCriteria.setSize(1000L);
 		
-		return this.queryAllObjectInfo(queryCriteria, relType);
+		return this.queryAllObjectInfo(queryCriteria, groupCode, projectId);
 	}
 
 	@Override
-	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String relType) {
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode, String projectId) {
 		Set<String> allKeys = tempAllMap.keySet();
 		List<AdmRelationObject> resultList = new ArrayList<AdmRelationObject>();
 		
-		List<ObjectRelation> relationList = this.reportDownloadService.findObjectRelationList(groupCode, projectId, 
+		List<ObjectRelation> relationList = this.relationReportService.findObjectRelationList(groupCode, projectId, 
 				AdmRelationTypeEnum.SY2BD_FOR.getGraphCode(), AdmRelationTypeEnum.SY2BD_FOR.getRelCode());
 		for (ObjectRelation objectRelation : relationList) {
 			String systemId = objectRelation.getObjFrom();
@@ -73,5 +73,10 @@ public class Sy2BdForRelationObject extends AbstractQueryRelationObject {
 		
 		return resultList;
 	}
+	
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.SY2BD_FOR, groupCode, projectId, code);
+	}
 
 }

+ 13 - 8
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sy2FlForRelationObject.java

@@ -19,7 +19,7 @@ import com.persagy.proxy.adm.constant.AdmRelationType;
 import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
 import com.persagy.proxy.adm.constant.RelCodeEnum;
 import com.persagy.proxy.adm.model.AdmRelationObject;
-import com.persagy.proxy.adm.service.IReportDownloadService;
+import com.persagy.proxy.adm.service.IRelationReportService;
 
 /**
  * 
@@ -31,12 +31,12 @@ import com.persagy.proxy.adm.service.IReportDownloadService;
 @Component(value = AdmRelationType.SY2FL_FOR)
 public class Sy2FlForRelationObject extends AbstractQueryRelationObject {
 
-	public Sy2FlForRelationObject(IReportDownloadService reportDownloadService) {
-		super(reportDownloadService);
+	public Sy2FlForRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
 	}
 
 	@Override
-	protected List<AdmRelationObject> findRelationObject(String relType) {
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
 		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
 		QueryCriteria queryCriteria = new QueryCriteria();
 		ObjectNode criteria = objectMapper.createObjectNode();
@@ -50,15 +50,15 @@ public class Sy2FlForRelationObject extends AbstractQueryRelationObject {
 		queryCriteria.setPage(1L);
 		queryCriteria.setSize(1000L);
 		
-		return this.queryAllObjectInfo(queryCriteria, relType);
+		return this.queryAllObjectInfo(queryCriteria, groupCode, projectId);
 	}
 
 	@Override
-	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String relType) {
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode, String projectId) {
 		Set<String> allKeys = tempAllMap.keySet();
 		List<AdmRelationObject> resultList = new ArrayList<AdmRelationObject>();
 		
-		List<ObjectRelation> relationList = this.reportDownloadService.findObjectRelationList(groupCode, projectId, 
+		List<ObjectRelation> relationList = this.relationReportService.findObjectRelationList(groupCode, projectId, 
 				AdmRelationTypeEnum.SY2FL_FOR.getGraphCode(), AdmRelationTypeEnum.SY2FL_FOR.getRelCode());
 		for (ObjectRelation objectRelation : relationList) {
 			String systemId = objectRelation.getObjFrom();
@@ -70,7 +70,7 @@ public class Sy2FlForRelationObject extends AbstractQueryRelationObject {
 			ObjectNode floor = tempAllMap.get(floorId);
 			
 			// 获取楼层信息
-			ObjectNode buildingInfo = this.reportDownloadService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.SY2FL_FOR.getGraphCode(), 
+			ObjectNode buildingInfo = this.relationReportService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.SY2FL_FOR.getGraphCode(), 
 					RelCodeEnum.Sy2Bd.name(), systemId, null);
 			
 			AdmRelationObject convertObject = this.convertObject(system, "系统", floor, "楼层");
@@ -83,4 +83,9 @@ public class Sy2FlForRelationObject extends AbstractQueryRelationObject {
 		return resultList;
 	}
 
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.SY2FL_FOR, groupCode, projectId, code);
+	}
+	
 }

+ 12 - 7
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sy2ShForRelationObject.java

@@ -17,7 +17,7 @@ import com.persagy.proxy.adm.constant.AdmObjectType;
 import com.persagy.proxy.adm.constant.AdmRelationType;
 import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
 import com.persagy.proxy.adm.model.AdmRelationObject;
-import com.persagy.proxy.adm.service.IReportDownloadService;
+import com.persagy.proxy.adm.service.IRelationReportService;
 
 /**
  * 
@@ -29,12 +29,12 @@ import com.persagy.proxy.adm.service.IReportDownloadService;
 @Component(value = AdmRelationType.SY2SH_FOR)
 public class Sy2ShForRelationObject extends AbstractQueryRelationObject {
 
-	public Sy2ShForRelationObject(IReportDownloadService reportDownloadService) {
-		super(reportDownloadService);
+	public Sy2ShForRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
 	}
 
 	@Override
-	protected List<AdmRelationObject> findRelationObject(String relType) {
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
 		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
 		QueryCriteria queryCriteria = new QueryCriteria();
 		ObjectNode criteria = objectMapper.createObjectNode();
@@ -48,15 +48,15 @@ public class Sy2ShForRelationObject extends AbstractQueryRelationObject {
 		queryCriteria.setPage(1L);
 		queryCriteria.setSize(1000L);
 		
-		return this.queryAllObjectInfo(queryCriteria, relType);
+		return this.queryAllObjectInfo(queryCriteria, groupCode, projectId);
 	}
 
 	@Override
-	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String relType) {
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode, String projectId) {
 		Set<String> allKeys = tempAllMap.keySet();
 		List<AdmRelationObject> resultList = new ArrayList<AdmRelationObject>();
 		
-		List<ObjectRelation> relationList = this.reportDownloadService.findObjectRelationList(groupCode, projectId, 
+		List<ObjectRelation> relationList = this.relationReportService.findObjectRelationList(groupCode, projectId, 
 				AdmRelationTypeEnum.SY2SH_FOR.getGraphCode(), AdmRelationTypeEnum.SY2SH_FOR.getRelCode());
 		for (ObjectRelation objectRelation : relationList) {
 			String systemId = objectRelation.getObjFrom();
@@ -74,4 +74,9 @@ public class Sy2ShForRelationObject extends AbstractQueryRelationObject {
 		return resultList;
 	}
 
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.SY2SH_FOR, groupCode, projectId, code);
+	}
+	
 }

+ 14 - 9
src/main/java/com/persagy/proxy/adm/strategy/relationdata/Sy2SpForRelationObject.java

@@ -19,7 +19,7 @@ import com.persagy.proxy.adm.constant.AdmRelationType;
 import com.persagy.proxy.adm.constant.AdmRelationTypeEnum;
 import com.persagy.proxy.adm.constant.RelCodeEnum;
 import com.persagy.proxy.adm.model.AdmRelationObject;
-import com.persagy.proxy.adm.service.IReportDownloadService;
+import com.persagy.proxy.adm.service.IRelationReportService;
 
 import cn.hutool.core.util.StrUtil;
 
@@ -33,12 +33,12 @@ import cn.hutool.core.util.StrUtil;
 @Component(value = AdmRelationType.SY2SP_FOR)
 public class Sy2SpForRelationObject extends AbstractQueryRelationObject {
 
-	public Sy2SpForRelationObject(IReportDownloadService reportDownloadService) {
-		super(reportDownloadService);
+	public Sy2SpForRelationObject(IRelationReportService relationReportService) {
+		super(relationReportService);
 	}
 
 	@Override
-	protected List<AdmRelationObject> findRelationObject(String relType) {
+	public List<AdmRelationObject> findRelationObject(String groupCode, String projectId) {
 		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
 		QueryCriteria queryCriteria = new QueryCriteria();
 		ObjectNode criteria = objectMapper.createObjectNode();
@@ -52,15 +52,15 @@ public class Sy2SpForRelationObject extends AbstractQueryRelationObject {
 		queryCriteria.setPage(1L);
 		queryCriteria.setSize(1000L);
 		
-		return this.queryAllObjectInfo(queryCriteria, relType);
+		return this.queryAllObjectInfo(queryCriteria, groupCode, projectId);
 	}
 
 	@Override
-	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String relType) {
+	protected List<AdmRelationObject> handleObjectDigital(Map<String, ObjectNode> tempAllMap, String groupCode, String projectId) {
 		Set<String> allKeys = tempAllMap.keySet();
 		List<AdmRelationObject> resultList = new ArrayList<AdmRelationObject>();
 		
-		List<ObjectRelation> relationList = this.reportDownloadService.findObjectRelationList(groupCode, projectId, 
+		List<ObjectRelation> relationList = this.relationReportService.findObjectRelationList(groupCode, projectId, 
 				AdmRelationTypeEnum.SY2SP_FOR.getGraphCode(), AdmRelationTypeEnum.SY2SP_FOR.getRelCode());
 		for (ObjectRelation objectRelation : relationList) {
 			String systemId = objectRelation.getObjFrom();
@@ -72,9 +72,9 @@ public class Sy2SpForRelationObject extends AbstractQueryRelationObject {
 			ObjectNode space = tempAllMap.get(spaceId);
 			
 			// 获取楼层信息
-			ObjectNode floorInfo = this.reportDownloadService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.SY2SP_FOR.getGraphCode(), 
+			ObjectNode floorInfo = this.relationReportService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.SY2SP_FOR.getGraphCode(), 
 					RelCodeEnum.Sy2Bd.name(), systemId, null);
-			ObjectNode buildingInfo = this.reportDownloadService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.SY2SP_FOR.getGraphCode(), 
+			ObjectNode buildingInfo = this.relationReportService.getObjectByCodeAndId(groupCode, projectId, AdmRelationTypeEnum.SY2SP_FOR.getGraphCode(), 
 					RelCodeEnum.Sy2Fl.name(), systemId, null);
 			
 			AdmRelationObject convertObject = this.convertObject(system, "系统", space, "空间");
@@ -95,4 +95,9 @@ public class Sy2SpForRelationObject extends AbstractQueryRelationObject {
 		return resultList;
 	}
 
+	@Override
+	public Object beforeSaveRelationObject(AdmRelationObject relationObject, String groupCode, String projectId, String code) {
+		return this.beforeSaveRelationObject(relationObject, AdmRelationTypeEnum.SY2SP_FOR, groupCode, projectId, code);
+	}
+	
 }

+ 89 - 0
src/main/java/com/persagy/proxy/adm/utils/GeoToolsUtil.java

@@ -0,0 +1,89 @@
+package com.persagy.proxy.adm.utils;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.geotools.geometry.jts.JTSFactoryFinder;
+import org.locationtech.jts.geom.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * @ClassName GeoToolsUtil
+ * @Description: 点面包含关系分析
+ * @Author linhuili
+ * @Date 2021/9/3 20:31
+ * @Version V1.0
+ **/
+public class GeoToolsUtil {
+    /**
+     * 创建点
+     * @param pointLocal
+     */
+    private static Point createPoint(ObjectNode pointLocal){
+        Long x = 0L;
+        Long y = 0L;
+        Long z = 0L;
+        if(pointLocal.get("X") != null){
+            x = Long.valueOf(pointLocal.get("X").textValue());
+        }
+        if(pointLocal.get("Y") != null){
+            y = Long.valueOf(pointLocal.get("Y").textValue());
+        }
+        if(pointLocal.get("Z") !=null){
+            z = Long.valueOf(pointLocal.get("Z").textValue());
+        }
+        GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
+        Coordinate coord = new Coordinate(x, y,z);
+        Point point = geometryFactory.createPoint(coord);
+        return point;
+    }
+
+    /**
+     * 创建面
+     * @param outLines
+     */
+    private static Polygon createPolygon(List<ObjectNode> outLines){
+        GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
+        List<Coordinate> objects = new ArrayList<>();
+        for (ObjectNode outLine : outLines) {
+            Long x = 0L;
+            Long y = 0L;
+            Long z = 0L;
+            if(outLine.get("X") != null){
+                x = Long.valueOf(outLine.get("X").textValue());
+            }
+            if(outLine.get("Y") != null){
+                y = Long.valueOf(outLine.get("Y").textValue());
+            }
+            if(outLine.get("Z") !=null){
+                z = Long.valueOf(outLine.get("Z").textValue());
+            }
+            Coordinate coordinate = new Coordinate(x, y, z);
+            objects.add(coordinate);
+        }
+        Coordinate[] coordinates = objects.toArray(new Coordinate[0]);
+        LinearRing ring = geometryFactory.createLinearRing(objects.toArray(new Coordinate[0]));
+        LinearRing holes[] = null; // use LinearRing[] to represent holes
+        Polygon polygon = geometryFactory.createPolygon(ring, holes);
+        return polygon;
+   }
+
+    /**
+     * 点面包含关系判断
+     * 用途:判断一个面是否包含一个点,即一个点是否在一个面内
+     * @param pointLocal 坐标点
+     * @param outLines 轮廓线
+     * @return
+     */
+   public static Boolean isPointInPoly(ObjectNode pointLocal, List<ObjectNode> outLines){
+       //创建点
+       Point point = createPoint(pointLocal);
+       //创建面
+       Polygon polygon = createPolygon(outLines);
+       //判断点面包含关系
+       boolean flag = polygon.contains(point);
+       return flag;
+   }
+
+}