Bläddra i källkod

********************WX************************
整合后的数据中心,第一版

zhangweixin 4 år sedan
incheckning
f4196c6a7f
100 ändrade filer med 16390 tillägg och 0 borttagningar
  1. 6 0
      .gitignore
  2. 62 0
      build.gradle
  3. 172 0
      data-center/build.gradle
  4. 81 0
      data-center/src/main/kotlin/com/persagy/server/DataCenterApp.kt
  5. 236 0
      data-center/src/main/kotlin/com/persagy/server/Swagger2Config.kt
  6. 41 0
      data-center/src/main/kotlin/com/persagy/server/WebMvcConfg.kt
  7. 5 0
      data-center/src/main/kotlin/com/persagy/server/controllers/a.java
  8. 159 0
      data-center/src/main/kotlin/com/persagy/server/controllers/objects/BuildingController.kt
  9. 122 0
      data-center/src/main/kotlin/com/persagy/server/controllers/objects/ComponentController.kt
  10. 159 0
      data-center/src/main/kotlin/com/persagy/server/controllers/objects/EquipController.kt
  11. 147 0
      data-center/src/main/kotlin/com/persagy/server/controllers/objects/FloorController.kt
  12. 210 0
      data-center/src/main/kotlin/com/persagy/server/controllers/objects/GeneralSystemController.kt
  13. 105 0
      data-center/src/main/kotlin/com/persagy/server/controllers/objects/ISpaceController.kt
  14. 130 0
      data-center/src/main/kotlin/com/persagy/server/controllers/objects/LocationPointController.kt
  15. 110 0
      data-center/src/main/kotlin/com/persagy/server/controllers/objects/ProjectController.kt
  16. 119 0
      data-center/src/main/kotlin/com/persagy/server/controllers/objects/PropertyController.kt
  17. 228 0
      data-center/src/main/kotlin/com/persagy/server/controllers/objects/ShaftController.kt
  18. 115 0
      data-center/src/main/kotlin/com/persagy/server/controllers/objects/TenantController.kt
  19. 245 0
      data-center/src/main/kotlin/com/persagy/server/controllers/objects/ZoneSpaceController.kt
  20. 16 0
      data-center/src/main/kotlin/com/persagy/server/mappers/ICalcSpaceMapper.kt
  21. 41 0
      data-center/src/main/kotlin/com/persagy/server/mappers/ICalcSpecialMapper.kt
  22. 177 0
      data-center/src/main/kotlin/com/persagy/server/mappers/IRelationCalcMapper.kt
  23. 35 0
      data-center/src/main/kotlin/com/persagy/server/mappers/IRelationCountMapper.kt
  24. 29 0
      data-center/src/main/kotlin/com/persagy/server/mappers/IRelationCountProvider.kt
  25. 368 0
      data-center/src/main/kotlin/com/persagy/server/mappers/IRelationExcelExportMapper.kt
  26. 343 0
      data-center/src/main/kotlin/com/persagy/server/mappers/IRelationExcelImportMapper.kt
  27. 46 0
      data-center/src/main/kotlin/com/persagy/server/mappers/MepSystemMapper.kt
  28. 171 0
      data-center/src/main/kotlin/com/persagy/server/mappers/RelationProvider.kt
  29. 15 0
      data-center/src/main/kotlin/com/persagy/server/mappers/RelationalProcessingMapper.kt
  30. 157 0
      data-center/src/main/kotlin/com/persagy/server/mappers/StatisticsCountMapper.kt
  31. 4 0
      data-center/src/main/kotlin/com/persagy/server/services/a.java
  32. 65 0
      data-center/src/main/kotlin/com/persagy/server/services/assistant/ObjInfoService.kt
  33. 116 0
      data-center/src/main/kotlin/com/persagy/server/services/assistant/RUpDateEquipAndSapceService.kt
  34. 153 0
      data-center/src/main/kotlin/com/persagy/server/services/assistant/SchemeService.kt
  35. 12 0
      data-center/src/main/kotlin/com/persagy/server/services/assistant/ShaftBuildingService.kt
  36. 12 0
      data-center/src/main/kotlin/com/persagy/server/services/assistant/ShaftFloorService.kt
  37. 583 0
      data-center/src/main/kotlin/com/persagy/server/services/assistant/StatisticsService.kt
  38. 173 0
      data-center/src/main/kotlin/com/persagy/server/services/assistant/UpDataFloorAndBuildingServuce.kt
  39. 30 0
      data-center/src/main/kotlin/com/persagy/server/services/base/RService.kt
  40. 228 0
      data-center/src/main/kotlin/com/persagy/server/services/base/Service.kt
  41. 271 0
      data-center/src/main/kotlin/com/persagy/server/services/base/ServiceSpace.kt
  42. 86 0
      data-center/src/main/kotlin/com/persagy/server/services/dict/DClassDefService.kt
  43. 354 0
      data-center/src/main/kotlin/com/persagy/server/services/dict/DataDictionaryDescriptionProjectService.kt
  44. 32 0
      data-center/src/main/kotlin/com/persagy/server/services/dict/DictAirConditionerService.kt
  45. 32 0
      data-center/src/main/kotlin/com/persagy/server/services/dict/DictBuildingDirectService.kt
  46. 32 0
      data-center/src/main/kotlin/com/persagy/server/services/dict/DictBuildingFunctionalService.kt
  47. 32 0
      data-center/src/main/kotlin/com/persagy/server/services/dict/DictBuildingStructureTypeService.kt
  48. 32 0
      data-center/src/main/kotlin/com/persagy/server/services/dict/DictClimateService.kt
  49. 32 0
      data-center/src/main/kotlin/com/persagy/server/services/dict/DictDevelopService.kt
  50. 32 0
      data-center/src/main/kotlin/com/persagy/server/services/dict/DictFloorTypeService.kt
  51. 32 0
      data-center/src/main/kotlin/com/persagy/server/services/dict/DictGreenBuildLevService.kt
  52. 32 0
      data-center/src/main/kotlin/com/persagy/server/services/dict/DictHeatingTypeService.kt
  53. 32 0
      data-center/src/main/kotlin/com/persagy/server/services/dict/DictInsulateTypeService.kt
  54. 32 0
      data-center/src/main/kotlin/com/persagy/server/services/dict/DictProvincialCityCodeService.kt
  55. 32 0
      data-center/src/main/kotlin/com/persagy/server/services/dict/DictSpaceFunctionalTypesService.kt
  56. 128 0
      data-center/src/main/kotlin/com/persagy/server/services/dict/DictSpaceProjectService.kt
  57. 32 0
      data-center/src/main/kotlin/com/persagy/server/services/dict/DictWindService.kt
  58. 32 0
      data-center/src/main/kotlin/com/persagy/server/services/dict/DitcWeatherService.kt
  59. 35 0
      data-center/src/main/kotlin/com/persagy/server/services/dict/EquipFamilyService.kt
  60. 393 0
      data-center/src/main/kotlin/com/persagy/server/services/dict/PropertyDefProjectService.kt
  61. 488 0
      data-center/src/main/kotlin/com/persagy/server/services/dict/PropertyDefService.kt
  62. 18 0
      data-center/src/main/kotlin/com/persagy/server/services/graphtype/BaseDataService.kt
  63. 53 0
      data-center/src/main/kotlin/com/persagy/server/services/graphtype/ConnectedBlockService.kt
  64. 47 0
      data-center/src/main/kotlin/com/persagy/server/services/graphtype/ConnectedBlockSourceService.kt
  65. 207 0
      data-center/src/main/kotlin/com/persagy/server/services/graphtype/GraphicTypeMapperService.kt
  66. 137 0
      data-center/src/main/kotlin/com/persagy/server/services/graphtype/GraphicTypeService.kt
  67. 392 0
      data-center/src/main/kotlin/com/persagy/server/services/graphtype/RelationTypeProjectService.kt
  68. 220 0
      data-center/src/main/kotlin/com/persagy/server/services/objects/BuildingService.kt
  69. 157 0
      data-center/src/main/kotlin/com/persagy/server/services/objects/ComponentService.kt
  70. 494 0
      data-center/src/main/kotlin/com/persagy/server/services/objects/EquipmentService.kt
  71. 476 0
      data-center/src/main/kotlin/com/persagy/server/services/objects/FloorService.kt
  72. 497 0
      data-center/src/main/kotlin/com/persagy/server/services/objects/GeneralSystemService.kt
  73. 153 0
      data-center/src/main/kotlin/com/persagy/server/services/objects/LocationPointServices.kt
  74. 155 0
      data-center/src/main/kotlin/com/persagy/server/services/objects/ProjectService.kt
  75. 243 0
      data-center/src/main/kotlin/com/persagy/server/services/objects/PropertyService.kt
  76. 515 0
      data-center/src/main/kotlin/com/persagy/server/services/objects/ShaftService.kt
  77. 134 0
      data-center/src/main/kotlin/com/persagy/server/services/objects/SpaceService.kt
  78. 157 0
      data-center/src/main/kotlin/com/persagy/server/services/objects/TenantService.kt
  79. 877 0
      data-center/src/main/kotlin/com/persagy/server/services/objects/ZoneSpaceBaseService.kt
  80. 34 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/REq2SpService.kt
  81. 189 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/REqForBdService.kt
  82. 187 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/REqForFlService.kt
  83. 187 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/REqForShService.kt
  84. 246 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/REqInShService.kt
  85. 490 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/REqInSpBaseService.kt
  86. 210 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/RFlThroughFlService.kt
  87. 80 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/RIspaceAdjacentIspaceService.kt
  88. 561 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/RShContainSpBaseService.kt
  89. 247 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/RShaftThroughShaftService.kt
  90. 37 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/RSp2SiService.kt
  91. 31 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/RSpContainShBaseList.kt
  92. 139 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/RSpInBdService.kt
  93. 155 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/RSpInFlService.kt
  94. 481 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/RSpInSiBaseService.kt
  95. 135 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/RSpatialConnectionService.kt
  96. 148 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/RSyForBdService.kt
  97. 148 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/RSyForFlService.kt
  98. 147 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/RSyForShService.kt
  99. 177 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/RSyForSpBaseService.kt
  100. 0 0
      data-center/src/main/kotlin/com/persagy/server/services/rel/RSyInBdService.kt

+ 6 - 0
.gitignore

@@ -0,0 +1,6 @@
+.idea
+*.iml
+.gradle
+build
+out
+gradle.properties

+ 62 - 0
build.gradle

@@ -0,0 +1,62 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*             
+ *         =@$    ;;;!=%@@@@=!           =@!      
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;                              
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+
+group 'cn.sagacloud.server'
+version '2.0.0'
+
+buildscript {
+    repositories {
+        maven{url MAVEN_REPO_PUBLIC_URL}
+        maven{ url "http://maven.aliyun.com/nexus/content/groups/public/"}
+        mavenCentral()
+        jcenter()
+    }
+    dependencies {
+        classpath group: 'org.springframework.boot', name: 'spring-boot-gradle-plugin', version: SPRING_BOOT_VERSION
+        classpath group: 'org.jetbrains.kotlin', name: 'kotlin-gradle-plugin', version: KOTLIN_VERSION
+        classpath group: 'org.jetbrains.dokka', name: 'dokka-gradle-plugin', version: DOKKA_VERSION
+        classpath group: 'com.google.protobuf', name: 'protobuf-gradle-plugin', version: PROTOBUF_GRADLE_VERSION
+        // ssh插件, 用于部署
+        classpath 'org.hidetake:gradle-ssh-plugin:2.10.1'
+    }
+}
+
+allprojects {
+    repositories {
+        maven{ url "http://maven.aliyun.com/nexus/content/groups/public/"}
+        maven{
+            url MAVEN_REPO_PUBLIC_URL
+            credentials {
+                username = NEXUS_USERNAME
+                password = NEXUS_PASSWORD
+            }
+        }
+        maven { url "https://repo.spring.io/milestone" }
+        mavenCentral()
+        jcenter()
+    }
+    tasks.withType(Javadoc) {
+        options{ encoding "UTF-8"
+            charSet "UTF-8"
+            links "http://docs.oracle.com/javase/8/docs/api"
+        }
+    }
+}

+ 172 - 0
data-center/build.gradle

@@ -0,0 +1,172 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*             
+ *         =@$    ;;;!=%@@@@=!           =@!      
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;                              
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+group rootProject.group
+version rootProject.version
+
+apply plugin: "kotlin"
+apply plugin: "org.jetbrains.dokka"
+apply plugin: "war"
+apply plugin: 'org.springframework.boot'
+apply plugin: 'io.spring.dependency-management'
+
+sourceCompatibility = JVM_TARGET
+
+compileKotlin {
+    kotlinOptions.jvmTarget = JVM_TARGET
+}
+compileTestKotlin {
+    kotlinOptions.jvmTarget = JVM_TARGET
+}
+
+dependencies {
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // kotlin 依赖
+    compile group: "org.jetbrains.kotlin", name: "kotlin-stdlib-jdk8", version: KOTLIN_VERSION
+    compile group: "org.jetbrains.kotlin", name: "kotlin-reflect", version: KOTLIN_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // 页面
+    compile group: "org.springframework.boot", name: "spring-boot-starter-freemarker", version: SPRING_BOOT_VERSION
+    // spring boot 依赖
+    compile group: "org.springframework.boot", name: "spring-boot-starter-web", version: SPRING_BOOT_VERSION
+    compile group: "org.springframework.boot", name: "spring-boot-configuration-processor", version: SPRING_BOOT_VERSION
+    compile group: "org.springframework.boot", name: "spring-boot-starter-actuator", version: SPRING_BOOT_VERSION
+    compile group: "org.springframework.boot", name: "spring-boot-starter-logging", version: SPRING_BOOT_VERSION
+    //消息
+    compile group: "org.springframework.boot", name: "spring-boot-starter-activemq", version: SPRING_BOOT_VERSION
+    providedCompile group: "org.springframework.boot", name:"spring-boot-starter-tomcat", version: SPRING_BOOT_VERSION
+    // spring boot 缓存
+    compile group:"org.springframework.boot", name:"spring-boot-starter-cache", version: SPRING_BOOT_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // spring cloud 依赖
+    compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka', version: SPRING_CLOUD_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // MySQL
+    // https://mvnrepository.com/artifact/mysql/mysql-connector-java
+//    compile group: 'mysql', name: 'mysql-connector-java', version: MYSQL_VERSION
+
+    // PostgreSQL
+    //https://mvnrepository.com/artifact/org.postgresql/postgresql
+//    compile group: 'org.postgresql',    name: 'postgresql',     version: POSTGRESQL_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // RESTful API 文档生成工具
+    // https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui
+    compile group: "io.springfox", name: "springfox-swagger-ui", version: SWAGGER_VERSION
+    compile group: "io.springfox", name: "springfox-swagger2", version: SWAGGER_VERSION
+//    compile group: "com.github.xiaoymin", name: "swagger-bootstrap-ui", version: SWAGGER_BOOTSTRAP_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+    compile group: "cn.sagacloud", name: "saga-kotlin-base", version: SAGA_KOTLIN_VERSION
+    compile group: "cn.sagacloud", name: "saga-kotlin-database", version: SAGA_KOTLIN_VERSION
+    compile group: "cn.sagacloud", name: "saga-kotlin-mybatis", version: SAGA_KOTLIN_VERSION
+    compile group: "cn.sagacloud", name: "saga-kotlin-postgresql", version: SAGA_KOTLIN_VERSION
+    compile group: "cn.sagacloud", name: "saga-service-base", version: SAGA_SERVICE_VERSION
+    compile group: "cn.sagacloud", name: "saga-service-mybatis", version: SAGA_SERVICE_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // Excel操作
+    // https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml
+    compile group: 'org.apache.poi', name: 'poi-ooxml', version: POI_VERSION
+    // kafka
+//    compile group: 'com.sybotan',   name: 'sybotan-service-kafka',       version: SYBOTAN_SERVICE_VERSION
+    //文档
+    compile group: 'cn.sagacloud',   name: 'saga-service-postgresql', version: SAGA_SERVICE_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+    // 实体类依赖
+    compile project(":data-core")
+}
+
+
+dependencyManagement {
+    imports {
+        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${SPRING_CLOUD_DEPENDENCIES}"
+    }
+}
+
+sourceSets.main.resources.srcDirs = ['src/main/resources', 'src/main/resources-dev']
+//ext.needTest = 'true'
+
+task buildProd {
+    doFirst {
+        sourceSets.main.resources.srcDirs = ["src/main/resources", "src/main/resources-prod"]
+        test.onlyIf {
+            project.hasProperty("needTest")
+        }
+    }
+    finalizedBy(build)
+}
+//
+task buildDev {
+    doFirst {
+        sourceSets.main.resources.srcDirs = ['src/main/resources', 'src/main/resources-dev']
+    }
+    finalizedBy(build)
+}
+
+task buildTest {
+    doFirst {
+        sourceSets.main.resources.srcDirs = ['src/main/resources', 'src/main/resources-test']
+        test.onlyIf {
+            project.hasProperty("needTest")
+        }
+    }
+    finalizedBy(build)
+}
+
+task buildjm {
+    doFirst {
+        sourceSets.main.resources.srcDirs = ['src/main/resources', 'src/main/resources-jm']
+    }
+    finalizedBy(build)
+}
+
+task buildsuning {
+    doFirst {
+        sourceSets.main.resources.srcDirs = ['src/main/resources', 'src/main/resources-suning']
+    }
+    finalizedBy(build)
+}
+
+task buildguancheng {
+    doFirst {
+        sourceSets.main.resources.srcDirs = ['src/main/resources', 'src/main/resources-guancheng']
+    }
+    finalizedBy(build)
+}
+task buildasia {
+    doFirst {
+        sourceSets.main.resources.srcDirs = ['src/main/resources', 'src/main/resources-asia']
+    }
+    finalizedBy(build)
+}
+
+task buildwanda {
+    doFirst {
+        sourceSets.main.resources.srcDirs = ['src/main/resources', 'src/main/resources-wanda']
+    }
+    finalizedBy(build)
+}

+ 81 - 0
data-center/src/main/kotlin/com/persagy/server/DataCenterApp.kt

@@ -0,0 +1,81 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server
+
+import com.sybotan.service.json.SJsonHttpMessageConverter
+import org.mybatis.spring.annotation.MapperScan
+import org.slf4j.LoggerFactory
+import org.springframework.boot.SpringApplication
+import org.springframework.boot.autoconfigure.SpringBootApplication
+import org.springframework.boot.builder.SpringApplicationBuilder
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer
+import org.springframework.context.annotation.Bean
+import org.springframework.context.annotation.ComponentScan
+import org.springframework.scheduling.annotation.EnableScheduling
+
+/**
+ * 应用配置
+ *
+ * @author  Andy
+ */
+@ComponentScan(basePackages = ["com.persagy.server", "com.persagy"])           // 配置组件扫描路径
+@MapperScan("com.persagy", "com.persagy.server")                       // Mapper组件扫描路径
+@SpringBootApplication
+@EnableScheduling
+open class DataCenterApp : SpringBootServletInitializer() {
+    companion object {
+        // 日志
+        private val logger = LoggerFactory.getLogger(DataCenterApp::class.java)
+    } // Companion object
+
+    /**
+     * 配置应用
+     *
+     * @param   application     应用构建对象
+     */
+    override fun configure(application: SpringApplicationBuilder): SpringApplicationBuilder {
+        return application.sources(DataCenterApp::class.java)
+    } // Function configure
+
+    /**
+     * 配置FastJson
+     *
+     * @return  HttpMessageConverters
+     */
+    @Bean
+    @Suppress("MoveLambdaOutsideParentheses")
+    open fun jsonHttpMessageConverters(): SJsonHttpMessageConverter {
+        val fastConverter = SJsonHttpMessageConverter()
+        fastConverter.propertyNamingStrategy = com.alibaba.fastjson.PropertyNamingStrategy.PascalCase
+        return fastConverter
+    } // Function fastJsonHttpMessageConverters()
+
+} // Class Application
+
+/**
+ * Web应用入口
+ *
+ * @param   args        命令行参数
+ */
+fun main(args: Array<String>) {
+    SpringApplication.run(DataCenterApp::class.java, *args)
+    return
+} // Function main()

+ 236 - 0
data-center/src/main/kotlin/com/persagy/server/Swagger2Config.kt

@@ -0,0 +1,236 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server
+
+import com.alibaba.fastjson.annotation.JSONField
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.fasterxml.jackson.databind.PropertyName
+import com.fasterxml.jackson.databind.introspect.Annotated
+import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector
+import com.fasterxml.jackson.databind.module.SimpleModule
+import org.slf4j.LoggerFactory
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.context.ApplicationContext
+import org.springframework.context.annotation.Bean
+import org.springframework.context.annotation.Configuration
+import springfox.documentation.builders.ApiInfoBuilder
+import springfox.documentation.builders.ParameterBuilder
+import springfox.documentation.builders.PathSelectors
+import springfox.documentation.builders.RequestHandlerSelectors
+import springfox.documentation.schema.ModelRef
+import springfox.documentation.schema.configuration.ObjectMapperConfigured
+import springfox.documentation.service.ApiInfo
+import springfox.documentation.service.Contact
+import springfox.documentation.service.Parameter
+import springfox.documentation.spi.DocumentationType
+import springfox.documentation.spring.web.plugins.Docket
+import springfox.documentation.swagger2.annotations.EnableSwagger2
+import javax.annotation.PostConstruct
+
+/**
+ * RESTful API文档生成器Swagger2配置
+ *
+ * @author  PLX
+ */
+@Configuration
+@EnableSwagger2
+open class Swagger2Config {
+    companion object {
+        // 日志
+        private val logger = LoggerFactory.getLogger(Swagger2Config::class.java)
+    } // Companion object
+
+    @Autowired
+    lateinit var applicationContext: ApplicationContext
+
+    private val version = "2.0"
+
+    /**
+     * 设置Json解析器(默认使用的是jackson),这里改为FastJson
+     */
+    @PostConstruct
+    fun setObjectMapper() {
+        val objectMapper = ObjectMapper()
+        val module = SimpleModule()
+        objectMapper.registerModule(module)
+        // objectMapper.setAnnotationIntrospector(SFastjsonAnnotationIntrospector())
+
+        objectMapper.setAnnotationIntrospector(object : JacksonAnnotationIntrospector() {
+
+            override fun isAnnotationBundle(ann: Annotation): Boolean {
+                println("isAnnotationBundle")
+
+                return if (ann.annotationClass == JSONField::class.java) {
+                    true
+                } else super.isAnnotationBundle(ann)
+            }
+
+            override fun findNameForSerialization(a: Annotated): PropertyName? {
+                println("findNameForSerialization")
+                val nameForSerialization = super.findNameForSerialization(a)
+                if (nameForSerialization == null || nameForSerialization === PropertyName.USE_DEFAULT) {
+                    val jsonField = _findAnnotation(a, JSONField::class.java)
+                    if (jsonField != null) {
+                        return PropertyName.construct(jsonField.name)
+                    }
+                }
+                return nameForSerialization
+            }
+
+            override fun findNameForDeserialization(a: Annotated): PropertyName? {
+                println("findNameForDeserialization")
+                val nameForDeserialization = super.findNameForDeserialization(a)
+                if (nameForDeserialization == null || nameForDeserialization === PropertyName.USE_DEFAULT) {
+                    val jsonField = _findAnnotation(a, JSONField::class.java)
+                    if (jsonField != null) {
+                        return PropertyName.construct(jsonField.name)
+                    }
+                }
+                return nameForDeserialization
+            }
+        })
+        //////////////////////////////////
+
+        val objectMapperConfigured = ObjectMapperConfigured(applicationContext, objectMapper)
+        applicationContext.publishEvent(objectMapperConfigured)
+        return
+    } // Function setObjectMapper()
+
+
+
+
+    /**
+     * 创建RestApi文档生成器
+     *
+     * @return  返回文档生成器对象
+     */
+    @Bean
+    open fun createRestApi(): Docket {
+        logger.debug("createRestApi")
+        val builder = ParameterBuilder()
+        val builderComming = ParameterBuilder()
+        val builderPhone = ParameterBuilder()
+        val pars = ArrayList<Parameter>()
+        builder.name("ProjectId").description("项目ID").modelRef(ModelRef("string")).parameterType("header").required(false).build()
+        builderComming.name("Coming").description("来源").modelRef(ModelRef("string")).parameterType("header").required(false).build()
+        builderPhone.name("Account").description("账号信息").modelRef(ModelRef("string")).parameterType("header").required(false).build()
+        pars.add(builder.build())
+        pars.add(builderComming.build())
+        pars.add(builderPhone.build())
+        return Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo())
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.persagy.server"))
+                .paths(PathSelectors.any())
+                .build()
+                .globalOperationParameters(pars)
+    } // Function createRestApi()
+
+    /**
+     * 对象Api
+     *
+     * @return  返回文档生成器对象
+     */
+    @Bean
+    open fun objectApi(): Docket {
+        val builder = ParameterBuilder()
+        val builderComming = ParameterBuilder()
+        val builderPhone = ParameterBuilder()
+        val pars = ArrayList<Parameter>()
+        builder.name("ProjectId").description("项目ID").modelRef(ModelRef("string")).parameterType("header").required(false).build()
+        builderComming.name("Coming").description("来源").modelRef(ModelRef("string")).parameterType("header").required(false).build()
+        builderPhone.name("Account").description("账号信息").modelRef(ModelRef("string")).parameterType("header").required(false).build()
+        pars.add(builder.build())
+        pars.add(builderComming.build())
+        pars.add(builderPhone.build())
+        return Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfos("对象-API", "对象操作", version))
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.persagy.server"))
+                .paths(PathSelectors.ant("/object/**"))
+                .build()
+                .groupName("1. 对象-API")
+                .pathMapping("/")
+                .globalOperationParameters(pars)
+    } // Function objectApi()
+
+    /**
+     * 关系Api
+     *
+     * @return  返回文档生成器对象
+     */
+    @Bean
+    open fun relationApi(): Docket {
+        val builder = ParameterBuilder()
+        val builderComming = ParameterBuilder()
+        val builderPhone = ParameterBuilder()
+        val pars = ArrayList<Parameter>()
+        builder.name("ProjectId").description("项目ID").modelRef(ModelRef("string")).parameterType("header").required(false).build()
+        builderComming.name("Coming").description("来源").modelRef(ModelRef("string")).parameterType("header").required(false).build()
+        builderPhone.name("Account").description("账号信息").modelRef(ModelRef("string")).parameterType("header").required(false).build()
+        pars.add(builder.build())
+        pars.add(builderComming.build())
+        pars.add(builderPhone.build())
+        return Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfos("关系-API", "关系操作", version))
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.persagy.server"))
+                .paths(PathSelectors.ant("/relation/**"))
+                .build()
+                .groupName("3. 关系-API")
+                .pathMapping("/")
+                .globalOperationParameters(pars)
+    } // Function relationApi()
+
+
+    /**
+     * 返回API信息基本
+     *
+     * @return  返回Api基本信息
+     */
+    private fun apiInfo(): ApiInfo {
+        return ApiInfoBuilder()
+                .title("数据中心API")
+                .description("接口中Comming来源信息:扫楼:App-scanBuildingApp、慧运营运维平台:adm、Revit算法:RevitAlgorithm")
+                .termsOfServiceUrl("http://www.persagy.cn/")
+                .contact(Contact("张维新", "", "zhangweixin@sagacloud.cn"))
+                .version("2.0")
+                .build()
+    } // Function apiInfo()
+
+    /**
+     * 运回API信息基本
+     *
+     * @param   title           Api 标题
+     * @param   description     API 描述
+     * @param   version         API 版本号
+     * @return  返回Api基本信息
+     */
+    private fun apiInfos(title: String, description: String, version: String): ApiInfo {
+        return ApiInfoBuilder()
+                .title(title)
+                .description(description)
+                .termsOfServiceUrl("http://www.persagy.cn/")
+                .contact(Contact("张维新", "", "zhangweixin@sagacloud.cn"))
+                .version(version)
+                .build()
+    } // Function apiInfo()
+} // Class Swagger2Config

+ 41 - 0
data-center/src/main/kotlin/com/persagy/server/WebMvcConfg.kt

@@ -0,0 +1,41 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server
+
+import com.sybotan.service.interceptors.SPageInterceptor
+import org.springframework.context.annotation.Configuration
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
+
+@Suppress("DEPRECATION")
+@Configuration
+open class WebMvcConfg: WebMvcConfigurerAdapter() {
+
+    /**
+     * 配置拦截器
+     *
+     * @param   registry        拦截器注册器
+     */
+    override fun addInterceptors(registry : InterceptorRegistry) {
+        registry.addInterceptor(SPageInterceptor()).addPathPatterns("/**")
+        super.addInterceptors(registry)
+    } // Function addInterceptors()
+} // Class WebMvcConf()

+ 5 - 0
data-center/src/main/kotlin/com/persagy/server/controllers/a.java

@@ -0,0 +1,5 @@
+package com.persagy.server.controllers;
+
+public class a {
+
+}

+ 159 - 0
data-center/src/main/kotlin/com/persagy/server/controllers/objects/BuildingController.kt

@@ -0,0 +1,159 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.controllers.objects
+
+import com.persagy.server.datacenter.models.entities.dictdatacenter.DictDatacenterProjectcustom
+import com.persagy.server.datacenter.models.entities.objects.Building
+import com.persagy.server.services.objects.BuildingService
+import com.sybotan.base.extensions.toJson
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.requests.SCountRequest
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.requests.SQueryRequest
+import com.sybotan.service.models.requests.SUpdateRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCountResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import com.sybotan.service.models.responses.SQueryResponse
+import io.swagger.annotations.Api
+import io.swagger.annotations.ApiOperation
+import org.slf4j.LoggerFactory
+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.script.Invocable
+import javax.script.ScriptEngineManager
+
+/**
+ * 建筑接口
+ *
+ * @author 张维新
+ */
+@Api(tags = ["AB、建筑"],position = 2)
+@RestController
+@RequestMapping("/object/building")
+open class BuildingController {
+    companion object {
+        // 日志
+        private val logger = LoggerFactory.getLogger(BuildingController::class.java)
+    } // Companion object
+
+    /**
+     * 批量创建建筑
+     *
+     * @param   request         建筑对象列表
+     * @return                  创建结果信息
+     */
+    @ApiOperation(value = "创建建筑信息", notes = "")
+    @PostMapping(value = ["/create"])
+    fun create(@RequestBody request: SCreateRequest<Building>): SCreateResponse<Building> {
+        logger.debug("building =${request.toJson()}")
+        return BuildingService.createList(request)
+    } // Function create()
+
+    /**
+     * 根据id删除建筑
+     *
+     * @param   idList      id数组
+     * @return              删除的结果信息
+     */
+    @ApiOperation(value = "根据id删除建筑信息", notes = "")
+    @PostMapping(value = ["/delete"])
+    fun delete(@RequestBody idList: ArrayList<Building>): SBaseResponse {
+        return BuildingService.deleteByKeysList(idList)
+    } // Function delete()
+
+    /**
+     * 更新建筑信息
+     *
+     * @param   request     更新的内容对象
+     * @return              更新的结果
+     */
+    @ApiOperation(value = "更新建筑信息", notes = "")
+    @PostMapping(value = ["/update"])
+    fun update(@RequestBody request: SUpdateRequest<Building>): SBaseResponse {
+        logger.debug("buildingUpdate =${request.toJson()}")
+        return BuildingService.updateList(request)
+    } // Function update()
+
+    /**
+     * 查询建筑信息
+     *
+     * @param   request     查询信息条件
+     * @return              查询结果
+     */
+    @ApiOperation(value = "查询建筑信息", notes = "级联查询的对象:楼层(floor)、项目(project)")
+    @PostMapping(value = ["/query"])
+    fun query(@RequestBody request: SQueryRequest): SQueryResponse<Building> {
+        logger.debug("buildingQuery =${request.toJson()}")
+        return BuildingService.pageQuery(request, arrayListOf(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString())))
+    } // Function query()
+
+    /**
+     * 根据条件查询统计数量
+     */
+    @ApiOperation(value = "根据条件查询统计数量", notes = "")
+    @PostMapping(value = ["/count"])
+    fun count(@RequestBody request: SCountRequest): SCountResponse {
+        val withFilterList = ArrayList<SFilter>()
+        withFilterList.add(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString()))
+
+        /** 服务 */
+        val dictRentalservice = SObjectService(SMybatisDao(DictDatacenterProjectcustom::class.java))
+        try {
+            val exec = dictRentalservice.selectAll().exec()
+
+            System.out.println("打印测试=${exec.toJson()}")
+
+            val manager = ScriptEngineManager()
+            val engine = manager.getEngineByName("javascript")
+            try {
+                engine.eval("function transform(variable){\n" +
+                        "const  obj = JSON.parse(variable)"+
+                        "if(variable == '4'){\n" +
+                        "    return true;\n" +
+                        "}else {\n" +
+                        "    return false\n" +
+                        "  }\n" +
+                        "}")
+                if (engine is Invocable) {
+                    val `in` = engine as Invocable
+                    if (`in`.invokeFunction("transform", "20") as Boolean){
+                        System.out.println("有")
+                    }else{
+                        System.out.println("没有")
+                    }
+
+                }
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return BuildingService.count(request,withFilterList)
+    } // Function count()
+
+} // Class BuildingController

+ 122 - 0
data-center/src/main/kotlin/com/persagy/server/controllers/objects/ComponentController.kt

@@ -0,0 +1,122 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.controllers.objects
+
+import com.persagy.server.datacenter.models.entities.objects.Equipment
+import com.persagy.server.services.objects.ComponentService
+import com.sybotan.base.extensions.toJson
+import com.sybotan.database.SFilter
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.requests.SCountRequest
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.requests.SQueryRequest
+import com.sybotan.service.models.requests.SUpdateRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCountResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import com.sybotan.service.models.responses.SQueryResponse
+import io.swagger.annotations.Api
+import io.swagger.annotations.ApiOperation
+import org.slf4j.LoggerFactory
+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
+
+/**
+ * 部件接口
+ *
+ * @author 张维新
+ */
+@Api(tags = ["AE、部件"])
+@RestController
+@RequestMapping("/object/component")
+open class ComponentController {
+    companion object {
+        /** 日志 */
+        private val logger = LoggerFactory.getLogger(ComponentController::class.java)
+    } // Companion object
+
+    /**
+     * 批量创建部件
+     *
+     * @param   request     部件对象列表
+     * @return                    创建结果信息
+     */
+    @ApiOperation(value = "创建部件信息", notes = "")
+    @PostMapping(value = ["/create"])
+    fun create(@RequestBody request: SCreateRequest<Equipment>): SCreateResponse<Equipment> {
+        logger.debug("equip =${request.toJson()}")
+        return ComponentService.createList(request)
+    } // Function create()
+
+    /**
+     * 根据id删除部件
+     *
+     * @param   idList      id数组
+     * @return              删除的结果信息
+     */
+    @ApiOperation(value = "根据id删除部件信息", notes = "")
+    @PostMapping(value = ["/delete"])
+    fun delete(@RequestBody idList: ArrayList<Equipment>): SBaseResponse {
+        return ComponentService.deleteByKeysList(idList)
+    } // Function delete()
+
+    /**
+     * 更新部件信息
+     *
+     * @param   request        更新的内容对象
+     * @return                  更新的结果
+     */
+    @ApiOperation(value = "更新部件信息", notes = "")
+    @PostMapping(value = ["/update"])
+    fun update(@RequestBody request: SUpdateRequest<Equipment>): SBaseResponse {
+        logger.debug("equipUpdate =${request.toJson()}")
+        return ComponentService.updateList(request)
+    } // Function update()
+
+    /**
+     * 查询部件信息
+     *
+     * @param   request     查询信息条件
+     * @return              查询结果
+     */
+    @ApiOperation(value = "查询部件信息", notes = "")
+    @PostMapping(value = ["/query"])
+    fun query(@RequestBody request: SQueryRequest): SQueryResponse<Equipment> {
+        logger.debug("equipQuery =${request.toJson()}")
+        val withFilterList = ArrayList<SFilter>()
+        withFilterList.add(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString()))
+        return ComponentService.pageQuery(request,withFilterList)
+    } // Function query()
+
+    /**
+     * 根据条件查询统计数量
+     */
+    @ApiOperation(value = "根据条件查询统计数量", notes = "例子: 已经关联岗位的资产数量(\"Filters\": \" not EquipId isNull\"),未关联岗位的资产数量(\"Filters\": \" EquipId isNull\")")
+    @PostMapping(value = ["/count"])
+    fun count(@RequestBody request: SCountRequest): SCountResponse {
+        val withFilterList = ArrayList<SFilter>()
+        withFilterList.add(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString()))
+        return ComponentService.count(request,withFilterList)
+    } // Function count()
+
+} // Class EquipController

+ 159 - 0
data-center/src/main/kotlin/com/persagy/server/controllers/objects/EquipController.kt

@@ -0,0 +1,159 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.controllers.objects
+
+import com.persagy.server.datacenter.models.entities.objects.Equipment
+import com.persagy.server.services.objects.EquipmentService
+import com.sybotan.base.extensions.toJson
+import com.sybotan.database.SFilter
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.requests.SCountRequest
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.requests.SQueryRequest
+import com.sybotan.service.models.requests.SUpdateRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCountResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import com.sybotan.service.models.responses.SQueryResponse
+import io.swagger.annotations.Api
+import io.swagger.annotations.ApiOperation
+import org.slf4j.LoggerFactory
+import org.springframework.web.bind.annotation.*
+
+/**
+ * 设备接口
+ *
+ * @author 张维新
+ */
+@Api(tags = ["AD、设备"])
+@RestController
+@RequestMapping("/object/equip")
+open class EquipController {
+
+    companion object {
+        /** 日志 */
+        private val logger = LoggerFactory.getLogger(EquipController::class.java)
+    } // Companion object
+
+    /**
+     * 创建设备
+     *
+     * @param   request         设备对象
+     * @return                  创建结果信息
+     */
+    @ApiOperation(value = "创建设备信息", notes = "")
+    @PostMapping(value = ["/create"])
+    fun create(@RequestBody request: SCreateRequest<Equipment>): SCreateResponse<Equipment> {
+        logger.debug("equip =${request.toJson()}")
+        return EquipmentService.createList(request)
+    } // Function create()
+
+    /**
+     * 根据id删除设备
+     *
+     * @param   idList      id数组
+     * @return              删除的结果信息
+     */
+    @ApiOperation(value = "根据id删除设备信息", notes = "")
+    @PostMapping(value = ["/delete"])
+    fun delete(@RequestBody idList: ArrayList<Equipment>): SBaseResponse {
+        return EquipmentService.deleteByKeysList(idList)
+    } // Function delete()
+
+    /**
+     * 更新设备信息
+     *
+     * @param   request        更新的内容对象
+     * @return                  更新的结果
+     */
+    @ApiOperation(value = "更新设备信息", notes = "")
+    @PostMapping(value = ["/update"])
+    fun update(@RequestBody request: SUpdateRequest<Equipment>): SBaseResponse {
+        logger.debug("equipUpdate =${request.toJson()}")
+        return EquipmentService.updateList(request)
+    } // Function update()
+
+    /**
+     * 查询设备信息
+     *
+     * @param   request     查询信息条件
+     * @return              查询结果
+     */
+    @ApiOperation(value = "查询设备信息", notes = " 可以级联的对象:资产(property)、楼层(floor)、建筑(building)、项目(project)、设备类(equipCategory)、设备服务的业务空间(zoneSpaceForBase)、设备所在的业务空间(zoneSpaceInBase)、设备所在的竖井(shaftList)  级联查询时子对象过滤时必须指定id否则无法定位对象,级联查询例子:{\n" +
+            "  \"Cascade\": [\n" +
+            "    {\n" +
+            "      \"Name\": \"property\",\n" +
+            "      \"Projection\": [\n" +
+            "        \"Family\",\"EquipLocalName\",\"EquipLocalID\",\"EquipID\",\"CodeType\"\n" +
+            "      ]\n" +
+            "    },\n" +
+            "    {\n" +
+            "      \"Name\": \"building\",\n" +
+            "      \"Projection\": [\n" +
+            "        \"BuildLocalName\",\"BuildName\",\"BuildID\"\n" +
+            "      ]\n" +
+            "    },\n" +
+            " {\n" +
+            "      \"Name\": \"floor\",\n" +
+            "      \"Projection\": [\n" +
+            "        \"FloorLocalName\",\"FloorName\",\"FloorID\"\n" +
+            "      ]\n" +
+            "    }\n" +
+            "  ],\n" +
+            "  \"Filters\": \" not propertyId isnull \",\n" +
+            "  \"PageNumber\": 1,\n" +
+            "  \"PageSize\": 50,\n" +
+            "  \"Projection\": [\n" +
+            "    \"BuildingId\",\"FloorId\",\"Category\",\"EquipLocalName\",\"EquipLocalID\",\"EquipID\",\"BIMID\"\n" +
+            "  ]\n" +
+            "}")
+    @PostMapping(value = ["/query"])
+    fun query(@RequestBody request: SQueryRequest): SQueryResponse<Equipment> {
+        logger.debug("equipQuery =${request.toJson()}")
+        val withFilterList = ArrayList<SFilter>()
+        withFilterList.add(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString()))
+        return EquipmentService.pageQuery(request, withFilterList)
+    } // Function query()
+
+    /**
+     * 根据条件查询统计数量
+     */
+    @ApiOperation(value = "根据条件查询统计数量", notes = "例子: 根据设备类型查询(\"Filters\": \"category ='SISU'\")," +
+            "根据设备类型和建筑查询(\"Filters\": \"category ='FASE';buildingId = '建筑id'\")," +
+            "根据设备类型和建筑楼层查询(\"Filters\": \"category ='FASE';buildingId = '建筑id';floorId = '楼层id'\")")
+    @PostMapping(value = ["/count"])
+    fun count(@RequestBody request: SCountRequest): SCountResponse {
+        val withFilterList = ArrayList<SFilter>()
+        withFilterList.add(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString()))
+        return EquipmentService.count(request, withFilterList)
+    } // Function count()
+
+    /**
+     * 根据项目id查询所有的设备和部件
+     */
+    @ApiOperation(value = "根据项目id查询所有的设备和部件", notes = "")
+    @GetMapping(value = ["/query-equip"])
+    fun queryEquipCom(): SQueryResponse<Equipment>  {
+        return EquipmentService.queryEquipCom()
+    } // Function count()
+
+
+} // Class EquipController

+ 147 - 0
data-center/src/main/kotlin/com/persagy/server/controllers/objects/FloorController.kt

@@ -0,0 +1,147 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.controllers.objects
+
+import com.persagy.server.datacenter.models.entities.objects.Floor
+import com.persagy.server.services.objects.FloorService
+import com.sybotan.base.extensions.toJson
+import com.sybotan.database.SFilter
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.requests.SQueryRequest
+import com.sybotan.service.models.requests.SUpdateRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import com.sybotan.service.models.responses.SQueryResponse
+import io.swagger.annotations.Api
+import io.swagger.annotations.ApiOperation
+import org.slf4j.LoggerFactory
+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
+
+/**
+ * 楼层接口
+ *
+ * @author 张维新
+ */
+@Api(tags = ["AC、楼层"])
+@RestController
+@RequestMapping("/object/floor")
+open class FloorController {
+    companion object {
+        // 日志
+        private val logger = LoggerFactory.getLogger(FloorController::class.java)
+    } // Companion object
+
+    /**
+     * 创建楼层
+     *
+     * @param   request     楼层对象
+     * @return              创建结果信息
+     */
+    @ApiOperation(value = "创建楼层", notes = "")
+    @PostMapping(value = ["/create"])
+    fun create(@RequestBody request: SCreateRequest<Floor>): SCreateResponse<Floor> {
+        logger.debug("floor =${request.toJson()}")
+        return FloorService.createList(request)
+    } // Function create()
+
+    /**
+     * 根据id删除楼层
+     *
+     * @param   idList  id数组
+     * @return          删除的结果信息
+     */
+    @ApiOperation(value = "根据id删除楼层", notes = "")
+    @PostMapping(value = ["/delete"])
+    fun delete(@RequestBody idList: ArrayList<Floor>): SBaseResponse {
+        return FloorService.deleteByKeysList( idList)
+    } // Function delete()
+
+    /**
+     * 更新楼层信息
+     *
+     *
+     * @param   request     更新的内容对象
+     * @return              更新的结果
+     */
+    @ApiOperation(value = "更新楼层信息", notes = "")
+    @PostMapping(value = ["/update"])
+    fun update(@RequestBody request: SUpdateRequest<Floor>): SBaseResponse {
+        logger.debug("floorUpdate =${request.toJson()}")
+        return FloorService.updateList(request)
+    } // Function update()
+
+    /**
+     * 更新楼层信息-Outline
+     *
+     *
+     * @param   request     更新楼层信息-Outline
+     * @return              更新的结果
+     */
+    @ApiOperation(value = "更新楼层信息-Outline", notes = "")
+    @PostMapping(value = ["/update-outline"])
+    fun updateOutlines(@RequestBody request: SUpdateRequest<Floor>): SBaseResponse {
+        logger.debug("floorUpdate =${request.toJson()}")
+        return FloorService.updateOutline(request)
+    } // Function update()
+
+    /**
+     * 查询楼层信息
+     *
+     * @param   request     查询信息条件
+     * @return              查询结果
+     */
+    @ApiOperation(value = "查询楼层信息", notes = "级联对象:建筑(building)、项目(project)、楼层贯通关系(floorThroughList)")
+    @PostMapping(value = ["/query-outline"])
+    fun queryOutline(@RequestBody request: SQueryRequest): SQueryResponse<Floor> {
+        logger.debug("floorQuery =${request.toJson()}")
+        if (!request.projection.isNullOrEmpty()){
+            request.projection!!.clear()
+        }
+        val list = ArrayList<String>()
+        list.add("FloorID")
+        list.add("FloorName")
+        list.add("FloorLocalID")
+        list.add("FloorLocalName")
+        list.add("Outline")
+        list.add("StructureInfo")
+        list.add("ModelId")
+        request.projection = list
+        return FloorService.pageQuery(request, arrayListOf(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString())))
+    } // Function query()
+
+
+    /**
+     * 查询楼层信息
+     *
+     * @param   request     查询信息条件
+     * @return              查询结果
+     */
+    @ApiOperation(value = "查询楼层信息", notes = "级联对象:建筑(building)、项目(project)、楼层贯通关系(floorThroughList)")
+    @PostMapping(value = ["/query"])
+    fun query(@RequestBody request: SQueryRequest): SQueryResponse<Floor> {
+        logger.debug("floorQuery =${request.toJson()}")
+        return FloorService.pageQuery(request, arrayListOf(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString())))
+    } // Function query()
+} // Class FloorController

+ 210 - 0
data-center/src/main/kotlin/com/persagy/server/controllers/objects/GeneralSystemController.kt

@@ -0,0 +1,210 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.controllers.objects
+
+import com.persagy.server.datacenter.models.entities.objects.Equipment
+import com.persagy.server.datacenter.models.entities.objects.GeneralSystem
+import com.persagy.server.datacenter.models.entities.objects.Shaft
+import com.persagy.server.datacenter.models.entities.objects.ZoneSpace
+import com.persagy.server.datacenter.models.entities.rel.RSyEq
+import com.persagy.server.datacenter.models.entities.rel.RSyEqList
+import com.persagy.server.services.objects.GeneralSystemService
+import com.sybotan.base.extensions.toJson
+import com.sybotan.database.SFilter
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.requests.SCountRequest
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.requests.SQueryRequest
+import com.sybotan.service.models.requests.SUpdateRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCountResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import com.sybotan.service.models.responses.SQueryResponse
+import io.swagger.annotations.Api
+import io.swagger.annotations.ApiOperation
+import org.slf4j.LoggerFactory
+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
+
+/**
+ * 系统接口
+ *
+ * @author 张维新
+ */
+@Api(tags= ["AI、系统"])
+@RestController
+@RequestMapping("/object/general-system")
+open class GeneralSystemController {
+    companion object {
+        // 日志
+        private val logger = LoggerFactory.getLogger(GeneralSystemController::class.java)
+    } // Companion object
+
+    /**
+     * 创建系统信息
+     *
+     * @param   request         系统对象
+     * @return  SCreateResponse 创建结果信息
+     */
+    @ApiOperation(value="创建系统信息", notes="")
+    @PostMapping(value = ["/create"])
+    fun create(@RequestBody request: SCreateRequest<GeneralSystem>): SCreateResponse<GeneralSystem> {
+        logger.debug("generalSystem =${request.toJson()}")
+      return  GeneralSystemService.createList(request)
+    } // Function create()
+
+    @ApiOperation(value="创建系统信息-处理建筑楼层", notes="")
+    @PostMapping(value = ["/create-bd-fl"])
+    fun createBdFl(@RequestBody request: SCreateRequest<GeneralSystem>): SCreateResponse<GeneralSystem> {
+        logger.debug("generalSystem =${request.toJson()}")
+        return  GeneralSystemService.createBdFl(request)
+    } // Function create()
+
+    /**
+     * 根据id删除系统
+     *
+     * @param   idList           项目id
+     * @param   idList              id数组
+     * @return  SDeleteResponse()   删除的结果信息
+     */
+    @ApiOperation(value="根据id删除系统", notes="")
+    @PostMapping(value = ["/delete"])
+    fun delete(@RequestBody idList: ArrayList<GeneralSystem>): SBaseResponse {
+       return GeneralSystemService.deleteByKeysList(idList)
+    } // Function delete()
+
+    /**
+     * 更新系统信息
+     *
+     * @param   request             更新的内容对象
+     * @return  SUpdateResponse()   更新的结果
+     */
+    @ApiOperation(value="更新系统信息", notes="")
+    @PostMapping(value = ["/update"])
+    fun update(@RequestBody request: SUpdateRequest<GeneralSystem>): SBaseResponse {
+        logger.debug("generalSystemUpdate =${request.toJson()}")
+       return  GeneralSystemService.updateList(request)
+    } // Function update()
+
+    /**
+     * 查询系统信息
+     *
+     * @param   request         查询信息条件
+     * @return  SQueryResponse  查询结果
+     */
+    @ApiOperation(value="查询系统信息", notes="MajorName 专业名称 ,级联查询 系统分类名(categoryNames),系统下的设备(equipmentList),系统下的竖井(shaftList),业务空间(zoneSpaceBaseTableList)")
+    @PostMapping(value = ["/query"])
+    fun query(@RequestBody request: SQueryRequest): SQueryResponse<GeneralSystem> {
+        logger.debug("generalSystemQuery =${request.toJson()}")
+        val withFilterList = ArrayList<SFilter>()
+        withFilterList.add(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString()))
+       return GeneralSystemService.pageQuery(request,withFilterList)
+    } // Function query()
+
+
+    /**
+     * 查询系统信息
+     *
+     * @param   request         查询信息条件
+     * @return  SQueryResponse  查询结果
+     */
+    @ApiOperation(value="查询系统信息-系统建筑楼层一对多", notes="MajorName 专业名称 ,级联查询 系统分类名(categoryNames),系统下的设备(equipmentList),系统下的竖井(shaftList),业务空间(zoneSpaceBaseTableList)")
+    @PostMapping(value = ["/query-new"])
+    fun query(buildingId: String?, floorId: String?, @RequestBody request: SQueryRequest): SQueryResponse<GeneralSystem> {
+        logger.debug("generalSystemQuery =${request.toJson()}")
+        return GeneralSystemService.pageQuerys(buildingId, floorId, request)
+    } // Function query()
+
+
+    /**
+     * 根据条件查询统计数量
+     */
+    @ApiOperation(value = "根据条件查询统计数量", notes = "例子: 根据类型查询(\"Filters\": \"category ='系统分类'\")," +
+            "根据设备类型和建筑查询(\"Filters\": \"category ='FASE';buildingId = '建筑id'\")," +
+            "根据设备类型和建筑楼层查询(\"Filters\": \"category ='FASE';buildingId = '建筑id';floorId = '楼层id'\")")
+    @PostMapping(value = ["/count"])
+    fun count(@RequestBody request: SCountRequest): SCountResponse {
+        val withFilterList = ArrayList<SFilter>()
+        withFilterList.add(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString()))
+        return GeneralSystemService.count(request,withFilterList)
+    } // Function count()
+
+    /**
+     * 查询没有和当前空间绑定的系统
+     *
+     * @param   type        空间类型
+     * @param   spaceId     空间id
+     */
+    @ApiOperation(value="查询没有和当前空间绑定的系统", notes="例如:prijectId=Pj4201050001,type=AirConditioningZone spaceId=Sp4201050001df2091cdf719443b80bb737aeabf0525 " +
+            "spaceId 为当前空间id type为当前空间类型 ")
+    @PostMapping(value = ["/unspace-sys"])
+    fun unSpaceSys( type: String, spaceId: String,@RequestBody request: SQueryRequest): SQueryResponse<GeneralSystem>{
+        return GeneralSystemService.unSpaceSys(type,spaceId, request)
+    } // // Function unSpaceSys()
+
+    /**
+     * 查询没有和当前系统关联的设备
+     *
+     * @param   sysId        系统id
+     */
+    @ApiOperation(value="查询没有和当前系统关联的设备", notes="sysId 为系统id")
+    @PostMapping(value = ["/un-sys-equip"])
+    fun unSysEquip( sysId: String,@RequestBody request: SQueryRequest): SQueryResponse<Equipment>{
+        return GeneralSystemService.unSysEquip(sysId, request)
+    } // Fun unSysEquip()
+
+    /**
+     * 查询没有和当前系统关联的竖井
+     *
+     * @param   sysId        系统id
+     */
+    @ApiOperation(value="查询没有和当前系统关联的竖井", notes="sysId 为系统id")
+    @PostMapping(value = ["/un-sys-shaft"])
+    fun unSysShaft( sysId: String,@RequestBody request: SQueryRequest): SQueryResponse<Shaft>{
+        return GeneralSystemService.unSysShaft(sysId, request)
+    } //  Fun unSysShaft()
+
+    /**
+     * 查询没有和当前系统关联的业务空间
+     *
+     * @param   sysId        系统id
+     */
+    @ApiOperation(value="查询没有和当前系统关联的业务空间", notes="sysId 为系统id")
+    @PostMapping(value = ["/un-sys-zoneSpaceBaseTable"])
+    fun unSysZoneSpaceBaseTable( sysId: String,@RequestBody request: SQueryRequest): SQueryResponse<ZoneSpace>{
+        return GeneralSystemService.unSysZoneSpaceBaseTable(sysId, request)
+    } // Fun unSysZoneSpaceBaseTable()
+
+    /**
+     * 创建系统下的设备关系
+     */
+    @ApiOperation(value = "创建系统下的设备关系", notes = "必填项:ListEquipId(设备id列表)、SysId(系统id)")
+    @PostMapping(value = ["/link-equip"])
+    fun createLinkEquip(@RequestBody rSyEqList: RSyEqList): SCreateResponse<RSyEq> {
+        logger.debug("rSyEqList =${rSyEqList.toJson()}")
+        return GeneralSystemService.createLinkEquip(rSyEqList)
+    } // Function create()
+
+//    RSyInShList
+//    RSyInSpBaseList
+} // Class GeneralSystemController

+ 105 - 0
data-center/src/main/kotlin/com/persagy/server/controllers/objects/ISpaceController.kt

@@ -0,0 +1,105 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.controllers.objects
+
+import com.persagy.server.datacenter.models.entities.objects.ZoneIspace
+import com.persagy.server.datacenter.models.requests.DCSQueryRequest
+import com.persagy.server.services.objects.SpaceService
+import com.sybotan.base.extensions.toJson
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.requests.SUpdateRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import com.sybotan.service.models.responses.SQueryResponse
+import io.swagger.annotations.Api
+import io.swagger.annotations.ApiOperation
+import org.slf4j.LoggerFactory
+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
+
+/**
+ * 元空间接口
+ *
+ * @author 张维新
+ */
+@Api(tags = ["AJ、模型空间"])
+@RestController
+@RequestMapping("/object/ispace")
+open class ISpaceController {
+    companion object {
+        /** 日志 */
+        private val logger = LoggerFactory.getLogger(ISpaceController::class.java)
+    } // Companion object
+
+    /**
+     * 创建元空间
+     *
+     * @param   request     元空间对象
+     * @return              创建结果信息
+     */
+    @ApiOperation(value = "创建元空间", notes = "")
+    @PostMapping(value = ["/create"])
+    fun create(@RequestBody request: SCreateRequest<ZoneIspace>): SCreateResponse<ZoneIspace> {
+        logger.debug("space =${request.toJson()}")
+        return SpaceService.createList(request)
+    } // Function create()
+
+    /**
+     * 根据id删除元空间
+     *
+     * @param   idList      id数组
+     * @return              删除的结果信息
+     */
+    @ApiOperation(value = "根据id删除元空间", notes = "")
+    @PostMapping(value = ["/delete"])
+    fun delete(@RequestBody idList: ArrayList<ZoneIspace>): SBaseResponse {
+        return SpaceService.deleteByKeysList(idList)
+    } // Function delete()
+
+    /**
+     * 更新元空间信息
+     *
+     * @param   request     更新的内容对象
+     * @return              更新的结果
+     */
+    @ApiOperation(value = "更新元空间信息", notes = "")
+    @PostMapping(value = ["/update"])
+    fun update(@RequestBody request: SUpdateRequest<ZoneIspace>): SBaseResponse {
+        logger.debug("spaceUpdate =${request.toJson()}")
+        return SpaceService.updateList(request)
+    } // Function update()
+
+    /**
+     * 查询元空间信息
+     *
+     * @param   request     查询信息条件
+     * @return              查询结果
+     */
+    @ApiOperation(value = "查询元空间信息", notes = "")
+    @PostMapping(value = ["/query"])
+    fun query(@RequestBody request: DCSQueryRequest): SQueryResponse<ZoneIspace> {
+        logger.debug("spaceQuery =${request.toJson()}")
+        return SpaceService.queryIspace(request)
+    } // Function query()
+
+} // Class ISpaceController

+ 130 - 0
data-center/src/main/kotlin/com/persagy/server/controllers/objects/LocationPointController.kt

@@ -0,0 +1,130 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.controllers.objects
+
+import com.persagy.server.datacenter.models.entities.assistant.PointImage
+import com.persagy.server.datacenter.models.entities.objects.LocationPoint
+import com.persagy.server.services.objects.LocationPointServices
+import com.sybotan.base.extensions.toJson
+import com.sybotan.database.SFilter
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.requests.SCountRequest
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.requests.SQueryRequest
+import com.sybotan.service.models.requests.SUpdateRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCountResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import com.sybotan.service.models.responses.SQueryResponse
+import io.swagger.annotations.Api
+import io.swagger.annotations.ApiOperation
+import org.slf4j.LoggerFactory
+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
+
+/**
+ * 点位标签信息接口
+ *
+ * @author 付国宝
+ */
+@Api(tags = ["AL、点位标签信息"])
+@RestController
+@RequestMapping("/object/location-point")
+open class LocationPointController {
+    companion object {
+        // 日志
+        private val logger = LoggerFactory.getLogger(LocationPointController::class.java)
+    } // Companion object
+
+    /**
+     * 批量创建点位标签信息
+     *
+     * @param   request      点位标签信息对象列表
+     * @return                  创建结果信息
+     */
+    @ApiOperation(value = "创建点位标签信息", notes = "")
+    @PostMapping(value = ["/create"])
+    fun create(@RequestBody request: SCreateRequest<LocationPoint>): SCreateResponse<LocationPoint> {
+        logger.debug("building =${request.toJson()}")
+        return LocationPointServices.createList(request)
+    } // Function create()
+
+    /**
+     * 根据id删除点位标签信息
+     *
+     * @param   entityList      点位标签信息数组
+     * @return                  删除的结果信息
+     */
+    @ApiOperation(value = "批量删除点位标签信息", notes = "")
+    @PostMapping(value = ["/delete"])
+    fun delete(@RequestBody entityList: ArrayList<LocationPoint>): SBaseResponse {
+        return LocationPointServices.deleteByKeysList(entityList)
+    } // Function delete()
+
+    /**
+     * 更新点位标签信息
+     *
+     * @param   request     更新的内容对象
+     * @return              更新的结果
+     */
+    @ApiOperation(value = "更新位标签信息", notes = "")
+    @PostMapping(value = ["/update"])
+    fun update(@RequestBody request: SUpdateRequest<LocationPoint>): SBaseResponse {
+        return LocationPointServices.updateList(request)
+    } // Function update()
+
+    /**
+     * 查询点位标签信息
+     *
+     * @param   request     查询信息条件
+     * @return              查询结果
+     */
+    @ApiOperation(value = "查询点位标签信息", notes = "级联查询:点位的图片imageList")
+    @PostMapping(value = ["/query"])
+    fun query(@RequestBody request: SQueryRequest): SQueryResponse<LocationPoint> {
+        return LocationPointServices.pageQuery(request,arrayListOf(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString())))
+    } // Function query()
+
+    /**
+     * 根据条件查询统计数量
+     */
+    @ApiOperation(value = "根据条件查询统计数量", notes = "")
+    @PostMapping(value = ["/count"])
+    fun count(@RequestBody request: SCountRequest): SCountResponse {
+        return LocationPointServices.count(request)
+    } // Function count()
+
+    /**
+     * 删除点位照片
+     *
+     * @param   entityList      点位标签照片列表
+     * @return                  删除的结果信息
+     */
+    @ApiOperation(value = "删除点位照片", notes = "")
+    @PostMapping(value = ["/delete-image"])
+    fun deleteImage(@RequestBody entityList: ArrayList<PointImage>): SBaseResponse {
+        return LocationPointServices.pointImageService.deleteByKeysList(entityList)
+    } // Function delete()
+
+
+} // Class LocationPointController

+ 110 - 0
data-center/src/main/kotlin/com/persagy/server/controllers/objects/ProjectController.kt

@@ -0,0 +1,110 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.controllers.objects
+
+import com.persagy.server.datacenter.models.entities.objects.Project
+import com.persagy.server.services.objects.ProjectService
+import com.sybotan.database.SFilter
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.requests.SQueryRequest
+import com.sybotan.service.models.responses.SQueryResponse
+import io.swagger.annotations.Api
+import io.swagger.annotations.ApiOperation
+import org.slf4j.LoggerFactory
+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
+
+/**
+ * 项目接口
+ *
+ * @author 张维新
+ */
+@RestController
+@RequestMapping("/object/project")
+@Api(tags = ["AA、项目"])
+//@ApiIgnore
+private open class ProjectController {
+    companion object {
+        /** 日志 */
+        private val logger = LoggerFactory.getLogger(ProjectController::class.java)
+    } // Companion object
+
+//    /**
+//     * 创建项目
+//     *
+//     * @param   code        城市编码
+//     * @param   password    项目密码
+//     * @param   project     项目对象
+//     * @return              创建结果信息
+//     */
+//    @ApiOperation(value = "创建项目", notes = "")
+//    @PostMapping(value = ["/create"])
+//    fun create(code: String?, password: String, @RequestBody project: Project): SCreateResponse {
+//        logger.debug("project =${project.toJson()}")
+//        return ProjectService.create(code, password, project,messageHandler)
+//    } // Function create()
+
+//    /**
+//     * 根据id删除项目
+//     *
+//     * @param   idList      id数组
+//     * @return              删除的结果信息
+//     */
+//    @ApiOperation(value = "根据id删除项目", notes = "")
+//    @PostMapping(value = ["/delete"])
+//    fun delete(@RequestBody idList: ArrayList<String>): SDeleteResponse {
+//        return ProjectService.delete(idList,messageHandler)
+//    } // Function delete()
+
+//    /**
+//     * 更新项目信息
+//     *
+//     * @param   request     更新的内容对象
+//     * @return              更新的结果
+//     */
+//    @ApiOperation(value = "更新项目信息", notes = "")
+//    @PostMapping(value = ["/update"])
+//    fun update(@RequestBody request: SUpdateRequest<Project>): SUpdateResponse {
+//        logger.debug("ProjectUpdate =${request.toJson()}")
+//        return ProjectService.update(request, messageHandler)
+//    } // Function update()
+
+    /**
+     * 查询项目信息
+     *
+     * @param   request     查询信息条件
+     * @return              查询结果
+     */
+    @ApiOperation(value = "查询项目信息", notes = "")
+    @PostMapping(value = ["/query"])
+    fun query(@RequestBody request: SQueryRequest): SQueryResponse<Project> {
+//        logger.debug("projectQuery =${request.toJson()}")
+        val projectId = SPageContext.getHeader("ProjectId")
+        if (projectId.isNullOrEmpty()){
+            return ProjectService.pageQuery(request)
+        }else{
+            return ProjectService.pageQuery(request, arrayListOf(SFilter.eq("id",projectId)))
+        }
+    } // Function query()
+
+} // Class ProjectController

+ 119 - 0
data-center/src/main/kotlin/com/persagy/server/controllers/objects/PropertyController.kt

@@ -0,0 +1,119 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.controllers.objects
+
+import com.persagy.server.datacenter.models.entities.objects.Property
+import com.persagy.server.services.objects.PropertyService
+import com.sybotan.database.SFilter
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.requests.SCountRequest
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.requests.SQueryRequest
+import com.sybotan.service.models.requests.SUpdateRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCountResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import com.sybotan.service.models.responses.SQueryResponse
+import io.swagger.annotations.Api
+import io.swagger.annotations.ApiOperation
+import org.slf4j.LoggerFactory
+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
+
+/**
+ * 资产接口
+ *
+ * @author 张维新
+ */
+@Api(tags = ["AK、资产"],position = 1)
+@RestController
+@RequestMapping("/object/property")
+open class PropertyController {
+    companion object {
+        /** 日志 */
+        private val logger = LoggerFactory.getLogger(PropertyController::class.java)
+    } // Companion object
+
+    /**
+     * 创建资产
+     *
+     * @param   request        资产对象列表
+     * @return                 创建结果信息
+     */
+    @ApiOperation(value = "创建资产信息", notes = "")
+    @PostMapping(value = ["/create"])
+    fun create(@RequestBody request: SCreateRequest<Property>): SCreateResponse<Property> {
+        return PropertyService.createList( request)
+    } // Function create()
+
+    /**
+     * 根据id删除资产
+     *
+     * @param   idList      id数组
+     * @return              删除的结果信息
+     */
+    @ApiOperation(value = "根据id删除资产信息", notes = "")
+    @PostMapping(value = ["/delete"])
+    fun delete(@RequestBody idList: ArrayList<Property>): SBaseResponse {
+        return PropertyService.deleteByKeysList(idList)
+    } // Function delete()
+
+    /**
+     * 更新资产信息
+     *
+     * @param   request     更新的内容对象
+     * @return              更新的结果
+     */
+    @ApiOperation(value = "更新资产信息", notes = "")
+    @PostMapping(value = ["/update"])
+    fun update(@RequestBody request: SUpdateRequest<Property>): SBaseResponse {
+        return PropertyService.updateList(request)
+    } // Function update()
+
+    /**
+     * 查询资产信息
+     *
+     * @param   request     查询信息条件
+     * @return              查询结果
+     */
+    @ApiOperation(value = "查询资产信息", notes = "级联查询对象:项目(project)、建筑(building)、楼层(floor)、设备(equipment)、设备族(equipFamilyList)、设备族名称(familyName)")
+    @PostMapping(value = ["/query"])
+    fun query(@RequestBody request: SQueryRequest): SQueryResponse<Property> {
+        val withFilterList = ArrayList<SFilter>()
+        withFilterList.add(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString()))
+        return PropertyService.pageQuery(request,withFilterList)
+    } // Function query()
+
+    /**
+     * 根据条件查询统计数量
+     */
+    @ApiOperation(value = "根据条件查询统计数量", notes = "例子: 已经关联岗位的资产数量(\"Filters\": \" not EquipId isNull\")," +
+            "未关联岗位的资产数量(\"Filters\": \" EquipId isNull\")")
+    @PostMapping(value = ["/count"])
+    fun count(@RequestBody request: SCountRequest): SCountResponse {
+        val withFilterList = ArrayList<SFilter>()
+        withFilterList.add(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString()))
+        return PropertyService.count(request,withFilterList)
+    } // Function count()
+
+} // Class AssetsController

+ 228 - 0
data-center/src/main/kotlin/com/persagy/server/controllers/objects/ShaftController.kt

@@ -0,0 +1,228 @@
+package com.persagy.server.controllers.objects
+
+import cn.sagacloud.server.synchronize.MessageHandler
+import com.persagy.server.datacenter.models.entities.assistant.ShaftFuncType
+import com.persagy.server.datacenter.models.entities.assistant.ShaftWithCount
+import com.persagy.server.datacenter.models.entities.objects.Shaft
+import com.persagy.server.datacenter.models.entities.objects.ZoneSpace
+import com.persagy.server.datacenter.models.entities.rel.RelationSpaceShaft
+import com.persagy.server.datacenter.models.entities.task.BuildingDic
+import com.persagy.server.services.objects.ShaftService
+import com.sybotan.base.extensions.toJson
+import com.sybotan.database.SFilter
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.requests.SCountRequest
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.requests.SQueryRequest
+import com.sybotan.service.models.requests.SUpdateRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCountResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import com.sybotan.service.models.responses.SQueryResponse
+import io.swagger.annotations.Api
+import io.swagger.annotations.ApiOperation
+import org.slf4j.LoggerFactory
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.web.bind.annotation.*
+
+/**
+ * 竖井接口
+ *
+ * @author 张维新
+ */
+@Api(tags = ["AG、竖井"])
+@RestController
+@RequestMapping("/object/shaft")
+class ShaftController {
+    companion object {
+        // 日志
+        private val logger = LoggerFactory.getLogger(ShaftController::class.java)
+    } // Companion object
+
+    /** 获取消息对象实例 */
+    @Autowired
+    val messageHandler: MessageHandler? = null
+
+    /**
+     * 创建竖井数据
+     *
+     * @param   request     竖井对象
+     * @return              创建结果信息
+     */
+    @ApiOperation(value = "创建竖井数据", notes = "")
+    @PostMapping(value = ["/create"])
+    fun create(@RequestBody request: SCreateRequest<Shaft>): SCreateResponse<Shaft> {
+        logger.debug("ShaftCreate =${request.toJson()}")
+        return ShaftService.createList(request)
+    } // Function Create()
+
+    /**
+     * 根据id删除竖井
+     *
+     * @param   idList      id数组
+     * @return              删除的结果信息
+     */
+    @ApiOperation(value = "根据id删除项目", notes = "")
+    @PostMapping(value = ["/delete"])
+    fun delete(@RequestBody idList: ArrayList<Shaft>): SBaseResponse {
+        return ShaftService.deleteByKeysList(idList)
+    } // Function delete()
+
+    /**
+     * 更新竖井信息
+     *
+     * @param   request     更新的内容对象
+     * @return              更新的结果
+     */
+    @ApiOperation(value = "更新竖井信息", notes = "")
+    @PostMapping(value = ["/update"])
+    fun update(@RequestBody request: SUpdateRequest<Shaft>): SBaseResponse {
+        logger.debug("ShaftUpdate =${request.toJson()}")
+        return ShaftService.updateList(request)
+    } // Function update()
+
+    /**
+     * 查询竖井信息
+     *
+     * @param   request     查询信息条件
+     * @return              查询结果
+     */
+    @ApiOperation(value = "查询竖井信息", notes = "级联查询:竖井内的设备(equipmentList)、竖井内的系统(systemList)、竖井联通关系(shaftThroughList)、竖井内的业务空间(spaceList)")
+    @PostMapping(value = ["/query"])
+    fun query(@RequestBody request: SQueryRequest): SQueryResponse<Shaft> {
+        logger.debug("ShaftQuery =${request.toJson()}")
+        return ShaftService.pageQuery(request, arrayListOf(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString())))
+    } // Function query()
+
+    /**
+     * 查询竖井信息-包含统计信息
+     *
+     * @param       request
+     * @return      竖井统计信息
+     */
+    @ApiOperation(value = "查询竖井信息-包含统计信息", notes = "此方法可能会弃用")
+    @PostMapping(value = ["/query-with-count"])
+    fun queryWithCount(@RequestBody request: SQueryRequest): SQueryResponse<ShaftWithCount> {
+        return ShaftService.queryWithCount(request)
+    } // Function queryWithCount()
+
+    /**
+     * 关联元空间
+     *
+     * @param       request   条件
+     * @return                关联反馈
+     */
+    @ApiOperation(value = "关联元空间", notes = "可能移至关系")
+    @PostMapping(value = ["/relate-space"])
+    fun relateSpace(@RequestBody request: RelationSpaceShaft): SBaseResponse {
+        return ShaftService.relateSpace(request, messageHandler)
+    } // Function relateSpace()
+
+    /**
+     * 查询竖井功能
+     *
+     * @return      竖井功能列表
+     */
+    @ApiOperation(value = "查询项目下已有胡竖井类型", notes = "此方法可能会弃用")
+    @PostMapping(value = ["/query-shaft-functype"])
+    fun queryShaftFuncType(): SQueryResponse<ShaftFuncType> {
+        return ShaftService.queryShaftFuncType()
+    } // Function queryShaftFuncType()
+
+//    @ApiOperation(value="查询没有和当前竖井贯通的其它竖井", notes="")
+//    @PostMapping(value = ["/unshaft-through-shaft"])
+//    fun  unShaftThroughShaft(shaftId: String,@RequestBody request: SQueryRequest): SQueryResponse<Shaft> {
+//        return ShaftService.unShaftThroughShaft(shaftId,request)
+//    } // Function unSpaceEq()
+
+    /**
+     * 查询和当前竖井有关联的业务空间
+     *
+     * @param   ShaftId        竖井id
+     * @param   request        查询条件
+     */
+    @ApiOperation(value="查询和当前竖井有关联的业务空间", notes="shaftId 为竖井id")
+    @PostMapping(value = ["/shaft-zoneSpaceBaseTable"])
+    fun shaftZoneSpaceBaseTable(ShaftId: String,@RequestBody request: SQueryRequest): SQueryResponse<ZoneSpace>{
+        return ShaftService.shaftZoneSpaceBaseTable(ShaftId, request)
+    } // Fun shaftZoneSpaceBaseTable()
+
+    /**
+     * 查询和当前竖井没有关联的业务空间
+     *
+     * @param   ShaftId        竖井id
+     * @param   request        查询条件
+     */
+    @ApiOperation(value="查询和当前竖井没有关联的业务空间", notes="shaftId 为竖井id")
+    @PostMapping(value = ["/un-shaft-zoneSpaceBaseTable"])
+    fun unShaftZoneSpaceBaseTable(ShaftId: String,@RequestBody request: SQueryRequest): SQueryResponse<ZoneSpace>{
+        return ShaftService.unShaftZoneSpaceBaseTable(ShaftId, request)
+    } // Fun shaftZoneSpaceBaseTable()
+
+
+    /**
+     * 查询和当前竖井有关联的业务空间所在建筑及楼层信息
+     *
+     * @param   ShaftId        竖井id
+     * @param   ObjectType     空间类型
+     */
+    @ApiOperation(value="查询和当前竖井有关联的业务空间所在建筑及楼层信息", notes="shaftId 为竖井id")
+    @GetMapping(value = ["/shaft-zoneSpaceBaseTable-building"])
+    fun shaftZoneSpaceBaseTableBuilding(ShaftId: String,ObjectType:String?): SQueryResponse<BuildingDic>{
+        return ShaftService.shaftZoneSpaceBaseTableBuilding(ShaftId,ObjectType)
+    } // Fun shaftZoneSpaceBaseTable()
+
+
+//    /**
+//     * 查询没有和当前竖井关联的设备
+//     *
+//     * @param   ShaftId        竖井id
+//     * @param   request        查询条件
+//     */
+//    @ApiOperation(value="查询没有和当前竖井关联的设备", notes="ShaftId 为竖井id")
+//    @PostMapping(value = ["/un-shaft-equip"])
+//    fun unShaftEquip( ShaftId: String,@RequestBody request: SQueryRequest): SQueryResponse<Equipment>{
+//        return ShaftService.unShaftEquip(ShaftId, request)
+//    } // Fun unShaftEquip()
+//
+//    /**
+//     * 查询没有和当前竖井关联的其他竖井
+//     *
+//     * @param    ShaftId        竖井id
+//     * @param   request        查询条件
+//     */
+//    @ApiOperation(value="查询没有和当前竖井关联的其他竖井", notes="shaftId 竖井id")
+//    @PostMapping(value = ["/un-shaft-othershaft"])
+//    fun unShaftOtherShaft( ShaftId: String,@RequestBody request: SQueryRequest): SQueryResponse<Shaft>{
+//        return ShaftService.unShaftOtherShaft(ShaftId, request)
+//    } //  Fun unShaftOtherShaft()
+//
+//    /**
+//     * 查询没有和当前竖井关联的系统
+//     *
+//     * @param   ShaftId        竖井id
+//     * @param   request        查询条件
+//     */
+//    @ApiOperation(value="查询没有和当前竖井关联的系统", notes="ShaftId 为竖井id")
+//    @PostMapping(value = ["/un-shaft-sys"])
+//    fun unShaftSys( ShaftId: String,@RequestBody request: SQueryRequest): SQueryResponse<GeneralSystem>{
+//        return ShaftService.unShaftSys(ShaftId, request)
+//    } // Fun unShaftSys()
+
+
+    /**
+     * 根据条件查询统计数量
+     */
+    @ApiOperation(value = "根据条件查询统计数量", notes = "")
+    @PostMapping(value = ["/count"])
+    fun count(@RequestBody request: SCountRequest): SCountResponse {
+        val withFilterList = ArrayList<SFilter>()
+        withFilterList.add(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString()))
+        return ShaftService.count(request,withFilterList)
+    } // Function count()
+
+
+
+
+
+} // Class ShaftController

+ 115 - 0
data-center/src/main/kotlin/com/persagy/server/controllers/objects/TenantController.kt

@@ -0,0 +1,115 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.controllers.objects
+
+import com.persagy.server.datacenter.models.entities.objects.Tenant
+import com.persagy.server.datacenter.models.entities.objects.TenantWithCount
+import com.persagy.server.services.objects.TenantService
+import com.sybotan.database.SFilter
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.requests.SCountRequest
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.requests.SQueryRequest
+import com.sybotan.service.models.requests.SUpdateRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCountResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import com.sybotan.service.models.responses.SQueryResponse
+import io.swagger.annotations.Api
+import io.swagger.annotations.ApiOperation
+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
+
+/**
+ * 租户接口
+ *
+ * @author 李井强
+ */
+@Api(tags = ["AH、租户"])
+@RestController
+@RequestMapping("/object/tenant")
+open class TenantController {
+
+    /**
+     * 创建租户
+     *
+     * @param   request     租户对象
+     * @return
+     */
+    @ApiOperation(value = "创建租户", notes = "")
+    @PostMapping(value = ["/create"])
+    fun create(@RequestBody request: SCreateRequest<Tenant>): SCreateResponse<Tenant> {
+        return TenantService.createList( request)
+    } // Function create()
+
+    /**
+     * 根据id删除数据源
+     */
+    @ApiOperation(value = "根据id删除数据源", notes = "")
+    @PostMapping(value = ["/delete"])
+    fun delete(@RequestBody idList: ArrayList<Tenant>): SBaseResponse {
+        return TenantService.deleteByKeysList( idList)
+    } // Function deleteList()
+
+    /**
+     * 更新租户
+     */
+    @ApiOperation(value = "更新租户", notes = "")
+    @PostMapping(value = ["/update"])
+    fun update(@RequestBody request: SUpdateRequest<Tenant>): SBaseResponse {
+        return TenantService.updateList(request)
+    } // Function update()
+
+    /**
+     * 查询租户
+     */
+    @ApiOperation(value = "查询租户", notes = "级联-租赁租户分区(zoneTenantList)、租赁默认分区(zoneGeneraltList)")
+    @PostMapping(value = ["/query"])
+    fun query(@RequestBody request: SQueryRequest): SQueryResponse<Tenant> {
+        return TenantService.pageQuery(request, arrayListOf(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString())))
+    } // Function query()
+
+    /**
+     * 查询租户-包含统计信息
+     *
+     * @param       request
+     * @return      租户统计信息
+     */
+    @ApiOperation(value = "查询租户-包含统计信息", notes = "此方法可能废弃")
+    @PostMapping(value = ["/query-with-count"])
+    fun queryWithCount(@RequestBody request: SQueryRequest): SQueryResponse<TenantWithCount> {
+        return TenantService.queryWithCount(request)
+    } // Function queryWithCount()
+
+    /**
+     * 根据条件查询统计数量
+     */
+    @ApiOperation(value = "根据条件查询统计数量", notes = "")
+    @PostMapping(value = ["/count"])
+    fun count(@RequestBody request: SCountRequest): SCountResponse {
+        val withFilterList = ArrayList<SFilter>()
+        withFilterList.add(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString()))
+        return TenantService.count(request,withFilterList)
+    } // Function count()
+
+} // Class ZoneTenantController

+ 245 - 0
data-center/src/main/kotlin/com/persagy/server/controllers/objects/ZoneSpaceController.kt

@@ -0,0 +1,245 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.controllers.objects
+
+import com.persagy.server.datacenter.models.entities.dict.DictSpaceProject
+import com.persagy.server.datacenter.models.entities.objects.Building
+import com.persagy.server.datacenter.models.entities.objects.ZoneSpace
+import com.persagy.server.datacenter.models.entities.task.SpaceType
+import com.persagy.server.datacenter.models.requests.DCSQueryRequest
+import com.persagy.server.datacenter.models.requests.UpDataFloorAndBuildingRequests
+import com.persagy.server.datacenter.models.response.SpaceSQueryResponse
+import com.persagy.server.services.dict.DictSpaceProjectService
+import com.persagy.server.services.objects.ZoneSpaceBaseService
+import com.persagy.server.services.relation_calc.MepSystemCalcService
+import com.sybotan.database.SFilter
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.requests.SCountRequest
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.requests.SUpdateRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCountResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import com.sybotan.service.models.responses.SQueryResponse
+import io.swagger.annotations.Api
+import io.swagger.annotations.ApiOperation
+import org.slf4j.LoggerFactory
+import org.springframework.beans.factory.annotation.Autowired
+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
+
+/**
+ * 空间父类接口
+ *
+ * @author 张维新
+ */
+@Api(tags = ["AF、空间"])
+@RestController
+@RequestMapping("/object/zone")
+open class ZoneSpaceController {
+    companion object {
+        /** 日志 */
+        private val logger = LoggerFactory.getLogger(ZoneSpaceController::class.java)
+    } // Companion object
+
+    @Autowired
+    lateinit var mepSystemCalc: MepSystemCalcService
+
+    /**
+     * 查询空间信息
+     *
+     * @param   request     查询信息条件
+     * @return              查询结果
+     */
+//    @ApiOperation(value = "查询空间信息", notes = "级联查询:建筑(building),楼层(floor),空间类型(zoneName)")
+//    @PostMapping(value = ["/query"])
+//    fun query(@RequestBody request: SQueryRequest): SQueryResponse<ZoneSpace> {
+//        logger.debug("metaSpaceQuery =${request.toJson()}")
+////        arrayListOf(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString()))
+//        val projectId = SPageContext.getHeader("ProjectId")
+//        if (projectId.isNullOrEmpty()){
+//            return ZoneSpaceBaseService.pageQuery(request)
+//        }else{
+//            return ZoneSpaceBaseService.pageQuery(request, arrayListOf(SFilter.eq("projectId", projectId!!)))
+//        }
+//    } // Function query()
+
+    /**
+     * 根据条件查询统计数量
+     */
+    @ApiOperation(value = "根据条件查询统计数量", notes = "")
+    @PostMapping(value = ["/count"])
+    fun count(@RequestBody request: SCountRequest): SCountResponse {
+        val withFilterList = ArrayList<SFilter>()
+        withFilterList.add(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString()))
+        return ZoneSpaceBaseService.count(request,withFilterList)
+    } // Function count()
+
+    /**
+     * 查询空间信息
+     */
+    @ApiOperation(value = "查询空间信息", notes = "级联查询:建筑(buildingList),楼层(floorlList),空间类型(objectType)未明确楼层(isnull),未明确建筑(isnull)")
+    @PostMapping(value = ["/query"])
+    fun querySpace(@RequestBody request: DCSQueryRequest): SQueryResponse<ZoneSpace> {
+        return ZoneSpaceBaseService.querySpaces(request)
+    } // Function querySpace()
+
+
+    /**
+     * 查询业务空间的建筑楼层,包含受影响的空间数量
+     */
+    @ApiOperation(value = "查询业务空间的建筑楼层,包含受影响的空间数量", notes = "")
+    @PostMapping(value = ["/building-floor"])
+    fun querySpBuildingFloor(): SQueryResponse<Building>{
+        return ZoneSpaceBaseService.spBuildingFloor()
+    }
+
+    /**
+     * 查询业务空间的所有类型
+     */
+    @ApiOperation(value = "查询业务空间的所有类型", notes = "级联其它分区(zoneType)")
+    @PostMapping(value = ["/type"])
+    fun queryZoneTypeSpace(@RequestBody request: DCSQueryRequest): SQueryResponse<DictSpaceProject>{
+        return ZoneSpaceBaseService.zoneTypequery(request)
+    } // Fun
+
+
+    /**
+     * 创建业务空间类型
+     */
+    @ApiOperation(value = "创建业务空间类型", notes = "")
+    @PostMapping(value = ["/create-type"])
+    fun createZoneType(@RequestBody request: SCreateRequest<DictSpaceProject>): SCreateResponse<DictSpaceProject> {
+        return DictSpaceProjectService.zoneTypeCreate(request)
+    } // Fun
+
+    /**
+     * 删除业务空间类型
+     */
+    @ApiOperation(value = "删除业务空间类型", notes = "")
+    @PostMapping(value = ["/delete-type"])
+    fun deleteZoneType(@RequestBody idList: ArrayList<DictSpaceProject>): SBaseResponse {
+        return DictSpaceProjectService.zoneTypeDelete(idList)
+    } // Fun
+
+
+    /**
+     * 创建空间分区
+     *
+     * @param   request     创建空间分区
+     * @return                  创建结果信息
+     */
+    @ApiOperation(value = "创建空间分区对象", notes = "必填:空间类型(ObjectType)")
+    @PostMapping(value = ["/create"])
+    fun createSpace(@RequestBody request: SCreateRequest<ZoneSpace>): SCreateResponse<ZoneSpace> {
+        return ZoneSpaceBaseService.createList(request)
+    } // Function create()
+
+    /**
+     * 根据id删除分区
+     *
+     * @param   idList      id数组
+     * @return              删除的结果信息
+     */
+    @ApiOperation(value = "根据id删除分区对象", notes = "")
+    @PostMapping(value = ["/delete"])
+    fun delete(@RequestBody idList: ArrayList<ZoneSpace>): SBaseResponse {
+        return ZoneSpaceBaseService.deleteByKeysList(idList)
+    } // Function delete()
+
+    /**
+     * 更新分区信息
+     *
+     * @param   request     更新的内容对象
+     * @return              更新的结果
+     */
+    @ApiOperation(value = "更新分区对象信息", notes = "")
+    @PostMapping(value = ["/update"])
+    fun update(@RequestBody request: SUpdateRequest<ZoneSpace>): SBaseResponse {
+        return ZoneSpaceBaseService.updateList(request)
+    } // Function update()
+
+    /**
+     * 更新分区信息 Outline
+     *
+     * @param   request     更新的内容对象
+     * @return              更新的结果
+     */
+    @ApiOperation(value = "更新分区对象信息-Outline", notes = "")
+    @PostMapping(value = ["/update-outline"])
+    fun updateOutline(@RequestBody request: SUpdateRequest<ZoneSpace>): SBaseResponse {
+        return ZoneSpaceBaseService.upDateOutline(request)
+    } // Function update()
+
+    /**
+     * 查询空间信息
+     *
+     * @param   request     查询信息条件
+     * @return              查询结果
+     */
+    @ApiOperation(value = "查询空间信息-outline", notes = "级联查询:建筑(building),楼层(floor),空间类型(objectType)")
+    @PostMapping(value = ["/query-outline"])
+    fun queryOutline(@RequestBody request: DCSQueryRequest): SpaceSQueryResponse {
+//        logger.debug("metaSpaceQuery =${request.toJson()}")
+//        arrayListOf(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString()))
+        val projectId = SPageContext.getHeader("ProjectId")
+        if (!request.projection.isNullOrEmpty()){
+            request.projection!!.clear()
+        }
+        val list = ArrayList<String>()
+        list.add("Outline")
+        list.add("RoomID")
+        list.add("RoomName")
+        list.add("RoomLocalID")
+        list.add("RoomLocalName")
+        list.add("ObjectType")
+        list.add("BuildingId")
+        list.add("FloorId")
+        list.add("State")
+        request.projection = list
+        return ZoneSpaceBaseService.querySpaces(request)
+
+    } // Function query()
+
+    /**
+     * 修改空间和楼层建筑的关系
+     *
+     * @param   upDataFloorAndBuildingRequestsList     修改对象列表
+     */
+    @ApiOperation(value = "修改业务空间对象和建筑楼层的关系", notes = "spaceId 业务空间id,id 楼层或建筑id,type  业务空间的类型")
+    @PostMapping(value = ["/update-fl-bd"])
+    fun  spFloorAndBuilding(@RequestBody upDataFloorAndBuildingRequestsList:ArrayList<UpDataFloorAndBuildingRequests>): SBaseResponse {
+        return ZoneSpaceBaseService.upDataFloorORBuilding(upDataFloorAndBuildingRequestsList)
+    } // Function spFloorAndBuilding
+
+    /**
+     * 获取项目下已有的空间类型
+     */
+    @ApiOperation(value = "获取项目下已有的空间类型", notes = "")
+    @PostMapping(value = ["/space-type"])
+    fun spaceType(): SQueryResponse<SpaceType>{
+        val projectId = SPageContext.getHeader("ProjectId")
+        return mepSystemCalc.spaceTypes(projectId!!)
+    } // Function
+
+} // Class ZoneAirConditioningController

+ 16 - 0
data-center/src/main/kotlin/com/persagy/server/mappers/ICalcSpaceMapper.kt

@@ -0,0 +1,16 @@
+package com.persagy.server.mappers
+
+import org.apache.ibatis.annotations.Mapper
+import org.apache.ibatis.annotations.Select
+import org.springframework.stereotype.Repository
+/**
+ * 关系计算-空间
+ *
+ * @author 邓婷婷
+ */
+@Mapper
+@Repository
+interface ICalcSpaceMapper {
+
+
+} // Interface ICalcSpaceMapper

+ 41 - 0
data-center/src/main/kotlin/com/persagy/server/mappers/ICalcSpecialMapper.kt

@@ -0,0 +1,41 @@
+package com.persagy.server.mappers
+
+import org.apache.ibatis.annotations.Mapper
+import org.apache.ibatis.annotations.Select
+import org.springframework.stereotype.Repository
+
+/**
+ * 关系计算-管网
+ *
+ * @author 邓婷婷
+ */
+@Mapper
+@Repository
+interface ICalcSpecialMapper {
+
+    /**
+     * 管网系统设备分块
+     *@param projectId 项目id
+     *@param systemName 需要计算的系统名称
+     *@param domain 需要计算的管道系统类型,枚举(水管或风管):DomainPiping,DomainHvac
+     */
+    @Select(" SELECT * from public.sys_block(#{projectId},#{buildingId},#{systemName},#{domain}) ")
+    fun sysBolck(projectId: String, buildingId: String?, systemName: String,domain: String): Boolean
+
+    /**
+     * 管网系统确定流向
+     *@param projectId 项目id
+     *@param blockId 需要计算的块id
+     *@param systemName 需要计算的系统名称
+     *@param domain 需要计算的管道系统类型,枚举(水管或风管):DomainPiping,DomainHvac
+     */
+    @Select(" SELECT * from public.sys_direction(#{projectId},#{buildingId},#{blockId},#{systemName},#{domain},#{isSource}) ")
+    fun sysDirection(projectId: String, buildingId: String?, blockId: String, systemName: String,domain: String,isSource: Boolean): Boolean
+
+
+
+
+
+
+
+} // Interface ICalcSpecialMapper

+ 177 - 0
data-center/src/main/kotlin/com/persagy/server/mappers/IRelationCalcMapper.kt

@@ -0,0 +1,177 @@
+package com.persagy.server.mappers
+
+import org.apache.ibatis.annotations.Mapper
+import org.apache.ibatis.annotations.Select
+import org.springframework.stereotype.Repository
+
+/**
+ * 自动关系计算
+ *
+ * @author  庞利祥 <sybotan@126.com>
+ */
+@Mapper
+@Repository
+interface IRelationCalcMapper {
+    /**
+     * 建筑下的业务空间
+     *
+     * @param    projectId  项目id
+     * @param   tables      参与计算的表的全名称, 带schema名, 以英文逗号隔开
+     */
+    //@Select(" SELECT * from public.f_rel_bd2sp(#{tables},#{projectId}) ")
+    @Select("select public.f_rel_calc('rel_bd2sp', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcBd2Sp(tables: String, projectId: String): Int?
+
+    /**
+     * 设备所在建筑
+     */
+    //@Select(" SELECT * from public.f_rel_eq2bd(#{projectId}) ")
+    @Select("select public.f_rel_calc('rel_eq2bd', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcEq2Bd(projectId: String): Int?
+
+    /**
+     * 设备所在楼层
+     */
+    // @Select(" SELECT * from public.f_rel_eq2fl(#{projectId}) ")
+    @Select("select public.f_rel_calc('rel_eq2fl', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcEq2Fl(projectId: String): Int?
+
+    /**
+     * 设备所在竖井
+     */
+    // @Select(" SELECT * from public.f_rel_eq2sh(#{projectId}) ")
+    @Select("select public.f_rel_calc('rel_eq2sh', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcEq2Sh(projectId: String): Int?
+
+    /**
+     * 设备所在业务空间
+     *
+     *@param projectId 项目id
+     */
+    // @Select(" SELECT * from public.f_rel_eq2sp(#{tables},#{outTables},#{projectId},#{sign1},#{sign2}) ")
+    @Select("select public.f_rel_calc('rel_eq2sp', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcEq2Sp(tables: String, outTables: String, projectId: String, sign1: Int, sign2: Int): Int?
+
+    /**
+     * 楼层贯通关系
+     *
+     * @param   projectId   项目id
+     * @param   sign1       表示r_fl_through_fl表中要被删除的sign值
+     * @param   sign2       同上 与sign1是逻辑或的关系
+     */
+    // @Select(" SELECT * from public.f_rel_fl2fl(#{projectId},#{sign1},#{sign2}) ")
+    @Select("select public.f_rel_calc('rel_fl2fl', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcFl2Fl(projectId: String, sign1: Int, sign2: Int): Int?
+
+    /**
+     * 楼层下的业务空间
+     *
+     * @param    projectId  项目id
+     * @param    tables      参与计算的表的全名称, 带schema名, 以英文逗号隔开
+     */
+    // @Select(" SELECT * from public.f_rel_bd2sp(#{tables},#{projectId}) ")
+    @Select("select public.f_rel_calc('rel_sp2fl', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcFl2Sp(tables: String, projectId: String): Int?
+
+    /**
+     * 资产所在建筑
+     */
+//    @Select(" SELECT * from public.f_rel_pe2bd(#{projectId}) ")
+    @Select("select public.f_rel_calc('rel_pe2bd', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcPe2Bd(projectId: String): Int?
+
+    /**
+     * 资产所在楼层
+     */
+//    @Select(" SELECT * from public.f_rel_pe2fl(#{projectId}) ")
+    @Select("select public.f_rel_calc('rel_pe2fl', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcPe2Fl(projectId: String): Int?
+
+    /**
+     * 资产所在竖井
+     */
+//    @Select(" SELECT * from public.f_rel_pe2sh(#{projectId}) ")
+    @Select("select public.f_rel_calc('rel_pe2sh', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcPe2Sh(projectId: String): Int?
+
+    /**
+     * 资产所在业务空间
+     */
+//    @Select(" SELECT * from public.f_rel_pe2sp(#{projectId}) ")
+    @Select("select public.f_rel_calc('rel_pe2sp', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcPe2Sp(projectId: String): Int?
+
+    /**
+     * 建筑下的竖井
+     */
+//    @Select(" SELECT * from public.f_rel_sh2bd(#{projectId}) ")
+    @Select("select public.f_rel_calc('rel_sh2bd', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcSh2Bd(projectId: String): Int?
+
+    /**
+     * 竖井贯通
+     */
+//    @Select(" SELECT * from public.f_rel_sh2sh(#{projectId}) ")
+    @Select("select public.f_rel_calc('rel_sh2sh', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcSh2Sh(projectId: String): Int?
+
+    /**
+     * 建筑下的系统设备部件
+     */
+//    @Select(" SELECT * from public.f_rel_syeq2bd(#{projectId}) ")
+    @Select("select public.f_rel_calc('rel_syeq2bd', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcSyEq2Bd(projectId: String): Int?
+
+    /**
+     * 系统所在建筑
+     */
+//    @Select(" SELECT * from public.f_rel_sy2bd(#{projectId}) ")
+    @Select("select public.f_rel_calc('rel_sy2bd', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcSy2Bd(projectId: String): Int?
+
+    /**
+     * 系统所在楼层
+     */
+//    @Select(" SELECT * from public.f_rel_sy2fl(#{projectId}) ")
+    @Select("select public.f_rel_calc('rel_sy2fl', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcSy2Fl(projectId: String): Int?
+
+    /**
+     * 系统所在竖井
+     */
+//    @Select(" SELECT * from public.f_rel_sy2sh(#{projectId}) ")
+    @Select("select public.f_rel_calc('rel_sy2sh', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcSy2Sh(projectId: String): Int?
+
+    /**
+     * 系统所在业务空间
+     */
+//    @Select(" SELECT * from public.f_rel_sy2sp(#{projectId}) ")
+    @Select("select public.f_rel_calc('rel_sy2sp', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcSy2Sp(projectId: String): Int?
+
+    /**
+     * 空间普通交通
+     */
+    @Select("select public.f_rel_calc('rel_sp2sp_transport', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcsp2spTransport(projectId: String): Int?
+
+    /**
+     * 光照连通
+     */
+    @Select("select public.f_rel_calc('rel_sp2sp_light', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcsp2spLight(projectId: String): Int?
+
+    /**
+     * 光照连通
+     */
+    @Select("select public.f_rel_calc('rel_sp2sp_convection', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcsp2spConvection(projectId: String): Int?
+
+    /**
+     * 空间连通
+     */
+    @Select("select public.f_rel_calc('rel_sp2sp_v2', #{projectId}, 'zone_space_base','relationship.r_eq2sp', 2, 2)")
+    fun calcsp2spV2(projectId: String): Int?
+
+} // Interface IRelationCalcMapper

+ 35 - 0
data-center/src/main/kotlin/com/persagy/server/mappers/IRelationCountMapper.kt

@@ -0,0 +1,35 @@
+package com.persagy.server.mappers
+
+import org.apache.ibatis.annotations.*
+import org.springframework.stereotype.Repository
+
+/**
+ * 关系计算-建筑
+ *
+ * @author 邓婷婷
+ */
+@Mapper
+@Repository
+interface IRelationCountMapper {
+
+    /**
+     * 建筑下的业务空间
+     *@param projectId 项目id
+     *@param tables 参与计算的表的全名称, 带schema名, 以英文逗号隔开
+     */
+    @SelectProvider(type = IRelationCountProvider::class , method = "getSql")
+    fun relationCount(@Param("tableName") tableName: String, @Param("projectId") projectId: String): Int
+
+    /**
+     * 更新计算状态
+     */
+    @Update("update graphtype.relation_type_project set computational_state = #{computationalState} where id = #{id}")
+    fun updateState(@Param("id") id: String,@Param("computationalState")computationalState: Long): Boolean
+
+    /**
+     * 更新计算状态和最后计算时间
+     */
+    @Update("update graphtype.relation_type_project set computational_state = #{computationalState},computing_time = now() where id = #{id}")
+    fun updateStateAndLastTime(@Param("id") id: String,@Param("computationalState")computationalState: Long): Boolean
+
+} // Interface IRelationCountMapper

+ 29 - 0
data-center/src/main/kotlin/com/persagy/server/mappers/IRelationCountProvider.kt

@@ -0,0 +1,29 @@
+package com.persagy.server.mappers
+
+import org.apache.ibatis.jdbc.SQL
+
+/**
+ * 关系计算-建筑
+ *
+ * @author 邓婷婷
+ */
+open class IRelationCountProvider {
+
+    fun getSql(map: Map<String,String>): String{
+        val sql = SQL()
+        sql.SELECT("count(*)")
+        if(map["tableName"] != null&& map["tableName"] !=""){
+            sql.FROM(map["tableName"])
+        }
+
+        if(map["projectId"] != null&& map["projectId"] !=""){
+            sql.WHERE("project_id = '" + map["projectId"] + "'")
+        }
+
+
+
+        println("----------------$sql")
+        return sql.toString()
+    }
+
+} // IRelationCountProvider

+ 368 - 0
data-center/src/main/kotlin/com/persagy/server/mappers/IRelationExcelExportMapper.kt

@@ -0,0 +1,368 @@
+package com.persagy.server.mappers
+
+import org.apache.ibatis.annotations.Mapper
+import org.apache.ibatis.annotations.Select
+import org.springframework.stereotype.Repository
+
+/**
+ * 导入关系excel
+ *
+ * @author  庞利祥 <sybotan@126.com>
+ */
+@Mapper
+@Repository
+interface IRelationExcelExportMapper {
+
+//    /**
+//     * 建筑下的竖井
+//     * @param   projectId       项目id
+//     * @return  excel需要的记录
+//     */
+//    @Select("select m.id,m.name,m.local_id,m.local_name,'建筑' AS object_type,m.name AS building_floor," +
+//            "s.id AS _id,s.name AS _name,s.local_id AS _local_id,s.local_name AS _local_name,'竖井' AS _object_type," +
+//            "m.name as _building_floor from public.building as m,shaft as s,r_sh_in_bd rsb where m.id=rsb.building_id and s.id=rsb.shaft_id and rsb.project_id=#{projectId}")
+//    fun sh2bd(projectId: String): List<HashMap<String, Any?>>
+//
+//
+//    /**
+//     * 竖井贯通关系
+//     * @param   projectId       项目id
+//     * @return  excel需要的记录
+//     */
+//    @Select("select m.id,m.name,m.local_id,m.local_name,'竖井' AS object_type,s.id AS _id,s.name AS _name,s.local_id AS _local_id,s.local_name AS _local_name," +
+//            "'竖井' AS _object_type from public.shaft as m,public.shaft as s,r_sh_through_sh as r where m.id=r.shaft_id and s.id=r.shaft_other_id and r.project_id=#{projectId}")
+//    fun sh2sh(projectId: String): List<HashMap<String, Any?>>
+//
+//    /**
+//     * 楼层贯通关系
+//     * @param   projectId       项目id
+//     * @return  excel需要的记录
+//     */
+//    @Select("select m.id,m.name,m.local_id,m.local_name,'楼层' AS object_type,m.name AS building_floor,s.id AS _id,s.name AS _name,s.local_id AS _local_id,s.local_name AS _local_name," +
+//            "'楼层' AS _object_type,s.name as _building_floor from public.floor as m,floor as s,r_fl_through_fl r where m.id=r.floor_id and s.id=r.floor_other_id and r.project_id=#{projectId}")
+//    fun fl2fl(projectId: String): List<HashMap<String, Any?>>
+//
+//    /**
+//     * 资产所在竖井
+//     * @param   projectId       项目id
+//     * @return  excel需要的记录
+//     */
+//    @Select("select m.id,m.name,m.local_id,m.local_name,'竖井' AS object_type,s.id AS _id,s.name AS _name,s.local_id AS _local_id,s.local_name AS _local_name," +
+//            "'资产' AS _object_type from public.shaft as m,property as s,r_pe_in_sh as r where m.id=r.shaft_id and s.id=r.equip_id and r.project_id=#{projectId}")
+//    fun pe2sh(projectId: String): List<HashMap<String, Any?>>
+
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    /**
+     * 建筑与设备关系
+     *
+     * @param   projectId       项目id
+     * @param   type            关系类型
+     * @return  关系记录
+     */
+    @Select("SELECT r.bd_id AS id, bd.name, bd.local_id, bd.local_name, '建筑' AS object_type,\n" +
+            "       r.eq_id AS _id, eq.name AS _name, eq.local_id AS _local_id, eq.local_name, '设备' AS _local_name \n" +
+            "FROM relationship.r_eq2bd r JOIN equipment AS eq ON r.eq_id = eq.id JOIN building AS bd ON r.bd_id = bd.id\n" +
+            "WHERE r.project_id = #{projectId} AND r.type = #{type}")
+    fun eq2bd(projectId: String, type: String): List<HashMap<String, Any?>>
+
+    /**
+     * 建筑下的设备
+     *
+     * @param   projectId       项目id
+     * @return  关系记录
+     */
+    @Select("SELECT m.id, m.name, m.local_id, m.local_name,'建筑' AS object_type,m.name AS building_floor ," +
+            "s.id AS _id, s.name AS _name, s.local_id AS _local_id, s.local_name AS _local_name, '设备' AS _object_type," +
+            "s.f_name AS _building_floor FROM public.building as m JOIN (select e.id,e.name,e.local_id,e.local_name,e.building_id," +
+            "f.name as f_name from public.equipment as e join floor as f on e.floor_id=f.id) AS s ON s.building_id = m.id WHERE m.project_id =#{projectId}")
+    fun eq2bdIn(projectId: String): List<HashMap<String, Any?>>
+
+    /**
+     * 设备与设备关系
+     *
+     * @param   projectId       项目id
+     * @param   type            关系类型
+     * @return  关系记录
+     */
+    @Select("SELECT r.id1 AS id, eq1.name, eq1.local_id, eq1.local_name, '设备' AS object_type,\n" +
+            "       r.id2 AS _id, eq2.name AS _name, eq2.local_id AS _local_id, eq2.local_name AS _local_name, '设备' AS _object_type \n" +
+            "FROM relationship.r_eq2eq r JOIN equipment AS eq1 ON r.id1 = eq1.id JOIN equipment AS eq2 ON r.id2 = eq2.id\n" +
+            "WHERE r.project_id = #{projectId} AND r.type = #{type}")
+    fun eq2eq(projectId: String, type: String): List<HashMap<String, Any?>>
+
+    /**
+     * 楼层下的设备
+     *
+     * @param   projectId       项目id
+     * @return  excel需要的记录
+     */
+    @Select("SELECT " +
+            "   m.id, m.name, m.local_id, m.local_name,'楼层' AS object_type,m.name AS building_floor, " +
+            "   s.id AS _id, s.name AS _name, s.local_id AS _local_id, s.local_name AS _local_name, '设备' AS _object_type,m.name AS _building_floor " +
+            "FROM public.floor as m JOIN equipment AS s ON s.floor_id = m.id " +
+            "WHERE m.project_id = #{projectId}")
+    fun eq2flIn(projectId: String): List<HashMap<String, Any?>>
+
+    /**
+     * 楼层与设备关系
+     *
+     * @param   projectId       项目id
+     * @param   type            关系类型
+     * @return  关系记录
+     */
+    @Select("SELECT r.fl_id AS id, fl.name, fl.local_id, fl.local_name, '楼层' AS object_type,\n" +
+            "       r.eq_id AS _id, eq.name AS _name, eq.local_id AS _local_id, eq.local_name, '设备' AS _local_name \n" +
+            "FROM relationship.r_eq2bd r JOIN equipment AS eq ON r.eq_id = eq.id JOIN floor AS fl ON r.fl_id = fl.id\n" +
+            "WHERE r.project_id = #{projectId} AND r.type = #{type}")
+    fun eq2fl(projectId: String, type: String): List<HashMap<String, Any?>>
+
+    /**
+     * 设备与空间关系
+     *
+     * @param   projectId       项目id
+     * @param   type            关系类型
+     * @param   zoneType        空间类型
+     * @return  关系记录
+     */
+    @Select("SELECT r.eq_id AS id, eq.name, eq.local_id, eq.local_name, '设备' AS object_type,\n" +
+            "       r.sp_id AS _id, sp.name AS _name, sp.local_id AS _local_id, sp.local_name AS _local_name, '空间' AS _object_type\n" +
+            "FROM relationship.r_eq2sp r JOIN equipment AS eq ON r.eq_id = eq.id JOIN zone_space_base AS sp ON r.sp_id = sp.id\n" +
+            "WHERE r.project_id = #{projectId} AND r.type = #{type} AND r.zoneType = #{zoneType}")
+    fun eq2sp(projectId: String, type: String, zoneType :String): List<HashMap<String, Any?>>
+
+    /**
+     * 设备与系统关系
+     *
+     * @param   projectId       项目id
+     * @param   type            关系类型
+     * @return  关系记录
+     */
+    @Select("SELECT r.eq_id AS id, eq.name, eq.local_id, eq.local_name, '设备' AS object_type,\n" +
+            "       r.sy_id AS _id, sy.name AS _name, sy.local_id AS _local_id, sy.local_name AS _local_name, '系统' AS _object_type\n" +
+            "FROM relationship.r_eq2sy r JOIN equipment AS eq ON r.eq_id = eq.id JOIN general_system AS sy ON r.sy_id = sy.id\n" +
+            "WHERE r.project_id = #{projectId} AND r.type = #{type}")
+    fun eq2sy(projectId: String, type: String): List<HashMap<String, Any?>>
+
+    /**
+     * 楼层与楼层关系
+     *
+     * @param   projectId       项目id
+     * @param   type            关系类型
+     * @return  关系记录
+     */
+    @Select("SELECT r.id1 AS id, fl1.name, fl1.local_id, fl1.local_name, '楼层' AS object_type,\n" +
+            "       r.id2 AS _id, fl2.name AS _name, fl2.local_id AS _local_id, fl2.local_name AS _local_name, '楼层' AS _object_type\n" +
+            "FROM relationship.r_sp2sp r JOIN floor AS fl1 ON r.id1 = fl1.id JOIN floor AS fl2 ON r.id2 = fl2.id\n" +
+            "WHERE r.project_id = #{projectId} AND r.type = #{type}")
+    fun fl2fl(projectId: String, type: String): List<HashMap<String, Any?>>
+
+    /**
+     * 建筑下的资产
+     *
+     * @param   projectId       项目id
+     * @return  excel需要的记录
+     */
+    @Select("SELECT m.id, m.name, m.local_id, m.local_name, '建筑' AS object_type,m.name AS building_floor," +
+            "s.id AS _id, s.name AS _name, s.local_id AS _local_id, s.local_name AS _local_name, '资产' AS _object_type," +
+            "s.f_name AS _building_floor FROM public.building as m JOIN (select p.id,p.name,p.local_id,p.local_name,p.building_id," +
+            "f.name as f_name from property as p JOIN floor as f ON p.floor_id=f.id) AS s ON s.building_id = m.id WHERE m.project_id =#{projectId}")
+    fun pe2bdIn(projectId: String): List<HashMap<String, Any?>>
+
+    /**
+     * 楼层下的资产
+     *
+     * @param   projectId       项目id
+     * @return  excel需要的记录
+     */
+    @Select("SELECT " +
+            "   m.id, m.name, m.local_id, m.local_name,'楼层' AS object_type,m.name AS building_floor, " +
+            "   s.id AS _id, s.name AS _name, s.local_id AS _local_id, s.local_name AS _local_name,'资产' AS _object_type,m.name AS _building_floor " +
+            "FROM public.floor as m JOIN property AS s ON s.floor_id = m.id " +
+            "WHERE m.project_id = #{projectId}")
+    fun pe2flIn(projectId: String): List<HashMap<String, Any?>>
+
+
+    /**
+     * 资产与竖井关系
+     *
+     * @param   projectId       项目id
+     * @param   type            关系类型
+     * @return  关系记录
+     */
+    @Select("SELECT r.pe_id AS id, pe.name, pe.local_id, pe.local_name, '资产' AS object_type,\n" +
+            "       r.sh_id AS _id, sh.name AS _name, sh.local_id AS _local_id, sh.local_name AS _local_name, '竖井' AS _object_type\n" +
+            "FROM relationship.r_pe2sh r JOIN property AS pe ON r.pe_id = pe.id JOIN shaft AS sh ON r.sh_id = sh.id\n" +
+            "WHERE r.project_id = #{projectId} AND r.type = #{type}")
+    fun pe2sh(projectId: String, type: String): List<HashMap<String, Any?>>
+
+    /**
+     * 资产与空间关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @return  excel需要的记录
+     */
+    @Select("SELECT r.pe_id AS id, pe.name, pe.local_id, pe.local_name, '资产' AS object_type,\n" +
+            "       r.sp_id AS _id, sp.name AS _name, sp.local_id AS _local_id, sp.local_name AS _local_name, '空间' AS _object_type\n" +
+            "FROM relationship.r_pe2sp r JOIN property AS pe ON r.pe_id = pe.id JOIN zone_space_base AS sp ON r.sp_id = sp.id\n" +
+            "WHERE r.project_id = #{projectId} AND r.type = #{type}")
+    fun pe2sp(projectId: String, type: String): List<HashMap<String, Any?>>
+
+    /**
+     * 建筑与竖井关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @return  excel需要的记录
+     */
+    @Select("SELECT r.sh_id AS id, sh.name, sh.local_id, sh.local_name, '资产' AS object_type,\n" +
+            "       r.bd_id AS _id, bd.name AS _name, bd.local_id AS _local_id, bd.local_name AS _local_name, '空间' AS _object_type\n" +
+            "FROM relationship.r_sh2bd r JOIN building AS bd ON r.bd_id = bd.id JOIN shaft AS sh ON r.sh_id = sh.id\n" +
+            "WHERE r.project_id = #{projectId} AND r.type = #{type}")
+    fun sh2bd(projectId: String, type: String): List<HashMap<String, Any?>>
+
+    /**
+     * 楼层与竖井关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @return  excel需要的记录
+     */
+    @Select("SELECT r.sh_id AS id, sh.name, sh.local_id, sh.local_name, '竖井' AS object_type,\n" +
+            "       r.fl_id AS _id, fl.name AS _name, fl.local_id AS _local_id, fl.local_name AS _local_name, '楼层' AS _object_type\n" +
+            "FROM relationship.r_sh2fl r JOIN floor AS fl ON r.fl_id = fl.id JOIN shaft AS sh ON r.sh_id = sh.id\n" +
+            "WHERE r.project_id = #{projectId} AND r.type = #{type}")
+    fun sh2fl(projectId: String, type: String): List<HashMap<String, Any?>>
+
+    /**
+     * 楼层与竖井关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @return  excel需要的记录
+     */
+    @Select("SELECT r.id1 AS id, sh1.name, sh1.local_id, sh1.local_name, '竖井' AS object_type,\n" +
+            "       r.id2 AS _id, sh2.name AS _name, sh2.local_id AS _local_id, sh2.local_name AS _local_name, '竖井' AS _object_type\n" +
+            "FROM relationship.r_sh2sh r JOIN shaft AS sh1 ON r.id1 = sh1.id JOIN shaft AS sh2 ON r.id2 = sh2.id\n" +
+            "WHERE r.project_id = #{projectId} AND r.type = #{type}")
+    fun sh2sh(projectId: String, type: String): List<HashMap<String, Any?>>
+
+    /**
+     * 竖井空间关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @return  excel需要的记录
+     */
+    @Select("SELECT r.sh_id AS id, sh.name, sh.local_id, sh.local_name, '竖井' AS object_type,\n" +
+            "       r.sp_id AS _id, sp.name AS _name, sp.local_id AS _local_id, sp.local_name AS _local_name, '空间' AS _object_type\n" +
+            "FROM relationship.r_sh2sp r JOIN zone_space_base AS sp ON r.sp_id = sp.id JOIN shaft AS sp ON r.sh_id = sh.id\n" +
+            "WHERE r.project_id = #{projectId} AND r.type = #{type}")
+    fun sh2sp(projectId: String, type: String): List<HashMap<String, Any?>>
+
+    /**
+     * 建筑与空间关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @return  excel需要的记录
+     */
+    @Select("SELECT r.sp_id AS id, sp.name, sp.local_id, sp.local_name, '空间' AS object_type,\n" +
+            "       r.bd_id AS _id, bd.name AS _name, bd.local_id AS _local_id, bd.local_name AS _local_name, '建筑' AS _object_type\n" +
+            "FROM relationship.r_sp2bd r JOIN building AS bd ON r.bd_id = bd.id JOIN zone_space_base AS sh ON r.sp_id = sp.id\n" +
+            "WHERE r.project_id = #{projectId} AND r.type = #{type}")
+    fun sp2bd(projectId: String, type: String): List<HashMap<String, Any?>>
+
+    /**
+     * 楼层与空间关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @return  excel需要的记录
+     */
+    @Select("SELECT r.sp_id AS id, sp.name, sp.local_id, sp.local_name, '空间' AS object_type,\n" +
+            "       r.fl_id AS _id, fl.name AS _name, fl.local_id AS _local_id, fl.local_name AS _local_name, '楼层' AS _object_type\n" +
+            "FROM relationship.r_sp2fl r JOIN floor AS fl ON r.fl_id = fl.id JOIN zone_space_base AS sp ON r.sp_id = sp.id\n" +
+            "WHERE r.project_id = #{projectId} AND r.type = #{type}")
+    fun sp2fl(projectId: String, type: String): List<HashMap<String, Any?>>
+
+    /**
+     * 空间与空间关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @return  excel需要的记录
+     */
+    @Select("SELECT r.id1 AS id, sp1.name, sp1.local_id, sp1.local_name, '空间' AS object_type,\n" +
+            "       r.id2 AS _id, sp2.name AS _name, sp2.local_id AS _local_id, sp2.local_name AS _local_name, '空间' AS _object_type\n" +
+            "FROM relationship.r_sp2sp r JOIN zone_space_base AS sp1 ON r.id1 = sp1.id JOIN zone_space_base AS sp2 ON r.id2 = sp2.id\n" +
+            "WHERE r.project_id = #{projectId} AND r.type = #{type}")
+    fun sp2sp(projectId: String, type: String): List<HashMap<String, Any?>>
+
+    /**
+     * 建筑与系统关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @return  excel需要的记录
+     */
+    @Select("SELECT r.sy_id AS id, sy.name, sy.local_id, sy.local_name, '系统' AS object_type,\n" +
+            "       r.bd_id AS _id, bd.name AS _name, bd.local_id AS _local_id, bd.local_name AS _local_name, '建筑' AS _object_type\n" +
+            "FROM relationship.r_sy2bd r JOIN building AS bd ON r.bd_id = bd.id JOIN general_system AS sy ON r.sy_id = sy.id\n" +
+            "WHERE r.project_id = #{projectId} AND r.type = #{type}")
+    fun sy2bd(projectId: String, type: String): List<HashMap<String, Any?>>
+
+    /**
+     * 楼层与系统关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @return  excel需要的记录
+     */
+    @Select("SELECT r.sy_id AS id, sy.name, sy.local_id, sy.local_name, '系统' AS object_type,\n" +
+            "       r.fl_id AS _id, fl.name AS _name, fl.local_id AS _local_id, fl.local_name AS _local_name, '楼层' AS _object_type\n" +
+            "FROM relationship.r_sp2fl r JOIN floor AS fl ON r.fl_id = fl.id JOIN general_system AS sy ON r.sy_id = sy.id\n" +
+            "WHERE r.project_id = #{projectId} AND r.type = #{type}")
+    fun sy2fl(projectId: String, type: String): List<HashMap<String, Any?>>
+
+    /**
+     * 系统与空间关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @return  excel需要的记录
+     */
+    @Select("SELECT r.sy_id AS id, sy.name, sy.local_id, sy.local_name, '系统' AS object_type,\n" +
+            "       r.fl_id AS _id, fl.name AS _name, fl.local_id AS _local_id, fl.local_name AS _local_name, '楼层' AS _object_type\n" +
+            "FROM relationship.r_sy2sh r JOIN floor AS fl ON r.fl_id = fl.id JOIN general_system AS sy ON r.sy_id = sy.id\n" +
+            "WHERE r.project_id = #{projectId} AND r.type = #{type}")
+    fun sy2sh(projectId: String, type: String): List<HashMap<String, Any?>>
+
+    /**
+     * 系统与空间关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @return  excel需要的记录
+     */
+    @Select("SELECT r.sy_id AS id, sy.name, sy.local_id, sy.local_name, '系统' AS object_type,\n" +
+            "       r.sp_id AS _id, sp.name AS _name, sp.local_id AS _local_id, sp.local_name AS _local_name, '空间' AS _object_type\n" +
+            "FROM relationship.r_sy2sp r JOIN general_system AS sy ON r.sy_id = sy.id JOIN zone_space_base AS sp ON r.sp_id = sp.id\n" +
+            "WHERE r.project_id = #{projectId} AND r.type = #{type}")
+    fun sy2sp(projectId: String, type: String): List<HashMap<String, Any?>>
+
+    /**
+     * 租户与空间关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @return  excel需要的记录
+     */
+    @Select("SELECT r.tn_id AS id, tn.name, tn.local_id, tn.local_name, '租户' AS object_type,\n" +
+            "       r.sp_id AS _id, sp.name AS _name, sp.local_id AS _local_id, sp.local_name AS _local_name, '空间' AS _object_type\n" +
+            "FROM relationship.r_tn2sp r JOIN tenant AS tn ON r.tn_id = tn.id JOIN zone_space_base AS sp ON r.sp_id = sp.id\n" +
+            "WHERE r.project_id = #{projectId} AND r.type = #{type}")
+    fun tn2sp(projectId: String, type: String): List<HashMap<String, Any?>>
+
+} // Interface IRelationExcelExportMapper

+ 343 - 0
data-center/src/main/kotlin/com/persagy/server/mappers/IRelationExcelImportMapper.kt

@@ -0,0 +1,343 @@
+package com.persagy.server.mappers
+
+import org.apache.ibatis.annotations.Insert
+import org.apache.ibatis.annotations.Mapper
+import org.apache.ibatis.annotations.SelectProvider
+import org.apache.ibatis.annotations.Update
+import org.springframework.stereotype.Repository
+
+/**
+ * 导入关系excel
+ *
+ * @author  庞利祥 <sybotan@126.com>
+ */
+@Mapper
+@Repository
+interface IRelationExcelImportMapper {
+    @SelectProvider(type = RelationProvider::class, method = "findObjectId")
+    fun findObjectId(projectId: String, table: String, code: String, codeValue: String): ArrayList<String>
+
+    /**
+     * 建筑与设备关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             建筑ID
+     * @param   id2             设备ID
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO relationship.r_eq2bd(project_id, eq_id, bd_id, type, sign) VALUES(#{projectId}, #{id2}, #{id1}, #{type}, 1)")
+    fun eq2bd(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 建筑下的设备
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             建筑ID
+     * @param   id2             设备ID
+     * @return  excel需要的记录
+     */
+    @Update("UPDATE public.equipment SET building_id = #{id1} WHERE project_id = #{projectId} AND id = #{id2}")
+    fun eq2bdIn(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 设备与设备关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             设备1
+     * @param   id2             设备2
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO relationship.r_eq2eq(project_id, id1, id2, type, sign) VALUES(#{projectId}, #{id1}, #{id2}, #{type}, 1)")
+    fun eq2eq(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 楼层下的设备
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             楼层ID
+     * @param   id2             设备ID
+     * @return  excel需要的记录
+     */
+    @Update("UPDATE public.equipment SET floor_id = #{id1} WHERE project_id = #{projectId} AND id = #{id2}")
+    fun eq2flIn(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 楼层与设备关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             楼层ID
+     * @param   id2             设备ID
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO public.r_eq_for_fl(equip_id,floor_id,project_id, sign) VALUES(#{id2}, #{id1},#{projectId}, 1)")
+    fun eq2fl(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 设备与空间关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             设备ID
+     * @param   id2             竖井ID
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO relationship.r_eq2sh(project_id, eq_id, sh_id, type, sign) VALUES(#{projectId}, #{id1}, #{id2}, #{type}, 1)")
+    fun eq2sh(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 设备与空间关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             设备ID
+     * @param   id2             空间ID
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO relationship.r_eq2sp(project_id, eq_id, sp_id, type, sign) VALUES(#{projectId}, #{id1}, #{id2}, #{type}, 1)")
+    fun eq2sp(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 设备与空间关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             设备ID
+     * @param   id2             系统ID
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO relationship.r_eq2sy(project_id, eq_id, sy_id, type, sign) VALUES(#{projectId}, #{id1}, #{id2}, #{type}, 1)")
+    fun eq2sy(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 楼层与楼层关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             楼层1
+     * @param   id2             楼层2
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO relationship.r_fl2fl(project_id, id1, id2, type, sign) VALUES(#{projectId}, #{id1}, #{id2}, #{type}, 1)")
+    fun fl2fl(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 建筑下的资产
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             建筑ID
+     * @param   id2             资产ID
+     * @return  excel需要的记录
+     */
+    @Update("UPDATE public.property SET building_id = #{id1} WHERE project_id = #{projectId} AND id = #{id2}")
+    fun pe2bdIn(projectId: String, type: String, id1: String, id2: String)
+
+//    /**
+//     * 建筑与资产关系
+//     *
+//     * @param   projectId       项目ID
+//     * @param   type            关系类型
+//     * @param   id1             楼层ID
+//     * @param   id2             设备ID
+//     * @return  excel需要的记录
+//     */
+//    @Insert("INSERT INTO relationship.r_pe2bd(project_id, pe_id, bd_id, type, sign) VALUES(#{projectId}, #{id2}, #{id1}, #{type}, 1)")
+//    fun pe2bd(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 楼层下的资产
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             楼层ID
+     * @param   id2             资产ID
+     * @return  excel需要的记录
+     */
+    @Update("UPDATE public.property SET floor_id = #{id1} WHERE project_id = #{projectId} AND id = #{id2}")
+    fun pe2flIn(projectId: String, type: String, id1: String, id2: String)
+
+//    /**
+//     * 楼层与设备关系
+//     *
+//     * @param   projectId       项目ID
+//     * @param   type            关系类型
+//     * @param   id1             楼层ID
+//     * @param   id2             设备ID
+//     * @return  excel需要的记录
+//     */
+//    @Insert("INSERT INTO relationship.r_pe2fl(project_id, pe_id, fl_id, type, sign) VALUES(#{projectId}, #{id2}, #{id1}, #{type}, 1)")
+//    fun pe2fl(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 资产与竖井关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             资产ID
+     * @param   id2             竖井ID
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO public.r_pe_in_sh(project_id, equip_id, shaft_id, sign) VALUES(#{projectId}, #{id1}, #{id2}, 1)")
+    fun pe2sh(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 资产与空间关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             资产ID
+     * @param   id2             空间ID
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO relationship.r_pe2sp(project_id, pe_id, sp_id, type, sign) VALUES(#{projectId}, #{id1}, #{id2}, #{type}, 1)")
+    fun pe2sp(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 建筑与竖井关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             竖井ID
+     * @param   id2             建筑ID
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO public.r_sh_in_bd(project_id, shaft_id, building_id,  sign) VALUES(#{projectId}, #{id1}, #{id2},  1)")
+    fun sh2bd(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 楼层与竖井关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             竖井ID
+     * @param   id2             楼层ID
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO public.r_sh_in_fl(project_id, shaft_id, floor_id, sign) VALUES(#{projectId}, #{id1}, #{id2},  1)")
+    fun sh2fl(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 竖井与竖井关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             竖井ID
+     * @param   id2             竖井ID
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO public.r_sh_through_sh(project_id, shaft_id, shaft_other_id,  sign) VALUES(#{projectId}, #{id1}, #{id2}, 1)")
+    fun sh2sh(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 竖井与空间关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             竖井ID
+     * @param   id2             空间ID
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO relationship.r_sh2sp(project_id, sh_id, sp_id, type, sign) VALUES(#{projectId}, #{id1}, #{id2}, #{type}, 1)")
+    fun sh2sp(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 建筑与空间关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             建筑ID
+     * @param   id2             空间ID
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO relationship.r_sp2bd(project_id, sp_id, bd_id, type, sign) VALUES(#{projectId}, #{id2}, #{id1}, #{type}, 1)")
+    fun sp2bd(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 楼层与空间关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             楼层ID
+     * @param   id2             空间ID
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO relationship.r_sp2fl(project_id, sp_id, fl_id, type, sign) VALUES(#{projectId}, #{id2}, #{id1}, #{type}, 1)")
+    fun sp2fl(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 空间与空间关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             空间ID
+     * @param   id2             空间ID
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO relationship.r_sp2sp(project_id, id1, id2, type, sign) VALUES(#{projectId}, #{id1}, #{id2}, #{type}, 1)")
+    fun sp2sp(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 建筑与竖井关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             系统ID
+     * @param   id2             建筑ID
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO public.r_sy_in_bd(project_id, sys_id, building_id,  sign) VALUES(#{projectId}, #{id1}, #{id2},  1)")
+    fun sy2bd(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 建筑与竖井关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             系统ID
+     * @param   id2             楼层ID
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO public.r_sy_in_fl(project_id, sys_id, floor_id,  sign) VALUES(#{projectId}, #{id1}, #{id2},  1)")
+    fun sy2fl(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 系统与竖井关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             系统ID
+     * @param   id2             竖井ID
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO public.r_sy_in_sh(project_id, sys_id, shaft_id,  sign) VALUES(#{projectId}, #{id1}, #{id2},  1)")
+    fun sy2sh(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 系统与空间关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             系统ID
+     * @param   id2             空间ID
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO relationship.r_sy2sp(project_id, sy_id, sp_id, type, sign) VALUES(#{projectId}, #{id1}, #{id2}, #{type}, 1)")
+    fun sy2sp(projectId: String, type: String, id1: String, id2: String)
+
+    /**
+     * 租户与空间关系
+     *
+     * @param   projectId       项目ID
+     * @param   type            关系类型
+     * @param   id1             租户ID
+     * @param   id2             空间ID
+     * @return  excel需要的记录
+     */
+    @Insert("INSERT INTO relationship.r_tn2sp(project_id, tn_id, sp_id, type, sign) VALUES(#{projectId}, #{id1}, #{id2}, #{type}, 1)")
+    fun tn2sp(projectId: String, type: String, id1: String, id2: String)
+} // Interface IRelationExcelImportMapper

+ 46 - 0
data-center/src/main/kotlin/com/persagy/server/mappers/MepSystemMapper.kt

@@ -0,0 +1,46 @@
+package com.persagy.server.mappers
+
+import com.persagy.server.datacenter.models.entities.graphtype.block.ConnectedBlockSource
+import com.persagy.server.datacenter.models.entities.graphtype.block.EquipIdUUIDMap
+import com.persagy.server.datacenter.models.entities.task.SpaceType
+import org.apache.ibatis.annotations.Mapper
+import org.apache.ibatis.annotations.Param
+import org.apache.ibatis.annotations.Select
+import org.apache.ibatis.annotations.SelectProvider
+import org.springframework.stereotype.Repository
+
+@Mapper
+@Repository
+interface MepSystemMapper {
+
+    /**
+     * 根据BIMID获取设备
+     *@param projectId 项目id
+     *@param tables 参与计算的表的全名称, 带schema名, 以英文逗号隔开
+     */
+    @SelectProvider(type = RelationProvider::class , method = "getEquipByBimId")
+    fun getEquipByBimId(@Param("projectId") projectId: String, @Param("buildingId") buildingId : String?, @Param("mepSystemType") mepSystemType: ArrayList<String>,
+                      @Param("bimId") bimId: ArrayList<String>): ArrayList<ConnectedBlockSource>
+
+    /**
+     * 获取模型里的设备uuid到数据中心设备的映射
+     *@param projectId 项目id
+     *@param equipIds 设备uuid集合
+     */
+    @SelectProvider(type = RelationProvider::class , method = "getEquipIdUUIDMap")
+    fun getDCEquipModelEquipMap(@Param("projectId") projectId: String, @Param("equipIds") equipIds : Set<String>): ArrayList<EquipIdUUIDMap>
+
+    /**
+     * 获取模型里的部件uuid到数据中心部件的映射
+     *@param projectId 项目id
+     *@param equipPartIds 部件uuid集合
+     */
+    @SelectProvider(type = RelationProvider::class , method = "getEquipPartIdUUIDMap")
+    fun getDCEquipPartModelEquipPartMap(@Param("projectId") projectId: String, @Param("equipPartIds") equipPartIds : Set<String>): ArrayList<EquipIdUUIDMap>
+
+
+    @Select("SELECT s.object_type as type,d.name  FROM zone_space_base s LEFT JOIN dict.dict_space_project d ON s.object_type = d.id WHERE s.project_id = #{projectId} AND d.project_id = #{projectId}  GROUP BY object_type, d.name")
+    fun getObjectType(projectId: String):ArrayList<SpaceType>
+
+
+} // Interface MepSystemMapper

+ 171 - 0
data-center/src/main/kotlin/com/persagy/server/mappers/RelationProvider.kt

@@ -0,0 +1,171 @@
+package com.persagy.server.mappers
+
+import org.apache.ibatis.jdbc.SQL
+import org.slf4j.LoggerFactory
+import java.util.*
+
+
+/**
+ * 关系SQL提供器
+ *
+ * @author  庞利祥<sybotan@126.com>
+ */
+class RelationProvider {
+    companion object {
+        // 日志
+        private val logger = LoggerFactory.getLogger(RelationProvider::class.java)
+    }
+
+    /**
+     * 查询对象ID
+     *
+     * @param   projectId           项目ID
+     */
+    fun findObjectId(projectId: String, table: String, code: String, codeValue: String): String {
+        val sql = object: SQL() {
+            init {
+                SELECT("id")
+                FROM(table)
+                WHERE("\"$code\"='$codeValue'")
+                WHERE("\"project_id\"='$projectId'")
+            }
+        }.toString()
+        return sql
+    } // Fun findObjectId()
+
+
+    /**
+     * 获取模型里的设备uuid到数据中心设备的映射
+     *
+     * @param   projectId           项目ID
+     * @param   equipIds            设备在模型里的uuid
+     */
+    fun getEquipIdUUIDMap(projectId: String, equipIds : Set<String>): String {
+        val uuids = concateStr(equipIds)
+        val sql = object: SQL() {
+            init {
+                //select eq.id equipId, deq.id revitUUID from revit.equipment eq inner join public.equipment deq on deq.bim_id = eq.bimid where eq.id in ('') and deq.project_id = ''
+                SELECT("eq.id equipId, deq.id revitUUID")
+                FROM("revit.equipment eq")
+                INNER_JOIN("public.equipment deq on deq.bim_id = eq.bimid")
+                WHERE("eq.id in (${uuids}) and deq.project_id = '${projectId}'")
+            }
+        }.toString()
+        return sql
+    } // Fun findObjectId()
+
+    /**
+     * 获取模型里的设备uuid到数据中心设备的映射
+     *
+     * @param   projectId           项目ID
+     * @param   equipIds            设备在模型里的uuid
+     */
+    fun getEquipPartIdUUIDMap(projectId: String, equipIds : Set<String>): String {
+        val uuids = concateStr(equipIds)
+        val sql = object: SQL() {
+            init {
+                //select eq.id equipId, deq.id revitUUID from revit.equipment eq inner join public.equipment deq on deq.bim_id = eq.bimid where eq.id in ('') and deq.project_id = ''
+                SELECT("eq.id equipId, deq.id revitUUID")
+                FROM("revit.component eq")
+                INNER_JOIN("public.equipment deq on deq.bim_id = eq.bimid")
+                WHERE("eq.id in (${uuids}) and deq.project_id = '${projectId}'")
+            }
+        }.toString()
+        return sql
+    } // Fun findObjectId()
+
+    /**
+     * 获取分块中指定bimid 的对象
+     *
+     * @param   projectId           项目ID
+     */
+    fun getEquipByBimId(projectId: String, buildingId : String?, mepSystemType: ArrayList<String>, bimId: ArrayList<String>): String {
+        var mepStr = concateStr(mepSystemType)
+        var bimStr = concateStr(bimId)
+        val sql1 = object: SQL() {
+            init {
+                SELECT("id1 sourceId, block.project_id projectId, block.block_id blockId, block.type1 as sourceType, domain, mep_system_type mepSystemType, building_id buildingId")
+                FROM("revit_calc.connected_block block")
+                INNER_JOIN("revit.equipment eq on eq.id = block.id1")
+                WHERE("block.project_id = '${projectId}'")
+                AND()
+                WHERE("mep_system_type in (${mepStr})")
+                AND()
+                WHERE("bimid in (${bimStr})")
+                if(buildingId != null) {
+                    AND()
+                    WHERE("building_id = '${buildingId}'")
+                }
+            }
+        }.toString()
+
+        val sql2 = object: SQL() {
+            init {
+                SELECT("id2 sourceId, block.project_id projectId, block.block_id blockId, block.type2 as sourceType, domain, mep_system_type mepSystemType, building_id buildingId")
+                FROM("revit_calc.connected_block block")
+                INNER_JOIN("revit.equipment eq on eq.id = block.id2")
+                WHERE("block.project_id = '${projectId}'")
+                AND()
+                WHERE("mep_system_type in (${mepStr})")
+                AND()
+                WHERE("bimid in (${bimStr})")
+                if(buildingId != null) {
+                    AND()
+                    WHERE("building_id = '${buildingId}'")
+                }
+            }
+        }.toString()
+        println(sql1)
+        println(sql2)
+        return "${sql1} union ${sql2}"
+    } // Fun getEquipByBimId()
+
+    fun concateStr(arr : Collection<String>) : String{
+        var stringBuilder = StringBuilder()
+        arr.forEach {
+            stringBuilder.append("\'").append(it).append("\',")
+        }
+        if(stringBuilder.endsWith(',')){
+            stringBuilder.deleteCharAt(stringBuilder.length - 1) //.removeSuffix(",")
+        }
+        return stringBuilder.toString()
+    }
+
+    /**
+     * 获取模型里的设备uuid到数据中心设备的映射
+     *
+     * @param   projectId           项目ID
+     * @param   equipIds            设备在模型里的uuid
+     */
+//    fun getEquipSql(projectId: String,modelId: String, ids : ArrayList<String>): String {
+//
+//        val sql = object: SQL() {
+//            init {
+//                //select eq.id equipId, deq.id revitUUID from revit.equipment eq inner join public.equipment deq on deq.bim_id = eq.bimid where eq.id in ('') and deq.project_id = ''
+//
+//                val list: List<String> = ArrayList()
+//                for (i in ids.indices) {
+//                    if (i == 0){
+//                        SELECT("*")
+//                        FROM("equipment e")
+//                        WHERE(" project_id = '${projectId}' AND bim_location  IS NOT null  AND model_id = '${modelId}' AND is_point_in_polygon_v2_str(split_part(e.bim_location, E',', 1) , split_part(e.bim_location, E',', 2) , (SELECT outline FROM zone_ispace WHERE project_id= '${projectId}' AND bim_id = '${id}'))")
+//                    }else if(i == ids.size-1 ){
+//
+//                    } else{
+//                        Union
+//                    }
+//                }
+//
+//
+//               for (id in ids){
+//
+//
+//               }
+//
+//
+//            }
+//        }.toString()
+//        return sql
+//    } // Fun findObjectId()
+
+} // Class RelationProvider

+ 15 - 0
data-center/src/main/kotlin/com/persagy/server/mappers/RelationalProcessingMapper.kt

@@ -0,0 +1,15 @@
+package com.persagy.server.mappers
+
+import com.persagy.server.datacenter.models.entities.graphtype.rel.RelShaft
+import org.apache.ibatis.annotations.Mapper
+import org.apache.ibatis.annotations.Select
+import org.springframework.stereotype.Repository
+
+@Mapper
+@Repository
+interface RelationalProcessingMapper {
+
+    @Select("SELECT id,name,local_id,local_name FROM #{tableName} WHERE project_id = #{projectId} AND #{obj} = #{value}")
+    fun queryObject(tableName: String,projectId: String,obj: String,value: String):ArrayList<RelShaft>
+
+} // Interface RelationalProcessingMapper

+ 157 - 0
data-center/src/main/kotlin/com/persagy/server/mappers/StatisticsCountMapper.kt

@@ -0,0 +1,157 @@
+package com.persagy.server.mappers
+
+import com.persagy.server.datacenter.models.entities.task.CategoryStatistics
+import com.persagy.server.datacenter.models.entities.task.EquipmentTaskTwo
+import com.persagy.server.datacenter.models.response.StatisticsCountResponse
+import org.apache.ibatis.annotations.Mapper
+import org.apache.ibatis.annotations.Select
+import org.springframework.stereotype.Repository
+
+/**
+ * 统计
+ *
+ * @author 邓婷婷
+ */
+@Mapper
+@Repository
+interface StatisticsCountMapper {
+
+    /**
+     * 竖井-楼层  不能同步到物理世界的关系数量
+     */
+    @Select(" select COALESCE(sum(num),0) from " +
+            "(select count(distinct shaft_id) num from r_sh_in_fl  where project_id = #{projectId} group by shaft_id HAVING count(floor_id)>1) a")
+    fun sh2flCount(projectId: String): Long
+
+    /**
+     * 竖井-建筑  不能同步到物理世界的关系数量
+     */
+    @Select(" select COALESCE(sum(num),0) from " +
+            "(select count(distinct shaft_id) num from r_sh_in_bd  where project_id = #{projectId} and shaft_id not in " +
+            "(select shaft_id from r_sh_in_fl  where project_id = #{projectId} group by shaft_id HAVING count(floor_id)>1) group by shaft_id HAVING count(building_id)>1) a")
+    fun sh2bdCount(projectId: String): Long
+
+
+    /**
+     * 系统-楼层  不能同步到物理世界的关系数量
+     */
+    @Select(" select COALESCE(sum(num),0) from " +
+            "(select count(distinct sys_id) num from r_sy_in_fl  where project_id = #{projectId} group by sys_id HAVING count(floor_id)>1) a ")
+    fun sy2flCount(projectId: String): Long
+
+    /**
+     * 系统-建筑  不能同步到物理世界的关系数量
+     */
+    @Select(" select COALESCE(sum(num),0) from " +
+            "(select count(distinct sys_id) num from r_sy_in_bd  where project_id = #{projectId} and sys_id not in " +
+            "(select sys_id from r_sy_in_fl  where project_id = #{projectId} group by sys_id HAVING count(floor_id)>1) group by sys_id HAVING count(building_id)>1) a")
+    fun sy2bdCount(projectId: String): Long
+
+
+    /**
+     * 岗位和关联的资产信息点值不一致
+     */
+    @Select(" select count(p.id) from " +
+            "property p,equipment e where " +
+            "p.equip_id = e.id  and p.project_id = #{projectId} and " +
+            "(COALESCE(p.name,'') != COALESCE(e.name,'')  or COALESCE(p.local_id,'') != COALESCE(e.local_id,'')  or COALESCE(p.local_name,'') != COALESCE(e.local_name,'') or " +
+            "COALESCE(p.qr_code,'') != COALESCE(e.qr_code,'') or COALESCE(p.cad_id,'') != COALESCE(e.cad_id,'') or COALESCE(p.bim_id,'') != COALESCE(e.bim_id,'') or " +
+            "COALESCE(p.bim_location,'') != COALESCE(e.bim_location,'') or COALESCE(p.building_id,'') != COALESCE(e.building_id,'') or " +
+            "COALESCE(p.floor_id,'') != COALESCE(e.floor_id,'') or COALESCE(p.ledger_param ::text,'') != COALESCE(e.ledger_param ::text,'') or COALESCE(p.comm_param ::text,'') != COALESCE(e.comm_param ::text,'') or " +
+            "COALESCE(p.tech_param ::text,'') != COALESCE(e.tech_param ::text,'') or COALESCE(p.run_param ::text,'') != COALESCE(e.run_param ::text,'') or COALESCE(p.setting_param ::text,'') != COALESCE(e.setting_param ::text,'') or " +
+            "COALESCE(p.alram ::text,'') != COALESCE(e.alram ::text,'') or COALESCE(p.custom_param ::text,'') != COALESCE(e.custom_param ::text,'') or COALESCE(p.dp_manufacturer_id,'') != COALESCE(e.dp_manufacturer_id,'') or " +
+            "COALESCE(p.dp_supplier_id,'') != COALESCE(e.dp_supplier_id,'') or COALESCE(p.dp_maintainer_id,'') != COALESCE(e.dp_maintainer_id,'') or COALESCE(p.dp_insurer_id,'') != COALESCE(e.dp_insurer_id,'') or " +
+            "COALESCE(p.temp_sensor ::text,'') != COALESCE(e.temp_sensor ::text,'') or COALESCE(p.tech_param_general ::text,'') != COALESCE(e.tech_param_general ::text,'') or " +
+            "COALESCE(p.run_param_general ::text,'') != COALESCE(e.run_param_general ::text,'') or COALESCE(p.speed_sensor ::text,'') != COALESCE(e.speed_sensor ::text,'') or " +
+            "COALESCE(p.sound_sensor ::text,'') != COALESCE(e.sound_sensor ::text,'') or COALESCE(p.humidity_sensor ::text,'') != COALESCE(e.humidity_sensor ::text,'') or " +
+            "COALESCE(p.press_transd ::text,'') != COALESCE(e.press_transd ::text,'') or COALESCE(p.heat_sensor ::text,'') != COALESCE(e.heat_sensor ::text,'') or COALESCE(p.flow_sensor ::text,'') != COALESCE(e.flow_sensor ::text,'') or " +
+            "COALESCE(p.electricity_sensor ::text,'') != COALESCE(e.electricity_sensor ::text,'') or COALESCE(p.displ_sensor ::text,'') != COALESCE(e.displ_sensor ::text,'') or " +
+            "COALESCE(p.concent_sensor ::text,'') != COALESCE(e.concent_sensor ::text,'') or COALESCE(p.image_sensor ::text,'') != COALESCE(e.image_sensor ::text,'') or " +
+            "COALESCE(p.feedback_param ::text,'') != COALESCE(e.feedback_param ::text,'') or COALESCE(p.man_flow_sensor ::text,'') != COALESCE(e.man_flow_sensor ::text,'') or " +
+            "COALESCE(p.dp_specification_id,'') != COALESCE(e.dp_specification_id,'') or COALESCE(p.dp_brand_id,'') != COALESCE(e.dp_brand_id,'') or COALESCE(p.equip_serial,0) != COALESCE(e.equip_serial,0))")
+    fun eq2peCount(projectId: String): Long
+
+
+    /**
+     * 岗位和关联的资产信息点值不一致数据
+     */
+    @Select("select p.name,p.local_id,p.local_name,p.qr_code,p.cad_id,p.bim_id,p.bim_location,p.ledger_param,p.comm_param,p.tech_param,p.run_param," +
+            "p.setting_param,p.alram,p.custom_param,p.dp_manufacturer_id,p.dp_supplier_id,p.dp_maintainer_id,p.dp_insurer_id,p.temp_sensor,p.tech_param_general," +
+            "p.run_param_general,p.speed_sensor,p.sound_sensor,p.humidity_sensor,p.press_transd,p.heat_sensor,p.flow_sensor,p.electricity_sensor,p.displ_sensor," +
+            "p.concent_sensor,p.image_sensor,p.feedback_param,p.man_flow_sensor,p.dp_specification_id,p.dp_brand_id,p.equip_serial,e.name as _name," +
+            "e.local_id as _local_id,e.local_name as _local_name,e.qr_code as _qr_code,e.cad_id as _cad_id,e.bim_id as _bim_id,e.bim_location as _bim_location," +
+            "e.ledger_param as _ledger_param,e.comm_param as _comm_param,e.tech_param as _tech_param,e.run_param as _run_param,e.setting_param as _setting_param," +
+            "e.alram as _alram,e.custom_param as _custom_param,e.dp_manufacturer_id as _dp_manufactuer_id,e.dp_supplier_id as _dp_supplier_id,e.dp_maintainer_id as _dp_maintainer_id," +
+            "e.dp_insurer_id as _dp_insurer_id,e.temp_sensor as _temp_sensor,e.tech_param_general as _tech_param_general,e.run_param_general as _run_param_general," +
+            "e.speed_sensor as _speed_sensor,e.sound_sensor as _sound_sensor,e.humidity_sensor as _humidity_sensor,e.press_transd as _press_transd,e.heat_sensor as _heat_sensor," +
+            "e.flow_sensor as _flow_sensor,e.electricity_sensor as _electricity_sensor,e.displ_sensor as _displ_sensor,e.concent_sensor as _concent_sensor," +
+            "e.image_sensor as _image_sensor,e.feedback_param as _feedback_param,e.man_flow_sensor as _man_flow_sensor,e.dp_specification_id as _dp_specification_id," +
+            "e.dp_brand_id as _dp_brand_id,e.equip_serial as _equip_serial from property p,equipment e where p.equip_id = e.id  and p.project_id =#{projectId}")
+    fun eq2peDifferent(projectId: String): ArrayList<HashMap<String,Any>>
+
+
+
+
+    /**
+     * 设备-未关联资产的设备
+     */
+    @Select("select count(id) from equipment where id not in (select equip_id from property where equip_id is not null and project_id = #{projectId}) and project_id = #{projectId}")
+    fun uneq2peCount(projectId: String): Long
+
+
+    /**
+     * 业务空间-各分区占比
+     */
+    @Select("select object_type as name,count(id) as count from zone_space_base where object_type is not null and project_id = #{projectId} group by object_type")
+    fun spObjectTypeCount(projectId: String): ArrayList<StatisticsCountResponse>
+
+    /**
+     * 业务空间-默认分区功能类型占比
+     */
+    @Select("select func_type as name , count(id) as count from zone_space_base where func_type is not null and project_id = #{projectId}  AND object_type = 'GeneralZone' group by func_type")
+    fun generalSpFuncTypeCount(projectId: String): ArrayList<StatisticsCountResponse>
+
+    /**
+     * 租户-关联业务空间完成度
+     */
+    @Select("select count(distinct tn_id) from relationship.r_tn2sp where project_id = #{projectId} and type = 'tn2sp'")
+    fun tenant2SpCount(projectId: String): Long
+
+    /**
+     * 竖井-关联业务空间完成度
+     */
+    @Select("select count(distinct sh_id) from relationship.r_sh2sp where project_id = #{projectId} and type = 'sh2sp'")
+    fun shaft2SpCount(projectId: String): Long
+
+    /**
+     * 竖井-按功能类型占比
+     */
+    @Select("select structure_info#>>'{ShaftFuncType}' as name ,count(id) as count  from shaft where  project_id = #{projectId} AND NOT structure_info#>>'{ShaftFuncType}' is null GROUP BY structure_info#>>'{ShaftFuncType}'")
+    fun shaftFuncTypeCount(projectId: String): ArrayList<StatisticsCountResponse>
+
+    /**
+     * 统计设备任务下的部件类型以及数量
+     */
+    @Select("SELECT category as code,(SELECT name FROM dict.class_def WHERE id = category) as name, COUNT(category) FROM scantask.equip_scan_task WHERE task_parent_id = #{id} AND parent_id = #{equipId} GROUP BY category")
+    fun categoryStatistics(id: String,equipId: String): ArrayList<CategoryStatistics>
+
+    /**
+     * 统计模型设备部件类型以及数量
+     */
+    @Select("SELECT category as code,(SELECT name FROM dict.class_def WHERE id = category) as name, COUNT(category) FROM scantask.model_scan_task WHERE task_parent_id = #{id} AND parent_id = #{equipId} GROUP BY category")
+    fun categoryStatisticsModel(id: String,equipId: String): ArrayList<CategoryStatistics>
+
+    /**
+     * 查询 当前模型文件下指定元空间内的设备
+     */
+    @Select("SELECT id,name,local_id,local_name,cad_id,bim_id,category FROM equipment e WHERE project_id = #{projectId} AND bim_location  IS NOT null  AND model_id = #{modelId} AND is_point_in_polygon_v2_str(split_part(e.bim_location, E',', 1) , split_part(e.bim_location, E',', 2) , (SELECT outline FROM zone_ispace WHERE project_id= #{projectId} AND bim_id = #{bimId})) AND (e.task_state IS null OR e.task_state = 0 OR task_state = -1) ORDER BY create_time , e.id")
+    fun equipInISpace(projectId: String,modelId: String,bimId: String): ArrayList<EquipmentTaskTwo>
+
+    /**
+     * 查询 当前模型文件下指定元空间内的设备
+     */
+    @Select("SELECT id,name,local_id,local_name,cad_id,bim_id,category FROM equipment e WHERE project_id = #{projectId} AND bim_location  IS NOT null AND category = #{category} AND model_id = #{modelId} AND is_point_in_polygon_v2_str(split_part(e.bim_location, E',', 1) , split_part(e.bim_location, E',', 2) , (SELECT outline FROM zone_ispace WHERE project_id= #{projectId} AND bim_id = #{bimId})) AND (e.task_state IS null OR e.task_state = 0 OR task_state = -1) ORDER BY create_time , e.id")
+    fun equipInISpaceTwo(projectId: String,modelId: String,bimId: String,category: String): ArrayList<EquipmentTaskTwo>
+
+
+} // Interface StatisticsCountMapper

+ 4 - 0
data-center/src/main/kotlin/com/persagy/server/services/a.java

@@ -0,0 +1,4 @@
+package com.persagy.server.services;
+
+public class a {
+}

+ 65 - 0
data-center/src/main/kotlin/com/persagy/server/services/assistant/ObjInfoService.kt

@@ -0,0 +1,65 @@
+package com.persagy.server.services.assistant
+
+import com.persagy.server.datacenter.models.entities.assistant.ObjInfos
+import com.persagy.server.datacenter.models.entities.tool.ObjectBaseRequest
+import com.persagy.server.services.dict.PropertyDefProjectService
+import com.sybotan.base.extensions.toJson
+import com.sybotan.base.extensions.toMap
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SObjectService
+import org.json.JSONObject
+import java.text.SimpleDateFormat
+import java.util.*
+
+/**
+ * 信息点服务
+ * @author  蔡云飞
+ */
+object ObjInfoService :  SObjectService<ObjInfos>(SMybatisDao(ObjInfos::class.java)) {
+
+    private val SIMPLEDATEFORMAT_DC = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
+    /**
+     * @Description: 查找创建或更新信息点
+     * @Param: entity,flag,objType,type
+     */
+    fun createInfo(entity: Any, flag: Boolean,objType: String,type: String){
+        var request = ObjectBaseRequest()
+        val infos = JSONObject(entity.toJson())
+        val map = entity.toMap()
+        val iterator = infos.keys()
+        while (iterator.hasNext()) {
+            val key = iterator.next()
+            val value = infos.get(key as String)
+            if (value!=null&&value.toString()!="null"){
+                request.addInfo(key, value, false)
+            }
+        }
+        val pro = PropertyDefProjectService.select(SFilter.eq("projectId",map["projectId"].toString()), SFilter.eq("type",type), SFilter.or(SFilter.eq("inputMode","L"), SFilter.eq("inputMode","M"))).exec()
+        val requestInfos = request.infos
+        if(requestInfos!=null){
+            if(pro!=null){
+
+                for (propertyDefProjectInfo in pro) {
+                    val infoPointCode = propertyDefProjectInfo.infoPointCode
+                    if(requestInfos.containsKey(infoPointCode)){
+                        var objInfos = ObjInfos()
+                        objInfos.objType = objType
+                        objInfos.projectId = map["projectId"].toString()
+                        objInfos.objId = map["id"].toString()
+                        objInfos.infoId = infoPointCode
+                        objInfos.value = requestInfos[infoPointCode].toString()
+                        if(flag){
+                            objInfos.time = SIMPLEDATEFORMAT_DC.format(Date())
+                            insert(objInfos)
+                        }else{
+                            objInfos.time = SIMPLEDATEFORMAT_DC.format(map["lastUpdate"].toString())
+                            update(objInfos)
+                        }
+                    }
+                }
+            }
+        }
+    } // Fun
+
+} // Object ObjInfoService

+ 116 - 0
data-center/src/main/kotlin/com/persagy/server/services/assistant/RUpDateEquipAndSapceService.kt

@@ -0,0 +1,116 @@
+package com.persagy.server.services.assistant
+
+import com.persagy.server.datacenter.models.entities.graphtype.RelationTypeProject
+import com.persagy.server.datacenter.models.requests.RUpDateEquipAndSapceRequest
+import com.persagy.server.services.objects.FloorService
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.utils.SSpringContextUtil
+import org.slf4j.LoggerFactory
+
+/**
+ * 模型修改设备和元空间建筑楼层
+ *
+ * @author 张维新
+ */
+object RUpDateEquipAndSapceService {
+        /** 日志 */
+        private val logger = LoggerFactory.getLogger(RUpDateEquipAndSapceService::class.java)
+
+        /** 自定义SQL 对象 */
+        val schemeService by lazy {
+            SSpringContextUtil.getBean(SchemeService::class.java) as SchemeService
+        }
+    /** 关系总览服务 */
+    val relationTypeProjectservice = SBaseService(SMybatisDao(RelationTypeProject::class.java))
+
+
+    /**
+     * 修改设备和元空间的建筑楼层信息
+     */
+    fun rUpDateEquipAndSapces(rUpDateEquipAndSapceRequest: RUpDateEquipAndSapceRequest): SBaseResponse {
+        return try {
+            val sBaseResponse = SBaseResponse()
+            val projectId = SPageContext.getHeader("ProjectId")
+
+            /** 模型重新上传做标记 */
+            try {
+                /** 查询模型文件是否有楼层在使用 */
+                val floorList = FloorService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("modelId", rUpDateEquipAndSapceRequest.modelId!!)).exec()
+                if (floorList.size>0){
+                    val list = ArrayList<String>()
+                    for (floor in floorList){
+                        if (!floor.outline.isNullOrEmpty()){
+                            list.add("eq2fl")
+                            list.add("fl2sp")
+                            list.add("bd2sp")
+                            break
+                        }
+                    }
+                    list.add("eq2sp_in")
+                    list.add("eq2eq_ACAirNetwork_2")
+                    list.add("eq2eq_CondWaterNetwork_1")
+                    list.add("eq2eq_VentNetwork_2")
+                    list.add("eq2eq_ACAirNetwork_3")
+                    list.add("eq2eq_HeatWaterLoop_4")
+                    list.add("eq2eq_HeatWaterLoop_1")
+                    list.add("eq2eq_DHWNetwork_1")
+                    list.add("eq2eq_RecycleWaterNetwork_1")
+                    list.add("eq2eq_FireVentNetwork_1")
+                    list.add("eq2eq_FireWaterNetwork_1")
+                    list.add("eq2eq_VRFNetwork_1")
+                    list.add("eq2eq_ChillWaterLoop_2")
+                    list.add("eq2eqFreshAirNetwork_1")
+                    list.add("eq2eq_ChillWaterLoop_1")
+                    list.add("eq2eq_DrinkingWaterNetwork_1")
+                    list.add("eq2eq_CoolingWaterLoop_2")
+                    list.add("eq2eq_VentNetwork_1")
+                    list.add("eq2eq_HeatWaterLoop_2")
+//                    list.add("eq2eq_CoolingWaterLoop_1")
+                    list.add("eq2eq_ACAirNetwork_1")
+                    list.add("eq2eq_SupplyWaterNetwork_1")
+                    list.add("eq2eq_DrainingWaterNetwork_1")
+
+                    for (type in list){
+                        val entityList = relationTypeProjectservice.select(SFilter.eq("projectId", projectId), SFilter.eq("relationType", type)).exec()
+                        if (entityList.size>0){
+                            for (entity in entityList){
+                                entity.computationalState = 2
+                                relationTypeProjectservice.update(entity)
+                            }
+                        }
+                    }
+                }
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            val rupdateEquipiSpace = schemeService.rupdateEquipiSpace(projectId!!, rUpDateEquipAndSapceRequest.oldBimId, rUpDateEquipAndSapceRequest.bimId!!, rUpDateEquipAndSapceRequest.floorId!!
+                    ,rUpDateEquipAndSapceRequest.floorMap!!,rUpDateEquipAndSapceRequest.modelId!!,rUpDateEquipAndSapceRequest.attributeMap)
+            if (rupdateEquipiSpace){
+                try {
+
+                    val entity = relationTypeProjectservice.select(SFilter.eq("projectId", projectId), SFilter.eq("relationTypeCode", "Fl2Fl")).entity()
+                    if (entity!=null){
+                        entity.computationalState = 2
+                        relationTypeProjectservice.update(entity)
+                    }
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+                sBaseResponse.result = SResponseType.success
+                sBaseResponse
+            }else{
+                sBaseResponse.result = SResponseType.failure
+                sBaseResponse
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SBaseResponse(SResponseType.failure)
+        }
+    } // Function rUpDateEquipAndSapces()
+
+} // RUpDateEquipAndSapceService

+ 153 - 0
data-center/src/main/kotlin/com/persagy/server/services/assistant/SchemeService.kt

@@ -0,0 +1,153 @@
+package com.persagy.server.services.assistant
+
+import com.persagy.server.datacenter.dao.mappers.SchemeMapper
+import com.persagy.server.services.objects.FloorService
+import com.sybotan.database.SFilter
+import org.slf4j.LoggerFactory
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Service
+
+/**
+ * 数据中心 方案导入服务
+ *
+ * @author 张维新
+ */
+@Service
+open class SchemeService {
+
+    companion object {
+        /** 日志 */
+        private val logger = LoggerFactory.getLogger(SchemeService::class.java)
+    } // Companion object
+
+    /** 实例化 mapper 对象 */
+    @Autowired
+    lateinit var mapper: SchemeMapper
+
+    /**
+     * 导入方案处理
+     *
+     * @param      projectId        项目id
+     * @param      schemeId         方案id
+     */
+    fun setScheme(projectId: String, schemeId: String):Boolean{
+        try {
+            mapper.setSchemeDict(projectId,schemeId)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return true
+    } // Function setScheme()
+
+    /**
+     * 导入自定义信息点
+     *
+     * @param      projectId        项目id
+     * @param      schemeId         方案id
+     */
+    fun setSchemeCustomDict(projectId: String, schemeId: String):Boolean{
+        try {
+            mapper.setSchemecustomDict(projectId,schemeId)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return true
+    } // Function setSchemeCustomDict()
+
+    /**
+     * 导入自定义信息点
+     *
+     * @param      projectId        项目id
+     * @param      schemeId         方案id
+     */
+    fun setSchemeCustomDictFalse(projectId: String, schemeId: String):Boolean{
+        try {
+            mapper.setSchemecustomDictFalse(projectId,schemeId)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return true
+    } // Function setSchemeCustomDict()
+
+    /**
+     * 导入原始字典信息
+     *
+     * @param      projectId        项目id
+     */
+    fun setControlDict(projectId: String):Boolean{
+        try {
+            mapper.setControlDict(projectId)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return true
+    } // Function setControlDict()
+
+
+    /**
+     * 处理自定义自定数据
+     */
+    fun setDictCustom():Boolean{
+        try {
+            val dict = mapper.setDict()
+            return dict
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return false
+        }
+    }
+
+    /**
+     * 修改设备和元空间的建筑楼层
+     */
+    fun rupdateEquipiSpace(projectId: String,oldBimId: String?,bimId: String,floorId: String,floorMap: String,modelId: String,attributeMap: HashMap<String,Any>?): Boolean{
+       return  try {
+           var oldBimIdNew = ""
+           if (!oldBimId.isNullOrEmpty()){
+               oldBimIdNew = oldBimId
+           }
+            val rUpDateEquipAndSapce = mapper.rUpDateEquipAndSapce(projectId, oldBimIdNew, bimId, floorId)
+
+           val floorEntity = FloorService.select(SFilter.eq("id", floorId)).entity()
+           if (floorEntity!=null){
+
+               if (!floorEntity.structureInfo.isNullOrEmpty()){
+                   val containsKey = floorEntity.structureInfo!!.containsKey("FloorMap")
+
+                   if (containsKey){
+                       floorEntity.structureInfo!!["FloorMap"] = floorMap
+                   }else{
+                       floorEntity.structureInfo!!["FloorMap"] = floorMap
+                   }
+               }else{
+                   val map = HashMap<String,Any?>()
+                   map["FloorMap"] = floorMap
+                   floorEntity.structureInfo = map
+               }
+               floorEntity.modelId = modelId
+               /** 处理楼层标高 */
+               if (!attributeMap.isNullOrEmpty()&&attributeMap.size>0){
+                   val containsKey = attributeMap.containsKey("FloorElevation")
+                   if (containsKey){
+                       try {
+                           val toDouble = attributeMap["FloorElevation"]!!.toString().toDouble()
+                           if (toDouble!=null){
+                               floorEntity.structureInfo!!["FloorElevation"] = toDouble!!/1000
+                           }
+                       } catch (e: Exception) {
+                           e.printStackTrace()
+                       }
+                   }
+               }
+               var list = ArrayList<SFilter>()
+               list.add(SFilter.eq("id",floorId))
+               FloorService.update(floorEntity,null,list)
+           }
+           return rUpDateEquipAndSapce
+        } catch (e: Exception) {
+            e.printStackTrace()
+            false
+        }
+    } // Fun
+
+} // Class SchemeService

+ 12 - 0
data-center/src/main/kotlin/com/persagy/server/services/assistant/ShaftBuildingService.kt

@@ -0,0 +1,12 @@
+package com.persagy.server.services.assistant
+
+import com.persagy.server.datacenter.models.entities.rel.ShaftBuilding
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+
+/**
+ * 竖井和建筑关系服务
+ *
+ * @author 张维新
+ */
+object ShaftBuildingService: SBaseService<ShaftBuilding>(SMybatisDao(ShaftBuilding::class.java))

+ 12 - 0
data-center/src/main/kotlin/com/persagy/server/services/assistant/ShaftFloorService.kt

@@ -0,0 +1,12 @@
+package com.persagy.server.services.assistant
+
+import com.persagy.server.datacenter.models.entities.rel.ShaftFloor
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+
+/**
+ * 竖井和楼层关系服务
+ *
+ * @author 张维新
+ */
+object ShaftFloorService: SBaseService<ShaftFloor>(SMybatisDao(ShaftFloor::class.java))

+ 583 - 0
data-center/src/main/kotlin/com/persagy/server/services/assistant/StatisticsService.kt

@@ -0,0 +1,583 @@
+package com.persagy.server.services.assistant
+
+import com.persagy.server.datacenter.models.response.EqpeDefferentReqponse
+import com.persagy.server.datacenter.models.response.StatisticsCountResponse
+import com.persagy.server.mappers.StatisticsCountMapper
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.responses.SCountResponse
+import com.sybotan.service.models.responses.SQueryResponse
+// import org.checkerframework.checker.units.qual.A
+import org.slf4j.LoggerFactory
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Service
+import java.util.*
+import kotlin.collections.ArrayList
+import kotlin.collections.HashMap
+
+
+/**
+ * 统计
+ *
+ * @author  邓婷婷
+ */
+@Service
+open class StatisticsService{
+
+    // 日志
+    private val logger = LoggerFactory.getLogger(StatisticsService::class.java)
+
+
+    /** 实例化 mapper 对象 */
+    @Autowired
+    lateinit var mapper: StatisticsCountMapper
+
+    /**
+     * 不能同步到物理世界的关系数据
+     */
+    fun unSynchronizeRelation(): SCountResponse {
+        val projectId = SPageContext.getHeader("ProjectId").toString()
+        val count1 = mapper.sh2bdCount(projectId)
+        val count2 = mapper.sh2flCount(projectId)
+        val count3 = mapper.sy2bdCount(projectId)
+        val count4 = mapper.sy2flCount(projectId)
+        val resultCount = count1 + count2 + count3 + count4
+        return SCountResponse(resultCount)
+    }
+
+    /**
+     * 岗位和关联的资产信息点值不一致
+     */
+    fun eq2peCount(): SCountResponse {
+        val projectId = SPageContext.getHeader("ProjectId").toString()
+        val count = mapper.eq2peCount(projectId)
+        return SCountResponse(count)
+    }
+
+    /**
+     * 岗位和关联的资产信息点值不一致数据
+     */
+    fun eq2peDifferent(): SQueryResponse<ArrayList<EqpeDefferentReqponse>>{
+        return try {
+            val projectId =  SPageContext.getHeader("ProjectId").toString()
+
+            var list=ArrayList<EqpeDefferentReqponse>()
+            //岗位和关联的资产数据
+            var lis=mapper.eq2peDifferent(projectId)
+            for (li in lis) {
+                var eqpeDefferentReqponse=EqpeDefferentReqponse()
+                var property= TreeMap<String,Any>()
+                var equipment=TreeMap<String,Any>()
+                if (li["name"]!=li["_name"]){
+                    if (li["name"]==null){
+                        property["资产名称"]=" "
+                    }else{
+                        property["资产名称"]= li["name"] as Any
+                    }
+                    if (li["_name"]==null){
+                        equipment["岗位名称"]=" "
+                    }else{
+                        equipment["岗位名称"]= li["_name"] as Any
+                    }
+
+                }
+                if (li["local_id"]!=li["_local_id"]){
+                    if (li["local_id"]==null){
+                        property["资产本地编码"]=" "
+                    }else{
+                        property["资产本地编码"] = li["local_id"] as Any
+                    }
+                    if (li["_local_id"]==null){
+                        equipment["岗位本地编码"]=" "
+                    }else{
+                        equipment["岗位本地编码"] = li["_local_id"] as Any
+                    }
+                }
+                if (li["local_name"]!=li["_local_name"]){
+                    if (li["local_name"]==null){
+                        property["资产本地名称"]=" "
+                    }else{
+                        property["资产本地名称"] = li["local_name"] as Any
+                    }
+                    if (li["_local_name"]==null){
+                        equipment["岗位本地名称"]=" "
+                    }else{
+                        equipment["岗位本地名称"] = li["_local_name"] as Any
+                    }
+                }
+                if (li["qr_code"]!=li["_qr_code"]){
+                    if (li["qr_code"]==null){
+                        property["资产二维码图片"]=" "
+                    }else{
+                        property["资产二维码图片"] = li["qr_code"] as Any
+                    }
+                    if (li["_qr_code"]==null){
+                        equipment["岗位二维码图片"]=" "
+                    }else{
+                        equipment["岗位二维码图片"] = li["_qr_code"] as Any
+                    }
+                }
+                if (li["cad_id"]!=li["_cad_id"]){
+                    if (li["cad_id"]==null){
+                        property["设计图纸中编码"]=" "
+                    }else{
+                        property["设计图纸中编码"] = li["cad_id"] as Any
+                    }
+                    if (li["_cad_id"]==null){
+                        equipment["设计图纸中编码"]=" "
+                    }else{
+                        equipment["设计图纸中编码"] = li["_cad_id"] as Any
+                    }
+                }
+                if (li["bim_location"]!=li["_bim_location"]){
+                    if (li["bim_location"]==null){
+                        property["BIM模型中坐标"]=" "
+                    }else{
+                        property["BIM模型中坐标"] = li["bim_location"] as Any
+                    }
+                    if (li["_bim_location"]==null){
+                        equipment["BIM模型中坐标"]=" "
+                    }else{
+                        equipment["BIM模型中坐标"] = li["_bim_location"] as Any
+                    }
+                }
+                if (li["bim_id"]!=li["_bim_id"]){
+                    if (li["bim_id"]==null){
+                        property["BIM模型中编码"]=" "
+                    }else{
+                        property["BIM模型中编码"] = li["bim_id"] as Any
+                    }
+                    if (li["_bim_id"]==null){
+                        equipment["BIM模型中编码"]=" "
+                    }else{
+                        equipment["BIM模型中编码"] = li["_bim_id"] as Any
+                    }
+                }
+                if (li["ledger_param"]!=li["_ledger_param"]){
+                    if (li["ledger_param"]==null){
+                        property["台账参数"]=" "
+                    }else{
+                        property["台账参数"] = li["ledger_param"] as Any
+                    }
+                    if (li["_ledger_param"]==null){
+                        equipment["台账参数"]=" "
+                    }else{
+                        equipment["台账参数"] = li["_ledger_param"] as Any
+                    }
+                }
+                if (li["comm_param"]!=li["_comm_param"]){
+                    if (li["comm_param"]==null){
+                        property["通讯参数"]=" "
+                    }else{
+                        property["通讯参数"] = li["comm_param"] as Any
+                    }
+                    if (li["_comm_param"]==null){
+                        equipment["通讯参数"]=" "
+                    }else {
+                        equipment["通讯参数"] = li["_comm_param"] as Any
+                    }
+                }
+                if (li["tech_param"]!=li["_tech_param"]){
+                    if (li["tech_param"]==null){
+                        property["技术参数"]=" "
+                    }else{
+                        property["技术参数"] = li["tech_param"] as Any
+                    }
+                    if (li["_tech_param"]==null){
+                        equipment["技术参数"]=" "
+                    }else{
+                        equipment["技术参数"] = li["_tech_param"] as Any
+                    }
+                }
+                if (li["run_param"]!=li["_run_param"]){
+                    if (li["run_param"]==null){
+                        property["运行参数"]=" "
+                    }else{
+                        property["运行参数"] = li["run_param"] as Any
+                    }
+                    if (li["_run_param"]==null){
+                        equipment["运行参数"]=" "
+                    }else{
+                        equipment["运行参数"] = li["_run_param"] as Any
+                    }
+                }
+                if (li["setting_param"]!=li["_setting_param"]){
+                    if (li["setting_param"]==null){
+                        property["设定参数"]=" "
+                    }else{
+                        property["设定参数"] = li["setting_param"] as Any
+                    }
+                    if (li["_setting_param"]==null){
+                        equipment["设定参数"]=" "
+                    }else{
+                        equipment["设定参数"] = li["_setting_param"] as Any
+                    }
+                }
+                if (li["alram"]!=li["_alram"]){
+                    if (li["alram"]==null){
+                        property["报警信息"]=" "
+                    }else{
+                        property["报警信息"] = li["alram"] as Any
+                    }
+                    if (li["_alram"]==null){
+                        equipment["报警信息"]=" "
+                    }else{
+                        equipment["报警信息"] = li["_alram"] as Any
+                    }
+                }
+                if (li["custom_param"]!=li["_custom_param"]){
+                    if (li["custom_param"]==null){
+                        property["自定义参数"]=" "
+                    }else{
+                        property["自定义参数"] = li["custom_param"] as Any
+                    }
+                    if (li["_custom_param"]==null){
+                        equipment["自定义参数"]=" "
+                    }else{
+                        equipment["自定义参数"] = li["_custom_param"] as Any
+                    }
+                }
+                if (li["dp_manufacturer_id"]!=li["_dp_manufacturer_id"]){
+                    if (li["dp_manufacturer_id"]==null){
+                        property["品牌型号id"]=" "
+                    }else{
+                        property["品牌型号id"] = li["dp_manufacturer_id"] as Any
+                    }
+                    if (li["_dp_manufacturer_id"]==null){
+                        equipment["品牌型号id"]=" "
+                    }else{
+                        equipment["品牌型号id"] = li["_dp_manufacturer_id"] as Any
+                    }
+                }
+                if (li["dp_supplier_id"]!=li["_dp_supplier_id"]){
+                    if (li["dp_supplier_id"]==null){
+                        property["供应商信息id"]=" "
+                    }else{
+                        property["供应商信息id"] = li["dp_supplier_id"] as Any
+                    }
+                    if (li["_dp_supplier_id"]==null){
+                        equipment["供应商信息id"]=" "
+                    }else{
+                        equipment["供应商信息id"] = li["_dp_supplier_id"] as Any
+                    }
+                }
+                if (li["dp_maintainer_id"]!=li["_dp_maintainer_id"]){
+                    if (li["dp_maintainer_id"]==null){
+                        property["维修商信息id"]=" "
+                    }else{
+                        property["维修商信息id"] = li["dp_maintainer_id"] as Any
+                    }
+                    if (li["_dp_maintainer_id"]==null){
+                        equipment["维修商信息id"]=" "
+                    }else{
+                        equipment["维修商信息id"] = li["_dp_maintainer_id"] as Any
+                    }
+                }
+                if (li["dp_insurer_id"]!=li["_dp_insurer_id"]){
+                    if (li["dp_insurer_id"]==null){
+                        property["保险公司信息id"]=" "
+                    }else{
+                        property["保险公司信息id"] = li["dp_insurer_id"] as Any
+                    }
+                    if (li["_dp_insurer_id"]==null){
+                        equipment["保险公司信息id"]=" "
+                    }else{
+                        equipment["保险公司信息id"] = li["_dp_insurer_id"] as Any
+                    }
+                }
+                if (li["temp_sensor"]!=li["_temp_sensor"]){
+                    if (li["temp_sensor"]==null){
+                        property["温度传感器"]=" "
+                    }else{
+                        property["温度传感器"] = li["temp_sensor"] as Any
+                    }
+                    if (li["_temp_sensor"]==null){
+                        equipment["温度传感器"]=" "
+                    }else{
+                        equipment["温度传感器"] = li["_temp_sensor"] as Any
+                    }
+                }
+                if (li["tech_param_general"]!=li["_tech_param_general"]){
+                    if (li["tech_param_general"]==null){
+                        property["技术参数-通用"]=" "
+                    }else{
+                        property["技术参数-通用"] = li["tech_param_general"] as Any
+                    }
+                    if (li["_tech_param_general"]==null){
+                        equipment["技术参数-通用"]=" "
+                    }else{
+                        equipment["技术参数-通用"] = li["_tech_param_general"] as Any
+                    }
+                }
+                if (li["run_param_general"]!=li["_run_param_general"]){
+                    if (li["run_param_general"]==null){
+                        property["运行参数-通用"]=" "
+                    }else{
+                        property["运行参数-通用"] = li["run_param_general"] as Any
+                    }
+                    if (li["_run_param_general"]==null){
+                        equipment["运行参数-通用"]=" "
+                    }else{
+                        equipment["运行参数-通用"] = li["_run_param_general"] as Any
+                    }
+                }
+                if (li["speed_sensor"]!=li["_speed_sensor"]){
+                    if (li["speed_sensor"]==null){
+                        property["速度传感器"]=" "
+                    }else{
+                        property["速度传感器"] = li["speed_sensor"] as Any
+                    }
+                    if (li["_speed_sensor"]==null){
+                        equipment["速度传感器"]=" "
+                    }else{
+                        equipment["速度传感器"] = li["_speed_sensor"] as Any
+                    }
+                }
+                if (li["sound_sensor"]!=li["_sound_sensor"]){
+                    if (li["sound_sensor"]==null){
+                        property["声音传感器"]=" "
+                    }else{
+                        property["声音传感器"] = li["sound_sensor"] as Any
+                    }
+                    if (li["_sound_sensor"]==null){
+                        equipment["声音传感器"]=" "
+                    }else{
+                        equipment["声音传感器"] = li["_sound_sensor"] as Any
+                    }
+                }
+                if (li["humidity_sensor"]!=li["_humidity_sensor"]){
+                    if (li["humidity_sensor"]==null){
+                        property["湿度传感器"]=" "
+                    }else{
+                        property["湿度传感器"] = li["humidity_sensor"] as Any
+                    }
+                    if (li["_humidity_sensor"]==null){
+                        equipment["湿度传感器"]=" "
+                    }else{
+                        equipment["湿度传感器"] = li["_humidity_sensor"] as Any
+                    }
+                }
+                if (li["press_transd"]!=li["_press_transd"]){
+                    if (li["press_transd"]==null){
+                        property["压力传感器"]=" "
+                    }else{
+                        property["压力传感器"] = li["press_transd"] as Any
+                    }
+                    if (li["_press_transd"]==null){
+                        equipment["压力传感器"]=" "
+                    }else{
+                        equipment["压力传感器"] = li["_press_transd"] as Any
+                    }
+                }
+                if (li["heat_sensor"]!=li["_heat_sensor"]){
+                    if (li["heat_sensor"]==null){
+                        property["热量传感器"]=" "
+                    }else{
+                        property["热量传感器"] = li["heat_sensor"] as Any
+                    }
+                    if (li["_heat_sensor"]==null){
+                        equipment["热量传感器"]=" "
+                    }else{
+                        equipment["热量传感器"] = li["_heat_sensor"] as Any
+                    }
+                }
+                if (li["flow_sensor"]!=li["_flow_sensor"]){
+                    if (li["flow_sensor"]==null){
+                        property["流量传感器"]=" "
+                    }else{
+                        property["流量传感器"] = li["flow_sensor"] as Any
+                    }
+                    if (li["_flow_sensor"]==null){
+                        equipment["流量传感器"]=" "
+                    }else{
+                        equipment["流量传感器"] = li["_flow_sensor"] as Any
+                    }
+                }
+                if (li["electricity_sensor"]!=li["_electricity_sensor"]){
+                    if (li["electricity_sensor"]==null){
+                        property["电度传感器"]=" "
+                    }else{
+                        property["电度传感器"] = li["electricity_sensor"] as Any
+                    }
+                    if (li["_electricity_sensor"]==null){
+                        equipment["电度传感器"]=" "
+                    }else{
+                        equipment["电度传感器"] = li["_electricity_sensor"] as Any
+                    }
+                }
+                if (li["displ_sensor"]!=li["_displ_sensor"]){
+                    if (li["displ_sensor"]==null){
+                        property["位移传感器"]=" "
+                    }else{
+                        property["位移传感器"] = li["displ_sensor"] as Any
+                    }
+                    if (li["_displ_sensor"]==null){
+                        equipment["位移传感器"]=" "
+                    }else{
+                        equipment["位移传感器"] = li["_displ_sensor"] as Any
+                    }
+                }
+                if (li["concent_sensor"]!=li["_concent_sensor"]){
+                    if (li["concent_sensor"]==null){
+                        property["浓度传感器"]=" "
+                    }else{
+                        property["浓度传感器"] = li["concent_sensor"] as Any
+                    }
+                    if (li["_concent_sensor"]==null){
+                        equipment["浓度传感器"]=" "
+                    }else{
+                        equipment["浓度传感器"] = li["_concent_sensor"] as Any
+                    }
+                }
+                if (li["image_sensor"]!=li["_image_sensor"]){
+                    if (li["image_sensor"]==null){
+                        property["图像传感器"]=" "
+                    }else{
+                        property["图像传感器"] = li["image_sensor"] as Any
+                    }
+                    if (li["_image_sensor"]==null){
+                        equipment["图像传感器"]=" "
+                    }else{
+                        equipment["图像传感器"] = li["_image_sensor"] as Any
+                    }
+                }
+                if (li["feedback_param"]!=li["_feedback_param"]){
+                    if (li["feedback_param"]==null){
+                        property["反馈参数"]=" "
+                    }else{
+                        property["反馈参数"] = li["feedback_param"] as Any
+                    }
+                    if (li["_feedback_param"]==null){
+                        equipment["反馈参数"]=" "
+                    }else{
+                        equipment["反馈参数"] = li["_feedback_param"] as Any
+                    }
+                }
+                if (li["man_flow_sensor"]!=li["_man_flow_sensor"]){
+                    if (li["man_flow_sensor"]==null){
+                        property["人流量传感器"]=" "
+                    }else{
+                        property["人流量传感器"] = li["man_flow_sensor"] as Any
+                    }
+                    if (li["_man_flow_sensor"]==null){
+                        equipment["人流量传感器"]=" "
+                    }else{
+                        equipment["人流量传感器"] = li["_man_flow_sensor"] as Any
+                    }
+                }
+                if (li["dp_specification_id"]!=li["_dp_specification_id"]){
+                    if (li["dp_specification_id"]==null){
+                        property["设备型号id"]=" "
+                    }else{
+                        property["设备型号id"] = li["dp_specification_id"] as Any
+                    }
+                    if (li["_dp_specification_id"]==null){
+                        equipment["设备型号id"]=" "
+                    }else{
+                        equipment["设备型号id"] = li["_dp_specification_id"] as Any
+                    }
+                }
+                if (li["dp_brand_id"]!=li["_dp_brand_id"]){
+                    if (li["dp_brand_id"]==null){
+                        property["品牌id"]=" "
+                    }else{
+                        property["品牌id"] = li["dp_brand_id"] as Any
+                    }
+                    if (li["_dp_brand_id"]==null){
+                        equipment["品牌id"]=" "
+                    }else{
+                        equipment["品牌id"] = li["_dp_brand_id"] as Any
+                    }
+                }
+                if (li["equip_serial"]!=li["_equip_serial"]) {
+                    if (li["equip_serial"]==null){
+                        property["设备序号"]=" "
+                    }else{
+                        property["设备序号"] = li["equip_serial"] as Any
+                    }
+                    if (li["_equip_serial"]==null){
+                        equipment["设备序号"]=" "
+                    }else{
+                        equipment["设备序号"] = li["_equip_serial"] as Any
+                    }
+                }
+                eqpeDefferentReqponse.property=property
+                eqpeDefferentReqponse.equipment=equipment
+                list.add(eqpeDefferentReqponse)
+
+            }
+            val sQueryResponse = SQueryResponse<ArrayList<EqpeDefferentReqponse>>(SResponseType.success)
+            sQueryResponse.content = listOf(list)
+            sQueryResponse
+        } catch ( e: Exception){
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure)
+        }
+    }
+
+    /**
+     * 设备-未关联资产的设备
+     */
+    fun uneq2pe(): SCountResponse {
+        val projectId = SPageContext.getHeader("ProjectId").toString()
+        val count = mapper.uneq2peCount(projectId)
+        return SCountResponse(count)
+    }
+
+    /**
+     * 业务空间-各分区占比
+     */
+    fun spObjectTypeCount(): ArrayList<StatisticsCountResponse> {
+        val projectId = SPageContext.getHeader("ProjectId").toString()
+        val list = mapper.spObjectTypeCount(projectId)
+        val map = HashMap<String, Long>()
+        for (obj in list) {
+            map.put(obj.name!!, obj.count!!)
+        }
+        val array = arrayListOf("HeatingZone","CleanZone","DomesticWaterSupplyZone","NetworkZone","TenantZone","AirConditioningZone","FunctionZone","FireZone","SecurityZone","GeneralZone","PowerSupplyZone","LightingZone")
+
+        for(type in array){
+            if(!map.containsKey(type)){
+                val obj = StatisticsCountResponse()
+                obj.name = type
+                obj.count = 0
+                list.add(obj)
+            }
+        }
+        return list
+    }
+
+    /**
+     * 业务空间-默认分区功能类型占比
+     */
+    fun generalSpFuncTypeCount(): ArrayList<StatisticsCountResponse> {
+        val projectId = SPageContext.getHeader("ProjectId").toString()
+        return mapper.generalSpFuncTypeCount(projectId)
+    }
+
+    /**
+     * 租户-关联业务空间完成度
+     */
+    fun tenant2SpCount(): SCountResponse {
+        val projectId = SPageContext.getHeader("ProjectId").toString()
+        val count = mapper.tenant2SpCount(projectId)
+        return SCountResponse(count)
+    }
+
+    /**
+     * 竖井-关联业务空间完成度
+     */
+    fun shaft2SpCount(): SCountResponse {
+        val projectId = SPageContext.getHeader("ProjectId").toString()
+        val count = mapper.shaft2SpCount(projectId)
+        return SCountResponse(count)
+    }
+
+    /**
+     * 竖井-按功能类型占比
+     */
+    fun shaftFuncTypeCount(): ArrayList<StatisticsCountResponse> {
+        val projectId = SPageContext.getHeader("ProjectId").toString()
+        return mapper.shaftFuncTypeCount(projectId)
+    }
+} // Class StatisticsService

+ 173 - 0
data-center/src/main/kotlin/com/persagy/server/services/assistant/UpDataFloorAndBuildingServuce.kt

@@ -0,0 +1,173 @@
+package com.persagy.server.services.assistant
+
+import com.persagy.server.datacenter.models.entities.objects.Equipment
+import com.persagy.server.datacenter.models.entities.objects.ZoneSpace
+import com.persagy.server.datacenter.models.entities.rel.RSpinBd
+import com.persagy.server.datacenter.models.entities.rel.RSpinFl
+import com.persagy.server.datacenter.models.requests.UpDataFloorAndBuildingRequests
+import com.persagy.server.services.base.Service
+import com.persagy.server.services.objects.FloorService
+import com.persagy.server.services.objects.ZoneSpaceBaseService
+import com.persagy.server.services.rel.RSpInBdService
+import com.persagy.server.services.rel.RSpInFlService
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.responses.SBaseResponse
+import org.json.JSONObject
+
+/**
+ * 修改关系 楼层或建下的对象
+ *
+ * @author 张维新
+ */
+object UpDataFloorAndBuildingServuce : Service<Equipment>(SMybatisDao(Equipment::class.java)) {
+
+
+    /**
+     * 修改空间对象的楼层建筑信息
+     *
+     * @param   spaceId     业务空间id
+     * @param   id          楼层或建筑id
+     * @param   type        业务空间类型
+     */
+    fun upDataFloorORBuilding(upDataFloorAndBuildingRequestsList: ArrayList<UpDataFloorAndBuildingRequests>): SBaseResponse {
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+
+            if (upDataFloorAndBuildingRequestsList.isNullOrEmpty()) {
+                val sBaseResponse = SBaseResponse(SResponseType.failure)
+                sBaseResponse.message = "不可以传入空数据"
+                return sBaseResponse
+            }
+            for (upDataFloorAndBuildingRequests in upDataFloorAndBuildingRequestsList) {
+
+                val spaceId = upDataFloorAndBuildingRequests.spaceId
+                val id = upDataFloorAndBuildingRequests.id
+                val type = upDataFloorAndBuildingRequests.type
+
+                try {
+                    if (!id.isNullOrEmpty()) {
+                        if (id.startsWith("Fl")) {
+                            val floor =
+                                FloorService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("FloorID", id))
+                                    .entity()
+
+                            if (floor != null) {
+                                /** 清除空间和建筑楼层的的数据 */
+                                RSpInBdService.delete(
+                                    SFilter.eq("projectId", projectId!!),
+                                    SFilter.eq("spaceId", spaceId!!)
+                                )
+                                RSpInFlService.delete(
+                                    SFilter.eq("projectId", projectId!!),
+                                    SFilter.eq("spaceId", spaceId!!)
+                                )
+                                val rSpinFl = RSpinFl()
+                                rSpinFl.floorId = floor.id
+                                rSpinFl.projectId = projectId
+                                rSpinFl.spaceId = spaceId
+                                rSpinFl.objectType = type
+                                rSpinFl.sign = 1
+                                RSpInFlService.replace(rSpinFl)
+
+                                val rSpinBd = RSpinBd()
+                                rSpinBd.objectType = type
+                                rSpinBd.buildingId = floor.buildId
+                                rSpinBd.spaceId = spaceId
+                                rSpinBd.sign = 1
+                                rSpinBd.projectId = projectId
+                                RSpInBdService.replace(rSpinBd)
+                            }
+
+                        } else if (id.startsWith("Bd")) {
+                            /** 清除空间和建筑楼层的的数据 */
+                            RSpInBdService.delete(
+                                SFilter.eq("projectId", projectId!!),
+                                SFilter.eq("spaceId", spaceId!!)
+                            )
+                            RSpInFlService.delete(
+                                SFilter.eq("projectId", projectId!!),
+                                SFilter.eq("spaceId", spaceId!!)
+                            )
+                            val rSpinBd = RSpinBd()
+                            rSpinBd.objectType = type
+                            rSpinBd.buildingId = id
+                            rSpinBd.spaceId = spaceId
+                            rSpinBd.sign = 1
+                            rSpinBd.projectId = projectId
+                            RSpInBdService.replace(rSpinBd)
+                        }
+                    } else {
+                        /** 清除空间和建筑楼层的的数据 */
+                        RSpInBdService.delete(SFilter.eq("projectId", projectId!!), SFilter.eq("spaceId", spaceId!!))
+                        RSpInFlService.delete(SFilter.eq("projectId", projectId!!), SFilter.eq("spaceId", spaceId!!))
+                    }
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+
+
+                val zonePowerSupply = ZoneSpace()
+                zonePowerSupply.id = spaceId
+                if (!id.isNullOrEmpty()) {
+                    if (id.startsWith("Fl")) {
+                        zonePowerSupply.floorId = id
+                        val floor = FloorService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("FloorID", id))
+                            .entity()
+                        zonePowerSupply.buildingId = floor?.buildId
+                        val list = ArrayList<String>()
+                        list.add("FloorId")
+                        list.add("BuildingId")
+                        ZoneSpaceBaseService.update(zonePowerSupply, list)
+                    } else if (id.startsWith("Bd")) {
+                        val list = ArrayList<String>()
+                        list.add("FloorId")
+                        list.add("BuildingId")
+                        zonePowerSupply.buildingId = id
+                        zonePowerSupply.floorId = null
+                        ZoneSpaceBaseService.update(zonePowerSupply, list)
+                    }
+                } else {
+                    /** 清空建筑楼层 */
+                    val list = ArrayList<String>()
+                    list.add("FloorId")
+                    list.add("BuildingId")
+                    zonePowerSupply.buildingId = null
+                    zonePowerSupply.floorId = null
+                    ZoneSpaceBaseService.update(zonePowerSupply, list)
+                }
+                /** 发送消息 */
+                sendMessages(projectId!!, spaceId!!, id)
+            }
+            return SBaseResponse(SResponseType.success)
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure)
+        }
+
+    } // Function upDataFloorORBuilding
+
+    /**
+     * 发送消息
+     *
+     * @param   projectId   项目id
+     * @param   spaceId     业务空间id
+     * @param   id          楼层或建筑id
+     */
+    fun sendMessages(projectId: String, spaceId: String, id: String?) {
+        try {
+            val jsonObject = JSONObject()
+            jsonObject.put("type", "20")
+            jsonObject.put("projectId", projectId)
+            jsonObject.put("id", spaceId)
+            jsonObject.put("linkId", id)
+            /** 发送消息 */
+            messageHandler.sendMessage(jsonObject.toString())
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    } // Function sendMessages
+
+} // Object UpDataFloorAndBuildingServuce

+ 30 - 0
data-center/src/main/kotlin/com/persagy/server/services/base/RService.kt

@@ -0,0 +1,30 @@
+package com.persagy.server.services.base
+
+import cn.sagacloud.server.synchronize.MessageHandler
+import com.persagy.server.datacenter.models.entities.base.RBaseInfo
+import com.sybotan.database.SAbstractDao
+import com.sybotan.service.SObjectService
+import com.sybotan.service.utils.SSpringContextUtil
+
+/**
+ * 关系处理服务基类
+ *
+ * @author 张维新
+ */
+open class RService<ENTITY : RBaseInfo>(daoClass: SAbstractDao<ENTITY>) : SObjectService<ENTITY>(daoClass) {
+    companion object {
+        /** 日志 */
+//        private val logger = LoggerFactory.getLogger(ProjectController::class.java)
+
+        /** MQ消息对象 */
+        val messageHandler by lazy {
+            SSpringContextUtil.getBean(MessageHandler::class.java) as MessageHandler
+        }
+        /** kafka消息对象 */
+//        val kafkaService by lazy {
+//            SSpringContextUtil.getBean(KafkaService::class.java) as KafkaService
+//        }
+    } // Companion object
+
+
+} // Class Service

+ 228 - 0
data-center/src/main/kotlin/com/persagy/server/services/base/Service.kt

@@ -0,0 +1,228 @@
+package com.persagy.server.services.base
+
+import cn.sagacloud.server.datacenter.utils.IdUtils
+import cn.sagacloud.server.synchronize.MessageHandler
+import com.persagy.server.datacenter.models.entities.base.BaseInfo
+import com.persagy.server.datacenter.models.entities.logs.DataCenterLogs
+import com.persagy.server.services.assistant.SchemeService
+import com.persagy.server.services.rel.RSpInBdService
+import com.persagy.server.services.rel.RSpInFlService
+import com.sybotan.database.SAbstractDao
+import com.sybotan.database.SFilter
+import com.sybotan.database.extensions.keyValue
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.utils.SSpringContextUtil
+import org.json.JSONArray
+import org.json.JSONObject
+import org.slf4j.LoggerFactory
+
+
+/**
+ * 服务基类
+ *
+ * @author 张维新
+ */
+open class Service<ENTITY : BaseInfo>(daoClass: SAbstractDao<ENTITY>) : SObjectService<ENTITY>(daoClass) {
+    companion object {
+        /** 日志 */
+        private val logger = LoggerFactory.getLogger(Service::class.java)
+
+        /** MQ消息对象 */
+        val messageHandler by lazy {
+            SSpringContextUtil.getBean(MessageHandler::class.java) as MessageHandler
+        }
+
+        /** 自定义sql */
+         val schemeService by lazy {
+            SSpringContextUtil.getBean(SchemeService::class.java) as SchemeService
+        }
+
+        /** kafka消息对象 */
+//        val kafkaService by lazy {
+//            SSpringContextUtil.getBean(KafkaService::class.java) as KafkaService
+//        }
+
+    } // Companion object
+    /** 日志 */
+    var logService = SObjectService(SMybatisDao(DataCenterLogs::class.java))
+
+    /**
+     * 创建成功回调函数
+     *
+     * @param   entityList          创建成功对象
+     */
+    override fun onCreateSuccess(entityList: ArrayList<ENTITY>) {
+
+        entityList.forEach {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val comming = SPageContext.getHeader("Coming")
+            val account = SPageContext.getHeader("Account")
+
+            try {
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "1")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", it.keyValue("id"))
+                jsonObject.put("obj_type", it.objectType)
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+//                kafkaService.sendNotice("datacenter", ObjectNotice(projectId!!, it.objectType!!, "create",IdUtils.uuidCreate(), hashSetOf(it.keyValue("id").toString())),false)
+
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            try {
+                /** 日志 */
+                val dataCenterLogs = DataCenterLogs()
+                dataCenterLogs.id = IdUtils.uuidCreate()
+                dataCenterLogs.author = "dataCenter"
+                dataCenterLogs.projectId = projectId
+                dataCenterLogs.objectType = it.objectType
+                dataCenterLogs.type = "create"
+                dataCenterLogs.coming = comming
+                dataCenterLogs.account = account
+                dataCenterLogs.objectId = it.keyValue("id").toString()
+                val hashMap = HashMap<String, Any?>()
+                hashMap[it.objectType!!] = it
+                dataCenterLogs.dataSource = hashMap
+                logService.insert(dataCenterLogs)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+
+
+        }
+//        entityList.forEach {
+//            if (it.objectType =="Equipment") {
+//                logger.debug("设备数据id${it.keyValue("id")}*******************************")
+//                logger.debug("资产数据id${it.keyValue("propertyId")}*******************************")
+//            }
+//        }
+
+        return
+    } // Function onCreateSuccess()
+
+    /**
+     * 删除成功回调函数
+     *
+     * @param   entityList      删除成功对象列表
+     */
+    override fun onDeleteSuccess(entityList: ArrayList<ENTITY>) {
+        val projectId = SPageContext.getHeader("ProjectId")
+        entityList.forEach {
+
+            try {
+                if (it.keyValue("id").toString().startsWith("Sp")){
+                    /** 清除空间和建筑楼层的的数据 */
+                    RSpInBdService.delete(SFilter.eq("projectId",projectId!!), SFilter.eq("spaceId",it.keyValue("id").toString()))
+                    RSpInFlService.delete(SFilter.eq("projectId",projectId!!), SFilter.eq("spaceId",it.keyValue("id").toString()))
+                }
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+
+            try {
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "2")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", it.keyValue("id"))
+                jsonObject.put("obj_type", it.objectType)
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+//                kafkaService.sendNotice("datacenter", ObjectNotice(projectId!!, it.objectType!!, "delete",IdUtils.uuidCreate(), hashSetOf(it.keyValue("id").toString())),false)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+        }
+        return
+    } // Function onDeleteSuccess()
+
+
+    override fun onUpdateBefore(entity: ENTITY): Boolean {
+
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val comming = SPageContext.getHeader("Coming")
+            val account = SPageContext.getHeader("Account")
+            /** 日志 */
+            val dataCenterLogs = DataCenterLogs()
+            dataCenterLogs.id = IdUtils.uuidCreate()
+            dataCenterLogs.author = "dataCenter"
+            dataCenterLogs.projectId = projectId
+            dataCenterLogs.objectType = entity.objectType
+            dataCenterLogs.type = "update-before"
+            dataCenterLogs.account = account
+            dataCenterLogs.coming = comming
+            dataCenterLogs.objectId = entity.keyValue("id").toString()
+            val hashMap = HashMap<String, Any?>()
+            hashMap[entity.objectType!!] = entity
+            dataCenterLogs.dataSource = hashMap
+            logService.insert(dataCenterLogs)
+        } catch (e: Exception) {
+            e.printStackTrace()
+    }
+
+        return super.onUpdateBefore(entity)
+    }
+
+    /**
+     * 更新成功能回调函数
+     *
+     * @param   entityList      更新成功对象列表
+     */
+    override fun onUpdateSuccess(entityList: ArrayList<ENTITY>) {
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val comming = SPageContext.getHeader("Coming")
+            val account = SPageContext.getHeader("Account")
+            val jsonObject = JSONObject()
+            jsonObject.put("type", "7")
+            jsonObject.put("projectId", projectId)
+            jsonObject.put("obj_type", entityList[0].objectType)
+            val jsonArray = JSONArray()
+            for (entity in entityList) {
+                val jsonInfos = JSONObject()
+                jsonInfos.put("id", entity.keyValue("id"))
+                jsonInfos.put("obj_type", entity.objectType)
+                jsonArray.put(jsonInfos)
+
+                try {
+                    /** 日志 */
+                    val dataCenterLogs = DataCenterLogs()
+                    dataCenterLogs.id = IdUtils.uuidCreate()
+                    dataCenterLogs.author = "dataCenter"
+                    dataCenterLogs.projectId = projectId
+                    dataCenterLogs.objectType = entity.objectType
+                    dataCenterLogs.type = "update-after"
+                    dataCenterLogs.account = account
+                    dataCenterLogs.coming = comming
+                    dataCenterLogs.objectId = entity.keyValue("id").toString()
+                    val hashMap = HashMap<String, Any?>()
+                    hashMap[entity.objectType!!] = entity
+                    dataCenterLogs.dataSource = hashMap
+                    logService.insert(dataCenterLogs)
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+
+                try {
+                    /** 发送消息 */
+//                    kafkaService.sendNotice("datacenter", ObjectNotice(projectId!!, entity.objectType!!, "update",IdUtils.uuidCreate(), hashSetOf(entity.keyValue("id").toString())),false)
+                } catch (e: Exception) {
+                    e.toString()
+                }
+
+            }
+            jsonObject.put("infos", jsonArray)
+            logger.debug("修改发送消息$jsonObject")
+            /** 发送消息 */
+            messageHandler.sendMessage(jsonObject.toString())
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return
+    } // Function onUpdateSuccess()
+
+} // Class Service

+ 271 - 0
data-center/src/main/kotlin/com/persagy/server/services/base/ServiceSpace.kt

@@ -0,0 +1,271 @@
+package com.persagy.server.services.base
+
+import cn.sagacloud.server.datacenter.utils.IdUtils
+import cn.sagacloud.server.synchronize.MessageHandler
+import com.persagy.server.datacenter.models.entities.logs.DataCenterLogs
+import com.persagy.server.services.assistant.SchemeService
+import com.persagy.server.services.objects.ZoneSpaceBaseService
+import com.persagy.server.services.rel.RSpInBdService
+import com.persagy.server.services.rel.RSpInFlService
+import com.sybotan.database.SAbstractDao
+import com.sybotan.database.SFilter
+import com.sybotan.database.extensions.keyValue
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.SBaseEntity
+import com.sybotan.service.utils.SSpringContextUtil
+import org.json.JSONArray
+import org.json.JSONObject
+import org.slf4j.LoggerFactory
+
+
+/**
+ * 服务基类
+ *
+ * @author 张维新
+ */
+open class ServiceSpace<ENTITY : SBaseEntity>(daoClass: SAbstractDao<ENTITY>) : SObjectService<ENTITY>(daoClass) {
+    companion object {
+        /** 日志 */
+        private val logger = LoggerFactory.getLogger(ServiceSpace::class.java)
+
+        /** MQ消息对象 */
+        val messageHandler by lazy {
+            SSpringContextUtil.getBean(MessageHandler::class.java) as MessageHandler
+        }
+
+        /** 自定义sql */
+         val schemeService by lazy {
+            SSpringContextUtil.getBean(SchemeService::class.java) as SchemeService
+        }
+
+        /** kafka消息对象 */
+//        val kafkaService by lazy {
+//            SSpringContextUtil.getBean(KafkaService::class.java) as KafkaService
+//        }
+
+    } // Companion object
+    /** 日志 */
+    var logService = SObjectService(SMybatisDao(DataCenterLogs::class.java))
+
+    /**
+     * 创建成功回调函数
+     *
+     * @param   entityList          创建成功对象
+     */
+    override fun onCreateSuccess(entityList: ArrayList<ENTITY>) {
+
+        entityList.forEach {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val comming = SPageContext.getHeader("Coming")
+            val account = SPageContext.getHeader("Account")
+
+            try {
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "1")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", it.keyValue("id"))
+                if (it.keyValue("id").toString().startsWith("Sp")){
+                    val entity = ZoneSpaceBaseService.select(SFilter.eq("id", it.keyValue("id").toString())).entity()
+                    if (entity!=null){
+                        jsonObject.put("obj_type", entity.objectType)
+                    }
+                }else{
+                    jsonObject.put("obj_type", it.keyValue("objectType"))
+                }
+
+                logger.debug("对象类型:${it.keyValue("objectType")}")
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+//                kafkaService.sendNotice("datacenter", ObjectNotice(projectId!!, it.objectType!!, "create",IdUtils.uuidCreate(), hashSetOf(it.keyValue("id").toString())),false)
+
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            try {
+                /** 日志 */
+                val dataCenterLogs = DataCenterLogs()
+                dataCenterLogs.id = IdUtils.uuidCreate()
+                dataCenterLogs.author = "dataCenter"
+                dataCenterLogs.projectId = projectId
+
+                if (it.keyValue("id").toString().startsWith("Sp")){
+                    val entity = ZoneSpaceBaseService.select(SFilter.eq("id", it.keyValue("id").toString())).entity()
+                    if (entity!=null){
+                        dataCenterLogs.objectType = entity.objectType
+                        val hashMap = HashMap<String, Any?>()
+                        hashMap[entity.objectType!!] = it
+                        dataCenterLogs.dataSource = hashMap
+                    }
+                }else{
+                    dataCenterLogs.objectType = it.keyValue("objectType").toString()
+                    val hashMap = HashMap<String, Any?>()
+                    hashMap[it.keyValue("objectType").toString()] = it
+                    dataCenterLogs.dataSource = hashMap
+                }
+                dataCenterLogs.type = "create"
+                dataCenterLogs.coming = comming
+                dataCenterLogs.account = account
+                dataCenterLogs.objectId = it.keyValue("id").toString()
+                logService.insert(dataCenterLogs)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+        }
+        entityList.forEach {
+//            if (it.objectType =="Equipment") {
+//                logger.debug("设备数据id${it.keyValue("id")}*******************************")
+//                logger.debug("资产数据id${it.keyValue("propertyId")}*******************************")
+//            }
+        }
+
+        return
+    } // Function onCreateSuccess()
+
+    /**
+     * 删除成功回调函数
+     *
+     * @param   entityList      删除成功对象列表
+     */
+    override fun onDeleteSuccess(entityList: ArrayList<ENTITY>) {
+        val projectId = SPageContext.getHeader("ProjectId")
+        entityList.forEach {
+
+            try {
+                if (it.keyValue("id").toString().startsWith("Sp")){
+                    /** 清除空间和建筑楼层的的数据 */
+                    RSpInBdService.delete(SFilter.eq("projectId",projectId!!), SFilter.eq("spaceId",it.keyValue("id").toString()))
+                    RSpInFlService.delete(SFilter.eq("projectId",projectId!!), SFilter.eq("spaceId",it.keyValue("id").toString()))
+                }
+
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            try {
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "2")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", it.keyValue("id"))
+                jsonObject.put("obj_type", it.keyValue("objectType"))
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+//                kafkaService.sendNotice("datacenter", ObjectNotice(projectId!!, it.objectType!!, "delete",IdUtils.uuidCreate(), hashSetOf(it.keyValue("id").toString())),false)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+        }
+        return
+    } // Function onDeleteSuccess()
+
+
+    override fun onUpdateBefore(entity: ENTITY): Boolean {
+
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val comming = SPageContext.getHeader("Coming")
+            val account = SPageContext.getHeader("Account")
+
+            /** 日志 */
+            val dataCenterLogs = DataCenterLogs()
+            dataCenterLogs.id = IdUtils.uuidCreate()
+            dataCenterLogs.author = "dataCenter"
+            dataCenterLogs.projectId = projectId
+            if (entity.keyValue("id").toString().startsWith("Sp")){
+                val entity = ZoneSpaceBaseService.select(SFilter.eq("id", entity.keyValue("id").toString())).entity()
+                if (entity!=null){
+                    dataCenterLogs.objectType = entity.objectType
+                }
+            }else{
+                dataCenterLogs.objectType = entity.keyValue("objectType").toString()
+            }
+            dataCenterLogs.type = "update-before"
+            dataCenterLogs.account = account
+            dataCenterLogs.coming = comming
+            dataCenterLogs.objectId = entity.keyValue("id").toString()
+            val hashMap = HashMap<String, Any?>()
+            hashMap[entity.keyValue("objectType").toString()!!] = entity
+            dataCenterLogs.dataSource = hashMap
+            logService.insert(dataCenterLogs)
+        } catch (e: Exception) {
+            e.printStackTrace()
+    }
+
+        return super.onUpdateBefore(entity)
+    }
+
+    /**
+     * 更新成功能回调函数
+     *
+     * @param   entityList      更新成功对象列表
+     */
+    override fun onUpdateSuccess(entityList: ArrayList<ENTITY>) {
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val comming = SPageContext.getHeader("Coming")
+            val account = SPageContext.getHeader("Account")
+            val jsonObject = JSONObject()
+            jsonObject.put("type", "7")
+            jsonObject.put("projectId", projectId)
+            if (entityList[0].keyValue("id").toString().startsWith("Sp")){
+                val entity = ZoneSpaceBaseService.select(SFilter.eq("id", entityList[0].keyValue("id").toString())).entity()
+                if (entity!=null){
+                    jsonObject.put("obj_type", entity.objectType)
+                }
+            }else{
+                jsonObject.put("obj_type", entityList[0].keyValue("objectType").toString())
+            }
+
+            val jsonArray = JSONArray()
+            for (entity in entityList) {
+                var type = ""
+
+                if (entity.keyValue("id").toString().startsWith("Sp")){
+                    val entity = ZoneSpaceBaseService.select(SFilter.eq("id", entity.keyValue("id").toString())).entity()
+                    if (entity!=null){
+                        type = entity.objectType!!
+                    }
+                }else{
+                    type = entity.keyValue("objectType").toString()
+                }
+                val jsonInfos = JSONObject()
+                jsonInfos.put("id", entity.keyValue("id"))
+                jsonInfos.put("obj_type", type)
+                jsonArray.put(jsonInfos)
+
+                try {
+                    /** 日志 */
+                    val dataCenterLogs = DataCenterLogs()
+                    dataCenterLogs.id = IdUtils.uuidCreate()
+                    dataCenterLogs.author = "dataCenter"
+                    dataCenterLogs.projectId = projectId
+                    dataCenterLogs.objectType = type
+                    dataCenterLogs.type = "update-after"
+                    dataCenterLogs.account = account
+                    dataCenterLogs.coming = comming
+                    dataCenterLogs.objectId = entity.keyValue("id").toString()
+                    val hashMap = HashMap<String, Any?>()
+                    hashMap[type] = entity
+                    dataCenterLogs.dataSource = hashMap
+                    logService.insert(dataCenterLogs)
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+
+                try {
+                    /** 发送消息 */
+//                    kafkaService.sendNotice("datacenter", ObjectNotice(projectId!!, entity.objectType!!, "update",IdUtils.uuidCreate(), hashSetOf(entity.keyValue("id").toString())),false)
+                } catch (e: Exception) {
+                    e.toString()
+                }
+            }
+            jsonObject.put("infos", jsonArray)
+            logger.debug("修改发送消息$jsonObject")
+            /** 发送消息 */
+            messageHandler.sendMessage(jsonObject.toString())
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return
+    } // Function onUpdateSuccess()
+} // Class Service

+ 86 - 0
data-center/src/main/kotlin/com/persagy/server/services/dict/DClassDefService.kt

@@ -0,0 +1,86 @@
+package com.persagy.server.services.dict
+
+import com.persagy.server.datacenter.models.entities.dict.DClassDef
+import com.persagy.server.services.base.Service
+import com.sybotan.database.SFilter
+import com.sybotan.database.SPageQueryInfo
+import com.sybotan.database.SQueryBuilder
+import com.sybotan.database.functions.SLength
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.responses.SQueryResponse
+
+/**
+ * 字典头部信息服务
+ *
+ * @author 张维新
+ */
+object DClassDefService : Service<DClassDef>(SMybatisDao(DClassDef::class.java)){
+
+    /**
+     * 分页查询
+     *
+     * @param   type     查询条件
+     * @return              查询结果
+     */
+     fun equipQuery(type:String): SQueryResponse<DClassDef> {
+        return try {
+            var queryBuilder : SQueryBuilder<DClassDef>? = null
+            var pageInfo : SPageQueryInfo<DClassDef>? = null
+            when (type) {
+                "Equipment" -> {
+                    queryBuilder = select(SFilter.eq(SLength("id"), 4), SFilter.not(SFilter.isNull("parentId")))
+                    pageInfo = queryBuilder.pageQuery(1, 1000)
+                }
+                "Component" -> {
+                    queryBuilder = select(SFilter.eq(SLength("id"), 6), SFilter.not(SFilter.isNull("parentId")),
+                            SFilter.not(SFilter.eq("parentId","Space")),SFilter.not(SFilter.eq("name","租户"))
+                    )
+                    pageInfo = queryBuilder.pageQuery(1, 1000)
+                }
+                "System" -> {
+                    queryBuilder = select(SFilter.eq(SLength("id"), 2), SFilter.not(SFilter.eq("parentId","AllProfessionalSystemEquipment")))
+                    pageInfo = queryBuilder.pageQuery(1, 1000)
+                }
+                "Major" -> {
+                    queryBuilder = select(SFilter.eq(SLength("id"), 2), SFilter.eq("parentId","AllProfessionalSystemEquipment"))
+                    pageInfo = queryBuilder.pageQuery(1, 1000)
+                }
+                "Major-System" -> {
+                    val listClassDef = DClassDefService.select(SFilter.eq("parentId", "AllProfessionalSystemEquipment")).exec()
+                    for (classDef in listClassDef){
+                        val exec = DClassDefService.select(SFilter.eq("parentId", classDef.id!!)).exec()
+                        classDef.listClassDef = exec
+                    }
+                    pageInfo = SPageQueryInfo(1, 1000)
+                    pageInfo.content  = listClassDef
+                }
+            }
+            SQueryResponse(pageInfo!!)
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function query()
+
+    /**
+     * 查询设备部件类型
+     */
+    fun equipCommType(): SQueryResponse<DClassDef>{
+        val sQueryResponse = SQueryResponse<DClassDef>()
+        try {
+            val dClassDefList = select(SFilter.or(SFilter.eq(SLength("id"), 4),
+                    SFilter.eq(SLength("id"), 6)), SFilter.not(SFilter.isNull("parentId")),
+                    SFilter.not(SFilter.eq("id","Tenant")),SFilter.not(SFilter.eq("id","Ispace"))).exec()
+            sQueryResponse.content = dClassDefList
+            sQueryResponse.total = dClassDefList.size.toLong()
+        } catch (e: Exception) {
+            e.toString()
+        }
+        return sQueryResponse
+
+    } // Function equipCommType()
+
+
+
+} // Object DClassDefService

+ 354 - 0
data-center/src/main/kotlin/com/persagy/server/services/dict/DataDictionaryDescriptionProjectService.kt

@@ -0,0 +1,354 @@
+package com.persagy.server.services.dict
+
+import com.persagy.server.datacenter.models.entities.dict.*
+import com.persagy.server.services.base.Service
+import com.sybotan.base.extensions.toJson
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import org.slf4j.LoggerFactory
+
+/**
+ * 项目定制化字典服务
+ *
+ * @author 张维新
+ */
+object DataDictionaryDescriptionProjectService : Service<PropertyDefProjectInfo>(SMybatisDao(PropertyDefProjectInfo::class.java)) {
+
+    // 日志
+    private val logger = LoggerFactory.getLogger(DataDictionaryDescriptionProjectService::class.java)
+
+    /** 设备族对应的设备分类服务 */
+    private val equipFamilyservice = SBaseService(SMybatisDao(EquipFamily::class.java))
+
+    /** 物理世界自定义方案和项目的关系服务 */
+    private var projectSchemeService = SObjectService(SMybatisDao(ProjectScheme::class.java))
+
+    /** 数据中心方案服务 */
+    var schemeInfoServices = SObjectService(SMybatisDao(DataCenterPropertyDefScheme::class.java))
+
+    /**
+     * 创建之前操作
+     */
+    override fun onCreateBefore(dataDictionary: PropertyDefProjectInfo): Boolean {
+        val projectId = SPageContext.getHeader("ProjectId")
+        if (dataDictionary.type!!.length == 3) {
+            val equipFamily = equipFamilyservice.select("family = '${dataDictionary.type}'").entity()
+            dataDictionary.type = equipFamily!!.equipCode!!
+        }
+        if (dataDictionary.projectId.isNullOrEmpty()) {
+            dataDictionary.projectId = projectId
+        }
+        return true
+    } // Function onCreateBefore()
+
+    /**
+     * 设置项目定制信息
+     *
+     * @param  dataDictionaryList  定制字典数组
+     */
+    fun create(dataDictionaryList: ArrayList<PropertyDefProjectInfo>): SCreateResponse<PropertyDefProjectInfo> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (dataDictionary in dataDictionaryList) {
+
+//                if (dataDictionary.type!!.length == 3){
+//                    val equipFamily = equipFamilyservice.select("family = '${dataDictionary.type}'").entity()
+//                    dataDictionary.type = equipFamily!!.equipCode!!
+//                }
+                try {
+                    if (dataDictionary.projectId.isNullOrEmpty()) {
+                        dataDictionary.projectId = projectId
+                    }
+                    dataDictionary.objectType = null
+                    try {
+                        replace(dataDictionary)
+                    } catch (e: Exception) {
+                        e.printStackTrace()
+                        update(dataDictionary)
+                    }
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+            }
+            val sCreateResponse = SCreateResponse<PropertyDefProjectInfo>()
+            sCreateResponse.result = SResponseType.success
+            sCreateResponse.entityList = dataDictionaryList
+            sCreateResponse
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function create()
+
+    /**
+     * 根据项目id 具体类型重项目定制信息
+     *
+     * @param   type    类型
+     */
+    fun deleteType(type: String): SBaseResponse {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val isDelete = delete(SFilter.eq("type", type), SFilter.eq("projectId", projectId!!))
+            if (isDelete) {
+                val sCreateResponse = SBaseResponse()
+                sCreateResponse.result = SResponseType.success
+                sCreateResponse.message = type
+                sCreateResponse
+            } else {
+                val sCreateResponse = SBaseResponse()
+                sCreateResponse.result = SResponseType.failure
+                sCreateResponse.message = type
+                sCreateResponse
+
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function deletes()
+
+    /**
+     * 根据项目id重项目定制信息
+     *
+     */
+    fun deleteId(): SBaseResponse {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val isDelete = delete(SFilter.eq("projectId", projectId!!))
+            if (isDelete) {
+                val sCreateResponse = SBaseResponse()
+                sCreateResponse.result = SResponseType.success
+                sCreateResponse.message = projectId
+                sCreateResponse
+            } else {
+                val sCreateResponse = SBaseResponse()
+                sCreateResponse.result = SResponseType.failure
+                sCreateResponse.message = projectId
+                sCreateResponse
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function deletes()
+
+    /**
+     * 批量处理定制化字典信息
+     *
+     * @param   request     处理命令对象
+     */
+    fun createListDict(request: DictBatchProcessing): SCreateResponse<DictBatchProcessing> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            if (request.schemeId.isNullOrEmpty()) {
+                val sCreateResponse = SCreateResponse<DictBatchProcessing>(SResponseType.failure)
+                sCreateResponse.message = "SchemeId:不能为空"
+                sCreateResponse
+            } else {
+                logger.debug("一级标签000=${request.toJson()}")
+                when {
+                    request.schemeId == "schemeZero" -> {
+                        if (!request.priorityList.isNullOrEmpty() && request.priorityList!!.size > 0 && !request.firstNameList.isNullOrEmpty() && request.firstNameList!!.size > 0) {
+
+                            /** 清除项目下的字典信息 */
+                            delete(SFilter.eq("projectId",projectId!!))
+                            /** 导入原始字典数据 */
+                            schemeService.setControlDict(projectId)
+                            /** 查询项目对应的方案 */
+                            val projectScheme = projectSchemeService.select(SFilter.eq("projectId", projectId)).entity()
+                            if (projectScheme!=null){
+                                /** 导入自定义信息点 */
+                                schemeService.setSchemeCustomDict(projectId,projectScheme.schemeId!!)
+                            }
+                            val propertyDefProjectInfo = PropertyDefProjectInfo()
+                            propertyDefProjectInfo.visible = false
+                            propertyDefProjectInfo.projectId = projectId
+                            DataDictionaryDescriptionProjectService.update(propertyDefProjectInfo, arrayListOf("visible"),
+                                    arrayListOf(SFilter.eq("projectId",projectId),SFilter.not(SFilter.eq("unDisabled",false))))
+
+                            /** 一级标签 */
+                            for (firstName in request.firstNameList!!) {
+                                val propertyDefProjectInfo = PropertyDefProjectInfo()
+                                propertyDefProjectInfo.visible = true
+                                propertyDefProjectInfo.projectId = projectId
+                                DataDictionaryDescriptionProjectService.update(propertyDefProjectInfo, arrayListOf("visible"),
+                                        arrayListOf(SFilter.eq("projectId",projectId),SFilter.eq("firstName",firstName)))
+                            }
+
+                            /** 匹配优先级 */
+                            for (priority in request.priorityList!!) {
+                                val propertyDefProjectInfo = PropertyDefProjectInfo()
+                                propertyDefProjectInfo.visible = true
+                                propertyDefProjectInfo.projectId = projectId
+                                DataDictionaryDescriptionProjectService.update(propertyDefProjectInfo, arrayListOf("visible"),
+                                        arrayListOf(SFilter.eq("projectId",projectId),SFilter.eq("priority",priority)))
+                            }
+
+                        } else if (!request.firstNameList.isNullOrEmpty() && request.firstNameList!!.size > 0) {
+                            logger.debug("一级标签1=${request.firstNameList!!.toJson()}")
+                            try {
+
+                                /** 清除项目下的字典信息 */
+                                DataDictionaryDescriptionProjectService.delete(SFilter.eq("projectId",projectId!!))
+                                /** 导入原始字典数据 */
+                                schemeService.setControlDict(projectId)
+                                /** 查询项目对应的方案 */
+                                val projectScheme = projectSchemeService.select(SFilter.eq("projectId", projectId)).entity()
+                                if (projectScheme!=null){
+                                    /** 导入自定义信息点 */
+                                    schemeService.setSchemeCustomDict(projectId,projectScheme.schemeId!!)
+                                }
+
+                                val propertyDefProjectInfo = PropertyDefProjectInfo()
+                                propertyDefProjectInfo.visible = false
+                                propertyDefProjectInfo.projectId = projectId
+                                DataDictionaryDescriptionProjectService.update(propertyDefProjectInfo, arrayListOf("visible"),
+                                        arrayListOf(SFilter.eq("projectId",projectId), SFilter.not(SFilter.eq("unDisabled",false))))
+
+                                /** 一级标签 */
+                                for (firstName in request.firstNameList!!) {
+                                    logger.debug("一级标签=$firstName")
+                                    val propertyDefProjectInfo = PropertyDefProjectInfo()
+                                    propertyDefProjectInfo.visible = true
+                                    propertyDefProjectInfo.projectId = projectId
+                                    DataDictionaryDescriptionProjectService.update(propertyDefProjectInfo, arrayListOf("visible"),
+                                            arrayListOf(SFilter.eq("projectId",projectId),SFilter.eq("firstName",firstName)))
+                                }
+                            } catch (e: Exception) {
+                                e.printStackTrace()
+                            }
+
+                        } else if (!request.priorityList.isNullOrEmpty() && request.priorityList!!.size > 0) {
+                            /** 设置优先级 */
+
+                            try {
+                                /** 清除项目下的字典信息 */
+                                DataDictionaryDescriptionProjectService.delete(SFilter.eq("projectId",projectId!!))
+                                /** 导入原始字典数据 */
+                                schemeService.setControlDict(projectId)
+                                /** 查询项目对应的方案 */
+                                val projectScheme = projectSchemeService.select(SFilter.eq("projectId", projectId)).entity()
+                                if (projectScheme!=null){
+                                    /** 导入自定义信息点 */
+                                    schemeService.setSchemeCustomDict(projectId,projectScheme.schemeId!!)
+                                }
+
+                                val propertyDefProjectInfo = PropertyDefProjectInfo()
+                                propertyDefProjectInfo.visible = false
+                                propertyDefProjectInfo.projectId = projectId
+                                DataDictionaryDescriptionProjectService.update(propertyDefProjectInfo, arrayListOf("visible"),
+                                        arrayListOf(SFilter.eq("projectId",projectId), SFilter.not(SFilter.eq("unDisabled",false))))
+
+                                /** 匹配优先级 */
+                                for (priority in request.priorityList!!) {
+                                    val propertyDefProjectInfo = PropertyDefProjectInfo()
+                                    propertyDefProjectInfo.visible = true
+                                    propertyDefProjectInfo.projectId = projectId
+                                    DataDictionaryDescriptionProjectService.update(propertyDefProjectInfo, arrayListOf("visible"),
+                                            arrayListOf(SFilter.eq("projectId",projectId),SFilter.eq("priority",priority)))
+                                }
+                            } catch (e: Exception) {
+                                e.printStackTrace()
+                            }
+                        } else {
+
+                            /** 清除项目下的字典信息 */
+                            DataDictionaryDescriptionProjectService.delete(SFilter.eq("projectId",projectId!!))
+                            /** 导入原始字典数据 */
+                            schemeService.setControlDict(projectId)
+                            /** 查询项目对应的方案 */
+                            val projectScheme = projectSchemeService.select(SFilter.eq("projectId", projectId)).entity()
+                            if (projectScheme!=null){
+                                /** 导入自定义信息点 */
+                                schemeService.setSchemeCustomDict(projectId,projectScheme.schemeId!!)
+                            }
+
+                            val propertyDefProjectInfo = PropertyDefProjectInfo()
+                            propertyDefProjectInfo.visible = false
+                            propertyDefProjectInfo.projectId = projectId
+                            DataDictionaryDescriptionProjectService.update(propertyDefProjectInfo, arrayListOf("visible"),
+                                    arrayListOf(SFilter.eq("projectId",projectId), SFilter.not(SFilter.eq("unDisabled",false))))
+                        }
+                        SCreateResponse(SResponseType.success)
+                    }
+                    request.schemeId == "schemeOne" -> {
+                        /** 方案一数据处理 */
+
+                        /** 清除项目下的字典信息 */
+                        DataDictionaryDescriptionProjectService.delete(SFilter.eq("projectId",projectId!!))
+                        /** 导入方案1 */
+                        schemeService.setScheme(projectId,"1")
+                        /** 查询项目对应的方案 */
+                        val projectScheme = projectSchemeService.select(SFilter.eq("projectId", projectId)).entity()
+                        if (projectScheme!=null){
+                            /** 导入自定义信息点 */
+                            schemeService.setSchemeCustomDict(projectId,projectScheme.schemeId!!)
+                        }
+
+                        SCreateResponse(SResponseType.success)
+                    }
+                    request.schemeId == "schemeTwo" ->{
+                        /** 清除项目下的字典信息 */
+                        DataDictionaryDescriptionProjectService.delete(SFilter.eq("projectId",projectId!!))
+                        /** 导入方案1 */
+                        schemeService.setScheme(projectId,"2")
+                        /** 查询项目对应的方案 */
+                        val projectScheme = projectSchemeService.select(SFilter.eq("projectId", projectId)).entity()
+                        if (projectScheme!=null){
+                            /** 导入自定义信息点 */
+                            schemeService.setSchemeCustomDictFalse(projectId,projectScheme.schemeId!!)
+                        }
+//                        /** 万达方案 */
+//                        val listWanDa = schemeInfoServices.select(SFilter.eq("schemeId", "2")).exec()
+//                        try {
+//                            for (content in listWanDa){
+//
+//                                val propertyDefProjectInfo = PropertyDefProjectInfo()
+//                                propertyDefProjectInfo.dataSource = content.dataSource
+//                                logger.debug("数据源=${content.dataSource}")
+//                                propertyDefProjectInfo.dataType = content.dataType
+//                                propertyDefProjectInfo.unDisabled = content.unDisabled
+//                                propertyDefProjectInfo.editable = content.editable
+//                                propertyDefProjectInfo.firstName = content.firstName
+//                                propertyDefProjectInfo.firstTag = content.firstTag
+//                                propertyDefProjectInfo.flag = content.flag
+//                                propertyDefProjectInfo.infoPointCode = content.infoPointCode
+//                                propertyDefProjectInfo.infoPointName = content.infoPointName
+//                                propertyDefProjectInfo.inputMode = content.inputMode
+//                                propertyDefProjectInfo.note = content.note
+//                                propertyDefProjectInfo.priority = content.priority
+//                                propertyDefProjectInfo.projectId = projectId
+//                                propertyDefProjectInfo.secondName = content.secondName
+//                                propertyDefProjectInfo.secondTag = content.secondTag
+//                                propertyDefProjectInfo.sort = content.sort
+//                                propertyDefProjectInfo.unit = content.unit
+//                                propertyDefProjectInfo.visible = content.visible
+//                                propertyDefProjectInfo.type = content.type
+//                                DataDictionaryDescriptionProjectService.replace(propertyDefProjectInfo)
+//                            }
+//                        } catch (e: Exception) {
+//                            e.printStackTrace()
+//                        }
+
+                        SCreateResponse(SResponseType.success)
+                    }
+                    else -> {
+                        val sCreateResponse = SCreateResponse<DictBatchProcessing>(SResponseType.failure)
+                        sCreateResponse.message = "SchemeId:值传输错误,请参考文档"
+                        sCreateResponse
+                    }
+                }
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function createListDict()
+
+} // Object DataDictionaryDescriptionProjectService

+ 32 - 0
data-center/src/main/kotlin/com/persagy/server/services/dict/DictAirConditionerService.kt

@@ -0,0 +1,32 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.dict
+
+import com.persagy.server.datacenter.models.entities.dict.DictAirConditioner
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+
+/**
+ * 空调类型信息服务
+ *
+ * @author 张维新
+ */
+object DictAirConditionerService: SBaseService<DictAirConditioner>(SMybatisDao(DictAirConditioner::class.java))

+ 32 - 0
data-center/src/main/kotlin/com/persagy/server/services/dict/DictBuildingDirectService.kt

@@ -0,0 +1,32 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.dict
+
+import com.persagy.server.datacenter.models.entities.dict.DictDirection
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+
+/**
+ * 建筑朝向信息服务
+ *
+ * @author 张维新
+ */
+object DictBuildingDirectService: SBaseService<DictDirection>(SMybatisDao(DictDirection::class.java))

+ 32 - 0
data-center/src/main/kotlin/com/persagy/server/services/dict/DictBuildingFunctionalService.kt

@@ -0,0 +1,32 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.dict
+
+import com.persagy.server.datacenter.models.entities.dict.DictBuildingFunctional
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+
+/**
+ * 建筑功能类型信息服务
+ *
+ * @author 张维新
+ */
+object DictBuildingFunctionalService: SBaseService<DictBuildingFunctional>(SMybatisDao(DictBuildingFunctional::class.java))

+ 32 - 0
data-center/src/main/kotlin/com/persagy/server/services/dict/DictBuildingStructureTypeService.kt

@@ -0,0 +1,32 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.dict
+
+import com.persagy.server.datacenter.models.entities.dict.DictBuildingStructureType
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+
+/**
+ * 建筑结构类型信息服务
+ *
+ * @author 张维新
+ */
+object DictBuildingStructureTypeService: SBaseService<DictBuildingStructureType>(SMybatisDao(DictBuildingStructureType::class.java))

+ 32 - 0
data-center/src/main/kotlin/com/persagy/server/services/dict/DictClimateService.kt

@@ -0,0 +1,32 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.dict
+
+import com.persagy.server.datacenter.models.entities.dict.DictClimate
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+
+/**
+ * 气候区信息服务
+ *
+ * @author 张维新
+ */
+object DictClimateService: SBaseService<DictClimate>(SMybatisDao(DictClimate::class.java))

+ 32 - 0
data-center/src/main/kotlin/com/persagy/server/services/dict/DictDevelopService.kt

@@ -0,0 +1,32 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.dict
+
+import com.persagy.server.datacenter.models.entities.dict.DictDevelop
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+
+/**
+ * 发展水平代码信息服务
+ *
+ * @author 张维新
+ */
+object DictDevelopService: SBaseService<DictDevelop>(SMybatisDao(DictDevelop::class.java))

+ 32 - 0
data-center/src/main/kotlin/com/persagy/server/services/dict/DictFloorTypeService.kt

@@ -0,0 +1,32 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.dict
+
+import com.persagy.server.datacenter.models.entities.dict.DictFloorType
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+
+/**
+ * 楼层性质信息服务
+ *
+ * @author 张维新
+ */
+object DictFloorTypeService: SBaseService<DictFloorType>(SMybatisDao(DictFloorType::class.java))

+ 32 - 0
data-center/src/main/kotlin/com/persagy/server/services/dict/DictGreenBuildLevService.kt

@@ -0,0 +1,32 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.dict
+
+import com.persagy.server.datacenter.models.entities.dict.DictGreenBuildLev
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+
+/**
+ * 绿建等级信息服务
+ *
+ * @author 张维新
+ */
+object DictGreenBuildLevService: SBaseService<DictGreenBuildLev>(SMybatisDao(DictGreenBuildLev::class.java))

+ 32 - 0
data-center/src/main/kotlin/com/persagy/server/services/dict/DictHeatingTypeService.kt

@@ -0,0 +1,32 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.dict
+
+import com.persagy.server.datacenter.models.entities.dict.DictHeatingType
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+
+/**
+ * 采暖类型信息服务
+ *
+ * @author 张维新
+ */
+object DictHeatingTypeService: SBaseService<DictHeatingType>(SMybatisDao(DictHeatingType::class.java))

+ 32 - 0
data-center/src/main/kotlin/com/persagy/server/services/dict/DictInsulateTypeService.kt

@@ -0,0 +1,32 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.dict
+
+import com.persagy.server.datacenter.models.entities.dict.DictInsulateType
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+
+/**
+ * 保温类型信息服务
+ *
+ * @author 张维新
+ */
+object DictInsulateTypeService: SBaseService<DictInsulateType>(SMybatisDao(DictInsulateType::class.java))

+ 32 - 0
data-center/src/main/kotlin/com/persagy/server/services/dict/DictProvincialCityCodeService.kt

@@ -0,0 +1,32 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.dict
+
+import com.persagy.server.datacenter.models.entities.dict.DictProvincialCityCode
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+
+/**
+ * 省市区代码信息服务
+ *
+ * @author 张维新
+ */
+object DictProvincialCityCodeService: SBaseService<DictProvincialCityCode>(SMybatisDao(DictProvincialCityCode::class.java))

+ 32 - 0
data-center/src/main/kotlin/com/persagy/server/services/dict/DictSpaceFunctionalTypesService.kt

@@ -0,0 +1,32 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.dict
+
+import com.persagy.server.datacenter.models.entities.dict.DictSpaceFunctionalTypes
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+
+/**
+ * 空间功能类型信息服务
+ *
+ * @author 张维新
+ */
+object DictSpaceFunctionalTypesService: SBaseService<DictSpaceFunctionalTypes>(SMybatisDao(DictSpaceFunctionalTypes::class.java))

+ 128 - 0
data-center/src/main/kotlin/com/persagy/server/services/dict/DictSpaceProjectService.kt

@@ -0,0 +1,128 @@
+package com.persagy.server.services.dict
+
+import cn.sagacloud.server.datacenter.utils.IdUtils
+import com.persagy.server.datacenter.models.entities.dict.DictSpaceProject
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+
+/**
+ * 项目级空间类型
+ *
+ * @author 张维新
+ */
+object DictSpaceProjectService  : SObjectService<DictSpaceProject>(SMybatisDao(DictSpaceProject::class.java)) {
+
+    fun zoneTypeCreate(request: SCreateRequest<DictSpaceProject>): SCreateResponse<DictSpaceProject> {
+        try {
+            /** 项目id */
+            val projectId = SPageContext.getHeader("ProjectId")
+            if (request.content!=null&&request.content.size>0){
+
+                for (content in request.content){
+                 if (content.parentId.isNullOrEmpty()){
+                     val sCreateResponse = SCreateResponse<DictSpaceProject>()
+                     sCreateResponse.result = SResponseType.failure
+                     sCreateResponse.message = "父节点不能为空"
+                     return sCreateResponse
+                 }
+                    if (!content.parentId.isNullOrEmpty()&&content.parentId!="OtherZone"){
+                        val sCreateResponse = SCreateResponse<DictSpaceProject>()
+                        sCreateResponse.result = SResponseType.failure
+                        sCreateResponse.message = "只能为其它分区添加子分区"
+                        return sCreateResponse
+                    }
+                    if (content.name.isNullOrEmpty()){
+                        val sCreateResponse = SCreateResponse<DictSpaceProject>()
+                        sCreateResponse.result = SResponseType.failure
+                        sCreateResponse.message = "分区名不能为空"
+                        return sCreateResponse
+                    }
+                    if (!content.name.isNullOrEmpty()){
+                        val entity = select(SFilter.eq("name", content.name!!)).entity()
+                        if (entity!=null){
+                            val sCreateResponse = SCreateResponse<DictSpaceProject>()
+                            sCreateResponse.result = SResponseType.failure
+                            sCreateResponse.message = "分区名不能与已有分区名重复"
+                            return sCreateResponse
+                        }
+                    }
+                    if (!content.id.isNullOrEmpty()){
+                        val entity = select(SFilter.eq("id", content.id!!)).entity()
+                        if (entity!=null){
+                            val sCreateResponse = SCreateResponse<DictSpaceProject>()
+                            sCreateResponse.result = SResponseType.failure
+                            sCreateResponse.message = "id  不能重复"
+                            return sCreateResponse
+                        }
+                    }
+
+                }
+                for (content in request.content){
+                    if (content.id.isNullOrEmpty()){
+                        content.id = IdUtils.uuidCreate()+"Zone"
+                    }
+                    content.projectId = projectId
+                    insert(content)
+                }
+
+                val sCreateResponse = SCreateResponse<DictSpaceProject>()
+                sCreateResponse.result = SResponseType.success
+                return sCreateResponse
+            }else{
+                val sCreateResponse = SCreateResponse<DictSpaceProject>()
+                sCreateResponse.result = SResponseType.failure
+                sCreateResponse.message = "创建内容不能为空"
+                return sCreateResponse
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Fun
+
+
+    fun zoneTypeDelete(idList: ArrayList<DictSpaceProject>): SBaseResponse {
+        try {
+            if (idList!=null&&idList.size>0){
+                for (dictSpace in idList){
+                    if (dictSpace.id.isNullOrEmpty()){
+                        val sCreateResponse = SBaseResponse()
+                        sCreateResponse.result = SResponseType.failure
+                        sCreateResponse.message = "id不能为空"
+                        return sCreateResponse
+                    }
+
+                    if (!dictSpace.id.isNullOrEmpty() ){
+                        if (dictSpace.id == "AirConditioningZone"||dictSpace.id == "CleanZone"||dictSpace.id == "DomesticWaterSupplyZone"
+                                ||dictSpace.id == "FireZone"||dictSpace.id == "FunctionZone"||dictSpace.id == "GeneralZone"
+                                ||dictSpace.id == "HeatingZone"||dictSpace.id == "LightingZone"||dictSpace.id =="NetworkZone"
+                                ||dictSpace.id == "PowerSupplyZone"||dictSpace.id == "SecurityZone"||dictSpace.id == "TenantZone"||dictSpace.id == "OtherZone"){
+                            val sBaseResponse = SBaseResponse(SResponseType.failure)
+                            sBaseResponse.message = "不能删除字典定义分区"
+                            return sBaseResponse
+                        }
+                    }
+                }
+                for (dictSpace in idList){
+                    delete(SFilter.eq("id",dictSpace.id!!))
+                }
+                val sBaseResponse = SBaseResponse(SResponseType.success)
+                return sBaseResponse
+            }else{
+                val sBaseResponse = SBaseResponse(SResponseType.failure)
+                sBaseResponse.message = "内容不可以为空"
+                return sBaseResponse
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure,e.message.toString())
+        }
+    } //Fun
+
+} // Class DictSpaceProjectService

+ 32 - 0
data-center/src/main/kotlin/com/persagy/server/services/dict/DictWindService.kt

@@ -0,0 +1,32 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.dict
+
+import com.persagy.server.datacenter.models.entities.dict.DictWind
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+
+/**
+ * 空气风力等级状况服务
+ *
+ * @author 张维新
+ */
+object DictWindService: SBaseService<DictWind>(SMybatisDao(DictWind::class.java))

+ 32 - 0
data-center/src/main/kotlin/com/persagy/server/services/dict/DitcWeatherService.kt

@@ -0,0 +1,32 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.dict
+
+import com.persagy.server.datacenter.models.entities.dict.DitcWeather
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+
+/**
+ * 天气状况信息服务
+ *
+ * @author 张维新
+ */
+object DitcWeatherService: SBaseService<DitcWeather>(SMybatisDao(DitcWeather::class.java))

+ 35 - 0
data-center/src/main/kotlin/com/persagy/server/services/dict/EquipFamilyService.kt

@@ -0,0 +1,35 @@
+package com.persagy.server.services.dict
+
+import com.persagy.server.datacenter.models.entities.dict.EquipFamily
+import com.persagy.server.datacenter.models.entities.dict.Family
+import com.persagy.server.services.base.Service
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.responses.SQueryResponse
+
+/**
+ * 设备和族的关系
+ *
+ * @author 张维新
+ */
+object EquipFamilyService : Service<EquipFamily>(SMybatisDao(EquipFamily::class.java)) {
+
+    /** 设备族服务 */
+    val familyService = SBaseService(SMybatisDao(Family::class.java))
+
+    /**
+     * 查询所有设备族
+     */
+    fun familyAll(): SQueryResponse<Family> {
+        return try {
+            val queryBuilder = familyService.selectAll()
+            val pageInfo = queryBuilder.pageQuery(1, 1000)
+            SQueryResponse(pageInfo)
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, e.message!!)
+        }
+    }  // Function familyAll()
+
+} // Object EquipFamilyService

+ 393 - 0
data-center/src/main/kotlin/com/persagy/server/services/dict/PropertyDefProjectService.kt

@@ -0,0 +1,393 @@
+package com.persagy.server.services.dict
+
+import com.persagy.server.utils.RecursiveQuery
+import com.persagy.server.datacenter.models.entities.dict.*
+import com.persagy.server.datacenter.models.response.*
+import com.persagy.server.services.base.Service
+import com.sybotan.base.extensions.toJson
+import com.sybotan.database.SFilter
+import com.sybotan.database.SQueryBuilder
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.requests.SQueryRequest
+import com.sybotan.service.models.responses.SQueryResponse
+import org.slf4j.LoggerFactory
+import java.util.concurrent.Executors
+
+/**
+ * 项目定制化字典说明
+ *
+ * @author 张维新
+ */
+object PropertyDefProjectService : Service<PropertyDefProjectInfo>(SMybatisDao(PropertyDefProjectInfo::class.java)) {
+
+    /** 日志 */
+    private val logger = LoggerFactory.getLogger(PropertyDefProjectService::class.java)
+
+    /** 建筑朝向  方向代码 */
+    private val dictBuildingDirectService = SBaseService(SMybatisDao(DictDirection::class.java))
+    /** 建筑功能 */
+    private val dictBuildingFunctionalService = SBaseService(SMybatisDao(DictBuildingFunctional::class.java))
+    /** 服务 */
+    private val dictRentalservice = SBaseService(SMybatisDao(DictRental::class.java))
+    /** 设备族对应的设备分类服务 */
+    private val equipFamilyservice = SBaseService(SMybatisDao(EquipFamily::class.java))
+    /** 空间功能类型 */
+    private val spaceFunctionalservice = SBaseService(SMybatisDao(DictSpaceFunctionalTypes::class.java))
+    /** 省市区代码 */
+    private val dictProvincialCityCodeService = SBaseService(SMybatisDao(DictProvincialCityCode::class.java))
+
+    /** 污染等级 */
+    private val dictPollutionLevelService = SObjectService(SMybatisDao(DictPollutionLevel::class.java))
+
+    /** 污秽等级 */
+    private val dictContaminationLevelService = SObjectService(SMybatisDao(DictContaminationLevel::class.java))
+
+    /** 抗震设防烈度 */
+    private val dictSeismicFortificationIntensityService = SObjectService(SMybatisDao(DictSeismicFortificationIntensity::class.java))
+
+    /** 业务空间类型服务 */
+    var dictSpaceProjectService = SObjectService(SMybatisDao(DictSpaceProject::class.java))
+
+    var executor = Executors.newFixedThreadPool(2)
+
+    /**
+     * 分页查询
+     *
+     * @param   request     查询条件
+     * @return              查询结果
+     */
+    fun pageQuery(type:String?, request: SQueryRequest): SQueryResponse<PropertyDefProjectInfo> {
+        return try {
+
+            var dictProjectList : ArrayList<PropertyDefProjectInfo>? = null
+            val projectId = SPageContext.getHeader("ProjectId")
+            val queryBuilder = select(request.filters)
+            var code: String?
+            code = type
+            if (type!=null&&code!!.length == 3){
+                val equipFamily = equipFamilyservice.select("family = '$code'").entity()
+                code = equipFamily!!.equipCode!!
+            }
+
+           if (!type.isNullOrEmpty()){
+               dictProjectList = DataDictionaryDescriptionProjectService.select(SFilter.eq("projectId", projectId!!),
+                       SFilter.eq("type", type)).exec()
+               if (!dictProjectList.isNullOrEmpty()&&dictProjectList.size>0){
+                   DataDictionaryDescriptionProjectService.select(SFilter.eq("projectId", projectId), SFilter.eq("type", type)).exec()
+                   queryBuilder.tableName = "dict.property_def_project_info"
+                   queryBuilder.filter(SFilter.eq("projectId", projectId)).filter(SFilter.eq("type", type))
+               }else{
+                   logger.debug("输入的类型=$type   长度是=${type.length}")
+                   if (type != "Project"&&type != "Building"&&type != "Floor"&&type != "Shaft"&&type != "Tenant"&&type != "HeatingZone"
+                           &&type != "CleanZone"&&type != "DomesticWaterSupplyZone"&&type != "Ispace"&&type != "NetworkZone"&&type != "TenantZone"
+                           &&type != "AirConditioningZone"&&type != "FunctionZone"&&type != "FireZone"&&type != "SecurityZone"&&type != "GeneralZone"
+                           &&type != "PowerSupplyZone"&&type != "LightingZone" ){
+                       val dictSpaceProject = dictSpaceProjectService.select(SFilter.eq("id", type)).entity()
+                       if (dictSpaceProject!=null){
+//                           if (type.length == 3){
+//                               queryBuilder.tableName = "\"dict\".\"f_project_def_property\"('$code')"
+//                           }else{
+                               queryBuilder.tableName = "\"dict\".\"f_project_def\"('${SPageContext.getHeader("ProjectId")}', 'OtherZone')"
+//                           }
+                       }else {
+                           if (type.length == 3){
+                               queryBuilder.tableName = "\"dict\".\"f_project_def_property\"('$code')"
+                           }else{
+                               queryBuilder.tableName = "\"dict\".\"f_project_def\"('${SPageContext.getHeader("ProjectId")}', '$code')"
+                           }
+                       }
+
+                   }else{
+                       if (type.length == 3){
+                           queryBuilder.tableName = "\"dict\".\"f_project_def_property\"('$code')"
+                       }else{
+                           queryBuilder.tableName = "\"dict\".\"f_project_def\"('${SPageContext.getHeader("ProjectId")}', '$code')"
+                       }
+                   }
+               }
+           }else{
+               queryBuilder.tableName = "\"dict\".\"f_project_def\"('${SPageContext.getHeader("ProjectId")}', '')"
+           }
+//            queryBuilder.tableName = "\"dict\".\"f_property_def\"('${SPageContext.getHeader("ProjectId")}', '$code')"
+
+            /** 过滤 */
+            if (null != request.projection) {
+                queryBuilder.projection(request.projection!!)
+            }
+            /** 排序 */
+            if (null != request.orders) {
+                queryBuilder.order(request.orders!!)
+            }
+
+            /** 去重 */
+            if (null != request.distinct && request.distinct!!) {
+                queryBuilder.distinct()
+            }
+
+            val pageInfo = queryBuilder.pageQuery(request.pageNumber, request.pageSize)
+            val contentList = pageInfo.content
+
+            Thread {
+                if (!type.isNullOrEmpty()){
+                    /** 项目化定制表如果没有对应数据添加数据 */
+                    if (dictProjectList.isNullOrEmpty()|| dictProjectList.size==0){
+                        val contentList = pageInfo.content
+                        for (content in contentList!!){
+                            val propertyDefProjectInfo = PropertyDefProjectInfo()
+                            propertyDefProjectInfo.dataSource = content.dataSource
+                            logger.debug("数据源=${content.dataSource}")
+                            propertyDefProjectInfo.dataType = content.dataType
+                            propertyDefProjectInfo.unDisabled = content.unDisabled
+                            propertyDefProjectInfo.editable = content.editable
+                            propertyDefProjectInfo.firstName = content.firstName
+                            propertyDefProjectInfo.firstTag = content.firstTag
+                            propertyDefProjectInfo.flag = content.flag
+                            propertyDefProjectInfo.infoPointCode = content.infoPointCode
+                            propertyDefProjectInfo.infoPointName = content.infoPointName
+                            propertyDefProjectInfo.inputMode = content.inputMode
+                            propertyDefProjectInfo.note = content.note
+                            propertyDefProjectInfo.priority = content.priority
+                            propertyDefProjectInfo.projectId = projectId
+                            propertyDefProjectInfo.secondName = content.secondName
+                            propertyDefProjectInfo.secondTag = content.secondTag
+                            propertyDefProjectInfo.sort = content.sort
+                            propertyDefProjectInfo.unit = content.unit
+                            propertyDefProjectInfo.visible = content.visible
+                            propertyDefProjectInfo.type = type
+                            DataDictionaryDescriptionProjectService.replace(propertyDefProjectInfo)
+                        }
+                    }
+                }
+            }.start()
+            for (content in contentList!!) {
+//                if (!"见《9租赁业态类型》".equals(content.dataSource, true)) continue
+//                val service = SBaseService(SMybatisDao(DictRentalSyn::class.java))
+//                content.dataSource = net.minidev.json.JSONArray.toJSONString(service.select(SFilter.notNull("id")).exec())
+
+
+                if (!content.dataSource.isNullOrEmpty() && content.dataSource!!.contains("见《")||!content.dataSource.isNullOrEmpty() && content.dataSource!!.contains("参考")) {
+                    // TODO: 有时间转为when表达
+                    if (content.dataSource!!.contains("省市区代码")) {
+
+                        /** 获取省一级信息 */
+                        val provincialCityCodeList = DictProvincialCityCodeService.select(SFilter.isNull("parent"), SFilter.eq("specialCities", 0)).exec()
+                        val contentBean = ContentBean()
+                        val normalLiat = ArrayList<NormalBean>()
+                        for (province in provincialCityCodeList){
+                            val normalBean = NormalBean()
+                            normalBean.provinceCode = province.id
+                            normalBean.provinceName = province.name
+                            val infoList = ArrayList<ProvinceInfoBean>()
+                            val provinceInfoBean = ProvinceInfoBean()
+                            provinceInfoBean.code = province.code
+                            provinceInfoBean.name = province.name
+                            infoList.add(provinceInfoBean)
+                            normalBean.provinceInfo = infoList
+                            val arrayList = ArrayList<CitiesBean>()
+                            /** 城市 */
+                            val cityList = DictProvincialCityCodeService.select(SFilter.eq("parent", province.code!!)).exec()
+                            for (city in cityList){
+                                val citiesBean = CitiesBean()
+                                citiesBean.cityName = city.name
+                                citiesBean.cityCode = city.id
+                                citiesBean.climate = city.climateZone
+                                citiesBean.developLevel = city.developmentLevel
+
+                                val arrayListInfo = ArrayList<CityInfoBean>()
+
+                                val cityInfoBean = CityInfoBean()
+                                cityInfoBean.code = city.code
+                                cityInfoBean.altitude = city.altitude
+                                cityInfoBean.latitude = city.latitude
+                                cityInfoBean.longitude = city.longitude
+                                cityInfoBean.name = city.name
+                                arrayListInfo.add(cityInfoBean)
+                                citiesBean.cityInfo = arrayListInfo
+
+                                val regionArrayList = ArrayList<DistrictBean>()
+                                val regionList = DictProvincialCityCodeService.select(SFilter.eq("parent", city.code!!)).exec()
+                                for (region in regionList){
+                                    val districtBean = DistrictBean()
+                                    districtBean.code = region.code
+                                    districtBean.altitude = region.altitude
+                                    districtBean.districtCode = region.id
+                                    districtBean.developLevel = region.developmentLevel
+                                    districtBean.districtName = region.name
+                                    districtBean.latitude = region.latitude
+                                    districtBean.longitude = region.longitude
+                                    regionArrayList.add(districtBean)
+                                }
+                                citiesBean.district = regionArrayList
+
+                                arrayList.add(citiesBean)
+                            }
+                            normalBean.cities = arrayList
+                            normalLiat.add(normalBean)
+                        }
+
+                        contentBean.normal = normalLiat
+                        /** 特殊地区代码 */
+                        val specialList = DictProvincialCityCodeService.select(SFilter.isNull("parent"), SFilter.eq("specialCities", 1)).exec()
+
+                        val specialCitiesList = ArrayList<SpecialCitiesBean>()
+                        for (special in specialList){
+                            val specialCitiesBean = SpecialCitiesBean()
+                            specialCitiesBean.code = special.id
+                            specialCitiesBean.climate = special.climateZone
+                            specialCitiesBean.developLevel = special.developmentLevel
+                            specialCitiesBean.name = special.name
+
+                            val cityInfoBeanList = ArrayList<CityInfoBeanX>()
+                            val cityInfoBeanX = CityInfoBeanX()
+                            cityInfoBeanX.altitude = special.altitude
+                            cityInfoBeanX.code = special.code
+                            cityInfoBeanX.name = special.name
+                            cityInfoBeanX.latitude = special.latitude
+                            cityInfoBeanX.longitude = special.longitude
+                            cityInfoBeanList.add(cityInfoBeanX)
+                            specialCitiesBean.cityInfo = cityInfoBeanList
+
+                            val cityCodeList = DictProvincialCityCodeService.select(SFilter.eq("parent", special.code!!)).exec()
+                            val districtList = ArrayList<DistrictBeanX>()
+                            for (cityCode in cityCodeList){
+                                val districtBeanX = DistrictBeanX()
+                                districtBeanX.code = cityCode.code
+                                districtBeanX.altitude = cityCode.altitude
+                                districtBeanX.cityCode = cityCode.typeCode
+                                districtBeanX.districtCode = cityCode.id
+                                districtBeanX.districtName = cityCode.name
+                                districtBeanX.latitude = cityCode.latitude
+                                districtBeanX.longitude = cityCode.longitude
+                                districtBeanX.type = cityCode.type
+                                districtList.add(districtBeanX)
+                            }
+                            specialCitiesBean.district = districtList
+                            specialCitiesList.add(specialCitiesBean)
+                        }
+                        contentBean.specialCities = specialCitiesList
+                        logger.debug("城市信息=${contentBean.toJson()}")
+                        content.dataSource = contentBean.toJson()
+//                        content.dataSource = null
+                    } else if (content.dataSource!!.contains("气候区代码")) {
+                        content.dataSource = null
+                        try {
+                            val dictClimateAllList = ArrayList<DictClimate>()
+                            val  dictClimateList = DictClimateService.select(SFilter.isNull("parent")).exec()
+                            for (dictC in dictClimateList){
+                                val dic = DictClimate()
+                                dic.id = dictC.id
+                                dic.name = dictC.name
+    //                            val tree = RecursiveQuery.treeClimate(dic.id!!, true)
+                                val content = DictClimateService.select("parent" to dic.id!!).exec()
+    //                            logger.debug("dexecList =$tree")
+                                dic.content = content
+                                dictClimateAllList.add(dic)
+                            }
+                            content.dataSource = dictClimateAllList.toJson()
+                            logger.debug("气候区代码=${dictClimateAllList.toJson()}")
+                        } catch (e: Exception) {
+                            e.printStackTrace()
+                        }
+                    } else if (content.dataSource!!.contains("发展水平代码")) {
+                        content.dataSource = null
+                    } else if (content.dataSource!!.contains("天气状态")) {
+                        content.dataSource = null
+                    } else if (content.dataSource!!.contains("空气风力等级")) {
+                        content.dataSource = null
+                    } else if (content.dataSource!!.contains("方向代码")) {
+                        /** 方向代码 */
+                        val directionList = dictBuildingDirectService.selectAll().exec()
+                        val directionAllList = ArrayList<DictDirection>()
+                        for (direction in directionList){
+                            val dictDirection = DictDirection()
+                            dictDirection.id = direction.id
+                            dictDirection.name = direction.name
+                            dictDirection.angle = direction.angle
+                            dictDirection.directionCode = direction.directionCode
+                            directionAllList.add(dictDirection)
+                        }
+                        content.dataSource = directionAllList.toJson()
+                    } else if (content.dataSource!!.contains("建筑功能类型")) {
+                        val buildingList = dictBuildingFunctionalService.select(SFilter.eq("parent", "")).exec() as ArrayList<DictBuildingFunctional>
+                        for (b in buildingList){
+                            b.parent = null
+                            val treeBuildingFunctionalList = RecursiveQuery.treeBuildingFunctional(b.id!!, true)
+                            b.content = treeBuildingFunctionalList
+                        }
+                        content.dataSource = buildingList.toJson()
+                    } else if (content.dataSource!!.contains("空间功能类型")) {
+                        val dictSpaceFunctionalTypesList = spaceFunctionalservice.select(SFilter.isNull("parent")).exec()
+                        for (dictSpace in dictSpaceFunctionalTypesList){
+                            dictSpace.parent = null
+                            dictSpace.lastUpdate = null
+                            dictSpace.createTime = null
+                            val dictSpaceFunctionalTreeDictRental = RecursiveQuery.dictSpaceFunctionalTreeDictRental(dictSpace.id!!)
+                            dictSpace.content = dictSpaceFunctionalTreeDictRental
+                        }
+                        content.dataSource = dictSpaceFunctionalTypesList.toJson()
+                    } else if (content.dataSource!!.contains("租赁业态类型")) {
+                        val oneLevelList = dictRentalservice.select(SFilter.isNull("parent")).exec()
+                        for (oneLevel in oneLevelList) {
+                            oneLevel.parent = null
+                            oneLevel.lastUpdate = null
+                            oneLevel.createTime = null
+                            val treeSpaceFunctional = RecursiveQuery.treeDictRental(oneLevel.id!!)
+                            oneLevel.content = treeSpaceFunctional
+                        }
+                        content.dataSource = oneLevelList.toJson()
+                    } else if (content.dataSource!!.contains("抗震设防烈度")) {
+                        try {
+                            val dictSeismicFortificationIntensityList = dictSeismicFortificationIntensityService.selectAll().exec()
+                            if (!dictSeismicFortificationIntensityList.isEmpty()){
+                                content.dataSource = dictSeismicFortificationIntensityList.toJson()
+                            }else{
+                                content.dataSource = null
+                            }
+                        } catch (e: Exception) {
+                            e.printStackTrace()
+                            content.dataSource = null
+                        }
+                    } else if (content.dataSource!!.contains("污秽等级")) {
+
+                        val dictContaminationLevelList = dictContaminationLevelService.selectAll().exec()
+                        if (!dictContaminationLevelList.isEmpty()){
+                            content.dataSource = dictContaminationLevelList.toJson()
+                        }else{
+                            content.dataSource = null
+                        }
+
+                    } else if (content.dataSource!!.contains("污染等级")) {
+                        val dictPollutionLevelList = dictPollutionLevelService.selectAll().exec()
+                        content.dataSource = dictPollutionLevelList.toJson()
+
+                    } else if (content.dataSource!!.contains("防护等级")) {
+                        content.dataSource = null
+                    } else if (content.dataSource!!.contains("地理分区")) {
+                        content.dataSource = null
+                    } else if (content.dataSource!!.contains("职业分类")) {
+                        content.dataSource = null
+                    }
+                }
+            }
+            SQueryResponse(pageInfo)
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function pageQuery()
+
+    /**
+     * 查询之前操作
+     */
+    override fun onQueryBefore(queryBuilder: SQueryBuilder<PropertyDefProjectInfo>) {
+        val projectId = SPageContext.getHeader("ProjectId")
+        queryBuilder.tableName = "dict.f_filter_labels('$projectId')"
+
+        super.onQueryBefore(queryBuilder)
+    } // Function onQueryBefore()
+
+} // object PropertyDefService

+ 488 - 0
data-center/src/main/kotlin/com/persagy/server/services/dict/PropertyDefService.kt

@@ -0,0 +1,488 @@
+package com.persagy.server.services.dict
+
+import com.persagy.server.utils.RecursiveQuery
+import com.persagy.server.datacenter.models.entities.dict.*
+import com.persagy.server.datacenter.models.response.AllDictCategory
+import com.persagy.server.services.base.Service
+import com.sybotan.base.extensions.toJson
+import com.sybotan.base.utils.SJsonUtil
+import com.sybotan.database.SFilter
+import com.sybotan.database.functions.SLength
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.requests.SQueryRequest
+import com.sybotan.service.models.responses.SQueryResponse
+
+/**
+ * 数据字典说明
+ *
+ * @author 张维新
+ */
+object PropertyDefService : Service<DPropertyDefML>(SMybatisDao(DPropertyDefML::class.java)) {
+
+    /** 服务 */
+    private val dictRentalservice = SBaseService(SMybatisDao(DictRental::class.java))
+
+    /** 自定义信息点方案查询服务 */
+    private val projectSchemeService = SBaseService(SMybatisDao(ProjectScheme::class.java))
+    /** 自定义信息点方案内容 */
+    var schemeInfoService = SObjectService(SMybatisDao(DataPlatformSchemeInfo::class.java))
+
+
+    /**
+     * 分页查询
+     *
+     * @param   request     查询条件
+     * @return              查询结果
+     */
+    fun pageQuery(request: SQueryRequest): SQueryResponse<DPropertyDefML> {
+        return try {
+            val queryBuilder = select(request.filters)
+            if (null != request.projection) {
+                queryBuilder.projection(request.projection!!)
+            }
+            if (null != request.orders) {
+                queryBuilder.order(request.orders!!)
+            }
+            val pageInfo = queryBuilder.pageQuery(request.pageNumber, request.pageSize)
+            val contentList = pageInfo.content
+            for (content in contentList!!) {
+//                if (!"见《9租赁业态类型》".equals(content.dataSource, true)) continue
+//                val service = SBaseService(SMybatisDao(DictRentalSyn::class.java))
+//                content.dataSource = net.minidev.json.JSONArray.toJSONString(service.select(SFilter.notNull("id")).exec())
+
+                if (!content.dataSource.isNullOrEmpty() && content.dataSource!!.contains("见《")) {
+                    // TODO: 有时间转为when表达
+                    if (content.dataSource!!.contains("省市区代码")) {
+                        content.dataSource = null
+                    } else if (content.dataSource!!.contains("气候区代码")) {
+                        content.dataSource = null
+                    } else if (content.dataSource!!.contains("发展水平代码")) {
+                        content.dataSource = null
+                    } else if (content.dataSource!!.contains("天气状态")) {
+                        content.dataSource = null
+                    } else if (content.dataSource!!.contains("空气风力等级")) {
+                        content.dataSource = null
+                    } else if (content.dataSource!!.contains("方向代码")) {
+                        content.dataSource = null
+                    } else if (content.dataSource!!.contains("建筑功能类型")) {
+                        content.dataSource = null
+                    } else if (content.dataSource!!.contains("空间功能类型")) {
+                        content.dataSource = null
+                    } else if (content.dataSource!!.contains("租赁业态类型")) {
+                        val oneLevelList = dictRentalservice.select(SFilter.isNull("parent")).exec()
+                        for (oneLevel in oneLevelList) {
+                            oneLevel.parent = null
+                            oneLevel.lastUpdate = null
+                            oneLevel.createTime = null
+                            val treeSpaceFunctional = RecursiveQuery.treeDictRental(oneLevel.id!!)
+                            oneLevel.content = treeSpaceFunctional
+                        }
+                        content.dataSource = oneLevelList.toJson()
+                    } else if (content.dataSource!!.contains("抗震设防烈度")) {
+                        content.dataSource = null
+                    } else if (content.dataSource!!.contains("污秽等级")) {
+                        content.dataSource = null
+                    } else if (content.dataSource!!.contains("污染等级")) {
+                        content.dataSource = null
+                    } else if (content.dataSource!!.contains("防护等级")) {
+                        content.dataSource = null
+                    } else if (content.dataSource!!.contains("地理分区")) {
+                        content.dataSource = null
+                    } else if (content.dataSource!!.contains("职业分类")) {
+                        content.dataSource = null
+                    }
+                }
+            }
+
+            SQueryResponse(pageInfo)
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function query()
+
+    /**
+     * 查询竖井类型范围
+     */
+    fun pageQueryShaftType(): SQueryResponse<DictClimate> {
+        return try {
+            val propertyDef = select(SFilter.eq("infoPointCode", "ShaftFuncType")).entity()
+
+            val dictClimateList = SJsonUtil.fromJson<ArrayList<DictClimate>>(propertyDef!!.dataSource!!)
+            val sQueryResponse = SQueryResponse<DictClimate>(SResponseType.success)
+            sQueryResponse.content = dictClimateList
+            sQueryResponse.total = dictClimateList.size.toLong()
+            sQueryResponse
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function pageQueryShaftType()
+
+
+    /**
+     * 查询 字典全集信息
+     */
+    fun pageQueryAllDict(dictTypeList: ArrayList<String>): AllDictCategory {
+
+        val allDictCategory = AllDictCategory()
+        val projectId = SPageContext.getHeader("ProjectId")
+        val projectScheme = projectSchemeService.select(SFilter.eq("projectId", projectId!!)).entity()
+
+        try {
+            var list = ArrayList<DPropertyDefML>()
+            if (!dictTypeList.isNullOrEmpty() && dictTypeList.size > 0) {
+
+
+                for (dictType in dictTypeList) {
+
+                    if (dictType == "Project") {
+                        val dPropertyDef = DPropertyDefML()
+                        dPropertyDef.infoPointName = "项目"
+                        dPropertyDef.infoPointCode = "Project"
+
+                        val projectList = select(SFilter.eq("type", "Project"), SFilter.or(SFilter.eq("inputMode", "L"),SFilter.eq("inputMode", "M"))).exec()
+                        if (projectScheme!=null){
+                            val schemeInfoList = schemeInfoService.select(SFilter.eq("schemeId", projectScheme.schemeId!!), SFilter.eq("type", "project"),SFilter.or(SFilter.eq("inputMode", "L"),SFilter.eq("inputMode", "M"))).exec()
+                            if (!schemeInfoList.isNullOrEmpty()){
+                                for (schemeInfo in schemeInfoList){
+                                    val dPropertyDefML = DPropertyDefML()
+                                    dPropertyDefML.dataSource = schemeInfo.dataSource
+                                    dPropertyDefML.dataType = schemeInfo.dataType
+                                    dPropertyDefML.firstName = schemeInfo.firstName
+                                    dPropertyDefML.firstTag = schemeInfo.firstTag
+                                    dPropertyDefML.infoPointCode = schemeInfo.infoPointCode
+                                    dPropertyDefML.infoPointName = schemeInfo.infoPointName
+                                    dPropertyDefML.inputMode = schemeInfo.inputMode
+                                    dPropertyDefML.note = schemeInfo.note
+                                    dPropertyDefML.priority = schemeInfo.priority
+                                    dPropertyDefML.secondName = schemeInfo.secondName
+                                    dPropertyDefML.secondTag = schemeInfo.secondTag
+                                    dPropertyDefML.unit = schemeInfo.unit
+                                    projectList.add(dPropertyDefML)
+                                }
+                            }
+                        }
+                        dPropertyDef.content = projectList
+                        list.add(dPropertyDef)
+
+                    } else if (dictType == "Building") {
+                        val dPropertyDef = DPropertyDefML()
+                        dPropertyDef.infoPointName = "建筑"
+                        dPropertyDef.infoPointCode = "Building"
+                        val buildingList = select(SFilter.eq("type", "Building"), SFilter.or(SFilter.eq("inputMode", "L"),SFilter.eq("inputMode", "M"))).exec()
+
+                        if (projectScheme!=null){
+                            val schemeInfoList = schemeInfoService.select(SFilter.eq("schemeId", projectScheme.schemeId!!), SFilter.eq("type", "building"),SFilter.or(SFilter.eq("inputMode", "L"),SFilter.eq("inputMode", "M"))).exec()
+                            if (!schemeInfoList.isNullOrEmpty()){
+                                for (schemeInfo in schemeInfoList){
+                                    val dPropertyDefML = DPropertyDefML()
+                                    dPropertyDefML.dataSource = schemeInfo.dataSource
+                                    dPropertyDefML.dataType = schemeInfo.dataType
+                                    dPropertyDefML.firstName = schemeInfo.firstName
+                                    dPropertyDefML.firstTag = schemeInfo.firstTag
+                                    dPropertyDefML.infoPointCode = schemeInfo.infoPointCode
+                                    dPropertyDefML.infoPointName = schemeInfo.infoPointName
+                                    dPropertyDefML.inputMode = schemeInfo.inputMode
+                                    dPropertyDefML.note = schemeInfo.note
+                                    dPropertyDefML.priority = schemeInfo.priority
+                                    dPropertyDefML.secondName = schemeInfo.secondName
+                                    dPropertyDefML.secondTag = schemeInfo.secondTag
+                                    dPropertyDefML.unit = schemeInfo.unit
+                                    buildingList.add(dPropertyDefML)
+                                }
+                            }
+                        }
+
+                        dPropertyDef.content = buildingList
+                        list.add(dPropertyDef)
+                    } else if (dictType == "Floor") {
+                        val dPropertyDef = DPropertyDefML()
+                        dPropertyDef.infoPointName = "楼层"
+                        dPropertyDef.infoPointCode = "Floor"
+                        val floorList = select(SFilter.eq("type", "Floor"), SFilter.or(SFilter.eq("inputMode", "L"),SFilter.eq("inputMode", "M"))).exec()
+
+                        if (projectScheme!=null){
+                            val schemeInfoList = schemeInfoService.select(SFilter.eq("schemeId", projectScheme.schemeId!!), SFilter.eq("type", "floor"),SFilter.or(SFilter.eq("inputMode", "L"),SFilter.eq("inputMode", "M"))).exec()
+                            if (!schemeInfoList.isNullOrEmpty()){
+                                for (schemeInfo in schemeInfoList){
+                                    val dPropertyDefML = DPropertyDefML()
+                                    dPropertyDefML.dataSource = schemeInfo.dataSource
+                                    dPropertyDefML.dataType = schemeInfo.dataType
+                                    dPropertyDefML.firstName = schemeInfo.firstName
+                                    dPropertyDefML.firstTag = schemeInfo.firstTag
+                                    dPropertyDefML.infoPointCode = schemeInfo.infoPointCode
+                                    dPropertyDefML.infoPointName = schemeInfo.infoPointName
+                                    dPropertyDefML.inputMode = schemeInfo.inputMode
+                                    dPropertyDefML.note = schemeInfo.note
+                                    dPropertyDefML.priority = schemeInfo.priority
+                                    dPropertyDefML.secondName = schemeInfo.secondName
+                                    dPropertyDefML.secondTag = schemeInfo.secondTag
+                                    dPropertyDefML.unit = schemeInfo.unit
+                                    floorList.add(dPropertyDefML)
+                                }
+                            }
+                        }
+
+                        dPropertyDef.content = floorList
+                        list.add(dPropertyDef)
+                    } else if (dictType == "Equipment") {
+                        val dPropertyDef = DPropertyDefML()
+                        dPropertyDef.infoPointName = "设备"
+                        dPropertyDef.infoPointCode = "Equipment"
+                        val equipmentCategoryList = DClassDefService.select(SFilter.eq(SLength("id"), 4), SFilter.not(SFilter.isNull("parentId"))).exec()
+                        var listEquip = ArrayList<DPropertyDefML>()
+                        if (!equipmentCategoryList.isNullOrEmpty() && equipmentCategoryList.size > 0) {
+                            for (equipmentCategory in equipmentCategoryList) {
+                                val dPropertyDef = DPropertyDefML()
+                                dPropertyDef.infoPointCode = equipmentCategory.id
+                                dPropertyDef.infoPointName = equipmentCategory.name
+                                val exec = select(SFilter.eq("type", equipmentCategory.id!!), SFilter.or(SFilter.eq("inputMode", "L"),SFilter.eq("inputMode", "M"))).exec()
+
+                                if (projectScheme!=null){
+                                    val schemeInfoList = schemeInfoService.select(SFilter.eq("schemeId", projectScheme.schemeId!!), SFilter.eq("type", equipmentCategory.id!!),SFilter.or(SFilter.eq("inputMode", "L"),SFilter.eq("inputMode", "M"))).exec()
+                                    if (!schemeInfoList.isNullOrEmpty()){
+                                        for (schemeInfo in schemeInfoList){
+                                            val dPropertyDefML = DPropertyDefML()
+                                            dPropertyDefML.dataSource = schemeInfo.dataSource
+                                            dPropertyDefML.dataType = schemeInfo.dataType
+                                            dPropertyDefML.firstName = schemeInfo.firstName
+                                            dPropertyDefML.firstTag = schemeInfo.firstTag
+                                            dPropertyDefML.infoPointCode = schemeInfo.infoPointCode
+                                            dPropertyDefML.infoPointName = schemeInfo.infoPointName
+                                            dPropertyDefML.inputMode = schemeInfo.inputMode
+                                            dPropertyDefML.note = schemeInfo.note
+                                            dPropertyDefML.priority = schemeInfo.priority
+                                            dPropertyDefML.secondName = schemeInfo.secondName
+                                            dPropertyDefML.secondTag = schemeInfo.secondTag
+                                            dPropertyDefML.unit = schemeInfo.unit
+                                            exec.add(dPropertyDefML)
+                                        }
+                                    }
+                                }
+
+
+                                dPropertyDef.content = exec
+                                listEquip.add(dPropertyDef)
+                            }
+                        }
+                        dPropertyDef.content = listEquip
+                        list.add(dPropertyDef)
+                    } else if (dictType == "Component") {
+                        val dPropertyDef = DPropertyDefML()
+                        dPropertyDef.infoPointName = "部件"
+                        dPropertyDef.infoPointCode = "Component"
+                        var listComponent = ArrayList<DPropertyDefML>()
+                        val execComponentList = DClassDefService.select(SFilter.eq(SLength("id"), 6), SFilter.not(SFilter.isNull("parentId")),
+                                SFilter.not(SFilter.eq("parentId", "Space")), SFilter.not(SFilter.eq("name", "租户"))).exec()
+                        if (!execComponentList.isNullOrEmpty() && execComponentList.size > 0) {
+                            for (execComponent in execComponentList) {
+                                val dPropertyDef = DPropertyDefML()
+                                dPropertyDef.infoPointCode = execComponent.id
+                                dPropertyDef.infoPointName = execComponent.name
+                                val exec = select(SFilter.eq("type", execComponent.id!!), SFilter.or(SFilter.eq("inputMode", "L"),SFilter.eq("inputMode", "M"))).exec()
+
+                                if (projectScheme!=null){
+                                    val schemeInfoList = schemeInfoService.select(SFilter.eq("schemeId", projectScheme.schemeId!!), SFilter.eq("type", execComponent.id!!),SFilter.or(SFilter.eq("inputMode", "L"),SFilter.eq("inputMode", "M"))).exec()
+                                    if (!schemeInfoList.isNullOrEmpty()){
+                                        for (schemeInfo in schemeInfoList){
+                                            val dPropertyDefML = DPropertyDefML()
+                                            dPropertyDefML.dataSource = schemeInfo.dataSource
+                                            dPropertyDefML.dataType = schemeInfo.dataType
+                                            dPropertyDefML.firstName = schemeInfo.firstName
+                                            dPropertyDefML.firstTag = schemeInfo.firstTag
+                                            dPropertyDefML.infoPointCode = schemeInfo.infoPointCode
+                                            dPropertyDefML.infoPointName = schemeInfo.infoPointName
+                                            dPropertyDefML.inputMode = schemeInfo.inputMode
+                                            dPropertyDefML.note = schemeInfo.note
+                                            dPropertyDefML.priority = schemeInfo.priority
+                                            dPropertyDefML.secondName = schemeInfo.secondName
+                                            dPropertyDefML.secondTag = schemeInfo.secondTag
+                                            dPropertyDefML.unit = schemeInfo.unit
+                                            exec.add(dPropertyDefML)
+                                        }
+                                    }
+                                }
+
+                                dPropertyDef.content = exec
+                                listComponent.add(dPropertyDef)
+                            }
+                            dPropertyDef.content = listComponent
+                            list.add(dPropertyDef)
+                        }
+                    }else if (dictType == "Shaft") {
+                        val dPropertyDef = DPropertyDefML()
+                        dPropertyDef.infoPointName = "竖井"
+                        dPropertyDef.infoPointCode = "Shaft"
+                        val shaftList = select(SFilter.eq("type", "Shaft"), SFilter.or(SFilter.eq("inputMode", "L"),SFilter.eq("inputMode", "M"))).exec()
+
+                        if (projectScheme!=null){
+                            val schemeInfoList = schemeInfoService.select(SFilter.eq("schemeId", projectScheme.schemeId!!), SFilter.eq("type", "shaft"),SFilter.or(SFilter.eq("inputMode", "L"),SFilter.eq("inputMode", "M"))).exec()
+                            if (!schemeInfoList.isNullOrEmpty()){
+                                for (schemeInfo in schemeInfoList){
+                                    val dPropertyDefML = DPropertyDefML()
+                                    dPropertyDefML.dataSource = schemeInfo.dataSource
+                                    dPropertyDefML.dataType = schemeInfo.dataType
+                                    dPropertyDefML.firstName = schemeInfo.firstName
+                                    dPropertyDefML.firstTag = schemeInfo.firstTag
+                                    dPropertyDefML.infoPointCode = schemeInfo.infoPointCode
+                                    dPropertyDefML.infoPointName = schemeInfo.infoPointName
+                                    dPropertyDefML.inputMode = schemeInfo.inputMode
+                                    dPropertyDefML.note = schemeInfo.note
+                                    dPropertyDefML.priority = schemeInfo.priority
+                                    dPropertyDefML.secondName = schemeInfo.secondName
+                                    dPropertyDefML.secondTag = schemeInfo.secondTag
+                                    dPropertyDefML.unit = schemeInfo.unit
+                                    shaftList.add(dPropertyDefML)
+                                }
+                            }
+                        }
+
+                        dPropertyDef.content = shaftList
+                        list.add(dPropertyDef)
+                    } else if (dictType == "GeneralSystem") {
+
+
+                        val dPropertyDef = DPropertyDefML()
+                        dPropertyDef.infoPointName = "系统"
+                        dPropertyDef.infoPointCode = "GeneralSystem"
+                        /** 专业 */
+                        val execGeneralSystemList = DClassDefService.select(SFilter.eq(SLength("id"), 2), SFilter.eq("parentId", "AllProfessionalSystemEquipment")).exec()
+                        var listSy = ArrayList<DPropertyDefML>()
+                        if (!execGeneralSystemList.isNullOrEmpty() && execGeneralSystemList.size > 0) {
+                            for (execGeneralSystem in execGeneralSystemList) {
+                                /** 专业 */
+                                val dPropertyDef = DPropertyDefML()
+                                dPropertyDef.infoPointCode = execGeneralSystem.id
+                                dPropertyDef.infoPointName = execGeneralSystem.name
+
+                                val generalSystemList = DClassDefService.select(SFilter.eq("parentId", execGeneralSystem.id!!)).exec()
+                                val listsys = ArrayList<DPropertyDefML>()
+                                for (generalSystem in generalSystemList){
+                                    /** 系统 */
+                                    val dPropertyDef = DPropertyDefML()
+                                    dPropertyDef.infoPointCode = generalSystem.id
+                                    dPropertyDef.infoPointName = generalSystem.name
+                                    val general = select(SFilter.eq("type", generalSystem.id!!), SFilter.or(SFilter.eq("inputMode", "L"),SFilter.eq("inputMode", "M"))).exec()
+
+                                    if (projectScheme!=null){
+                                        val schemeInfoList = schemeInfoService.select(SFilter.eq("schemeId", projectScheme.schemeId!!), SFilter.eq("type", generalSystem.id!!),SFilter.or(SFilter.eq("inputMode", "L"),SFilter.eq("inputMode", "M"))).exec()
+                                        if (!schemeInfoList.isNullOrEmpty()){
+                                            for (schemeInfo in schemeInfoList){
+                                                val dPropertyDefML = DPropertyDefML()
+                                                dPropertyDefML.dataSource = schemeInfo.dataSource
+                                                dPropertyDefML.dataType = schemeInfo.dataType
+                                                dPropertyDefML.firstName = schemeInfo.firstName
+                                                dPropertyDefML.firstTag = schemeInfo.firstTag
+                                                dPropertyDefML.infoPointCode = schemeInfo.infoPointCode
+                                                dPropertyDefML.infoPointName = schemeInfo.infoPointName
+                                                dPropertyDefML.inputMode = schemeInfo.inputMode
+                                                dPropertyDefML.note = schemeInfo.note
+                                                dPropertyDefML.priority = schemeInfo.priority
+                                                dPropertyDefML.secondName = schemeInfo.secondName
+                                                dPropertyDefML.secondTag = schemeInfo.secondTag
+                                                dPropertyDefML.unit = schemeInfo.unit
+                                                general.add(dPropertyDefML)
+                                            }
+                                        }
+                                    }
+
+                                    dPropertyDef.content = general
+                                    listsys.add(dPropertyDef)
+                                }
+                                dPropertyDef.content = listsys
+                                listSy.add(dPropertyDef)
+                            }
+                        }
+                        dPropertyDef.content = listSy
+                        list.add(dPropertyDef)
+                    } else if (dictType == "Tenant") {
+                        val dPropertyDef = DPropertyDefML()
+                        dPropertyDef.infoPointName = "租户"
+                        dPropertyDef.infoPointCode = "Tenant"
+                        val tenantList = select(SFilter.eq("type", "Tenant"), SFilter.or(SFilter.eq("inputMode", "L"),SFilter.eq("inputMode", "M"))).exec()
+
+                        if (projectScheme!=null){
+                            val schemeInfoList = schemeInfoService.select(SFilter.eq("schemeId", projectScheme.schemeId!!), SFilter.eq("type", "Tenant"),SFilter.or(SFilter.eq("inputMode", "L"),SFilter.eq("inputMode", "M"))).exec()
+                            if (!schemeInfoList.isNullOrEmpty()){
+                                for (schemeInfo in schemeInfoList){
+                                    val dPropertyDefML = DPropertyDefML()
+                                    dPropertyDefML.dataSource = schemeInfo.dataSource
+                                    dPropertyDefML.dataType = schemeInfo.dataType
+                                    dPropertyDefML.firstName = schemeInfo.firstName
+                                    dPropertyDefML.firstTag = schemeInfo.firstTag
+                                    dPropertyDefML.infoPointCode = schemeInfo.infoPointCode
+                                    dPropertyDefML.infoPointName = schemeInfo.infoPointName
+                                    dPropertyDefML.inputMode = schemeInfo.inputMode
+                                    dPropertyDefML.note = schemeInfo.note
+                                    dPropertyDefML.priority = schemeInfo.priority
+                                    dPropertyDefML.secondName = schemeInfo.secondName
+                                    dPropertyDefML.secondTag = schemeInfo.secondTag
+                                    dPropertyDefML.unit = schemeInfo.unit
+                                    tenantList.add(dPropertyDefML)
+                                }
+                            }
+                        }
+
+                        dPropertyDef.content = tenantList
+                        list.add(dPropertyDef)
+                    }  else if (dictType == "Space") {
+                        val dPropertyDef = DPropertyDefML()
+                        dPropertyDef.infoPointName = "空间"
+                        dPropertyDef.infoPointCode = "Space"
+                        var listSpace = ArrayList<DPropertyDefML>()
+                        val execSpaceList = DClassDefService.select(SFilter.eq("parentId", "Space"), SFilter.not(SFilter.isNull("parentId")), SFilter.not(SFilter.eq("id", "Ispace"))).exec()
+                        if (!execSpaceList.isNullOrEmpty() && execSpaceList.size > 0) {
+                            for (execSpace in execSpaceList) {
+                                val dPropertyDef = DPropertyDefML()
+                                dPropertyDef.infoPointCode = execSpace.id
+                                dPropertyDef.infoPointName = execSpace.name
+                                val exec = select(SFilter.eq("type", execSpace.id!!), SFilter.or(SFilter.eq("inputMode", "L"),SFilter.eq("inputMode", "M"))).exec()
+
+                                if (projectScheme!=null){
+                                    val schemeInfoList = schemeInfoService.select(SFilter.eq("schemeId", projectScheme.schemeId!!), SFilter.eq("type", execSpace.id!!),SFilter.or(SFilter.eq("inputMode", "L"),SFilter.eq("inputMode", "M"))).exec()
+                                    if (!schemeInfoList.isNullOrEmpty()){
+                                        for (schemeInfo in schemeInfoList){
+                                            val dPropertyDefML = DPropertyDefML()
+                                            dPropertyDefML.dataSource = schemeInfo.dataSource
+                                            dPropertyDefML.dataType = schemeInfo.dataType
+                                            dPropertyDefML.firstName = schemeInfo.firstName
+                                            dPropertyDefML.firstTag = schemeInfo.firstTag
+                                            dPropertyDefML.infoPointCode = schemeInfo.infoPointCode
+                                            dPropertyDefML.infoPointName = schemeInfo.infoPointName
+                                            dPropertyDefML.inputMode = schemeInfo.inputMode
+                                            dPropertyDefML.note = schemeInfo.note
+                                            dPropertyDefML.priority = schemeInfo.priority
+                                            dPropertyDefML.secondName = schemeInfo.secondName
+                                            dPropertyDefML.secondTag = schemeInfo.secondTag
+                                            dPropertyDefML.unit = schemeInfo.unit
+                                            exec.add(dPropertyDefML)
+                                        }
+                                    }
+                                }
+
+                                dPropertyDef.content = exec
+                                listSpace.add(dPropertyDef)
+                            }
+                            dPropertyDef.content = listSpace
+                            list.add(dPropertyDef)
+                        }
+                    }
+                }
+            }
+            allDictCategory.content = list
+            allDictCategory.result = SResponseType.success
+            return allDictCategory
+        } catch (e: Exception) {
+            e.printStackTrace()
+            allDictCategory.result = SResponseType.failure
+            return allDictCategory
+        }
+
+    } // Function pageQueryAllDict()
+
+} // object PropertyDefService

+ 18 - 0
data-center/src/main/kotlin/com/persagy/server/services/graphtype/BaseDataService.kt

@@ -0,0 +1,18 @@
+package com.persagy.server.services.graphtype
+
+import com.persagy.server.datacenter.models.entities.graphtype.MDoor
+import com.persagy.server.datacenter.models.entities.graphtype.MVirtualWall
+import com.persagy.server.datacenter.models.entities.graphtype.MWindow
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SObjectService
+
+/**
+ *
+ *
+ * @author jxing
+ */
+object BaseDataService {
+    val virtualWallService = SObjectService(SMybatisDao(MVirtualWall::class.java))
+    val doorService = SObjectService(SMybatisDao(MDoor::class.java))
+    val windowService = SObjectService(SMybatisDao(MWindow::class.java))
+}

+ 53 - 0
data-center/src/main/kotlin/com/persagy/server/services/graphtype/ConnectedBlockService.kt

@@ -0,0 +1,53 @@
+package com.persagy.server.services.graphtype
+
+import com.persagy.server.services.base.RService
+import com.persagy.server.datacenter.models.entities.graphtype.block.ConnectedBlockFamilyItem
+import com.persagy.server.datacenter.models.entities.graphtype.block.ConnectedBlockItem
+import com.persagy.server.datacenter.models.entities.graphtype.block.ConnectedBlockResponse
+import com.persagy.server.services.dict.EquipFamilyService
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.requests.SQueryRequest
+import com.sybotan.service.models.responses.SQueryResponse
+import org.slf4j.LoggerFactory
+
+/**
+ * 源末端
+ *
+ * @author  邓婷婷
+ */
+object ConnectedBlockService : RService<ConnectedBlockFamilyItem>(SMybatisDao(ConnectedBlockFamilyItem::class.java))  {
+
+    // 日志
+    private val logger = LoggerFactory.getLogger(ConnectedBlockService::class.java)
+
+
+    fun getConnectedBlock( request: SQueryRequest): SQueryResponse<ConnectedBlockResponse> {
+        var projectId = SPageContext.getHeader("ProjectId")
+        val responseList = ArrayList<ConnectedBlockResponse>()
+        val result = SQueryResponse<ConnectedBlockResponse>()
+        val list1 = ConnectedBlockService.select(request.filters).filter(SFilter.eq("projectId",projectId!!)).projection("blockId").distinct().exec()
+        for(block in list1){
+            val response = ConnectedBlockResponse()
+            val familyItem = ArrayList<ConnectedBlockItem>()
+
+            response.blockId = block.blockId
+
+            val list2 = ConnectedBlockService.select(request.filters).filter(SFilter.eq("projectId",projectId!!),SFilter.eq("blockId",block.blockId!!)).projection("family").distinct().exec()
+            for(family in list2){
+                val f = ConnectedBlockItem()
+                f.family = family.family
+                val equipFamily = EquipFamilyService.select(SFilter.eq("equipCode",family.family!!)).entity()
+                f.familyName = equipFamily!!.equipName
+                f.items = ConnectedBlockService.select(request.filters).filter(SFilter.eq("projectId",projectId!!), SFilter.eq("blockId", block.blockId!!), SFilter.eq("family", family.family!!)).exec()
+                familyItem.add(f)
+            }
+            response.items = familyItem
+            responseList.add(response)
+        }
+        result.content = responseList
+        return result
+    } // Fun
+
+} // Class ConnectedBlockService

+ 47 - 0
data-center/src/main/kotlin/com/persagy/server/services/graphtype/ConnectedBlockSourceService.kt

@@ -0,0 +1,47 @@
+package com.persagy.server.services.graphtype
+
+import com.persagy.server.services.base.RService
+import com.persagy.server.datacenter.models.entities.graphtype.block.ConnectedBlockSource
+import com.persagy.server.datacenter.models.entities.graphtype.block.ConnectedBlockSourceRequest
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.responses.SCreateResponse
+import org.slf4j.LoggerFactory
+
+/**
+ * 源末端
+ *
+ * @author  邓婷婷
+ */
+object ConnectedBlockSourceService : RService<ConnectedBlockSource>(SMybatisDao(ConnectedBlockSource::class.java))  {
+
+    // 日志
+    private val logger = LoggerFactory.getLogger(ConnectedBlockSourceService::class.java)
+
+    /**
+     * 覆盖源末端
+     */
+    fun replaceConnectedBlockSource(request: ConnectedBlockSourceRequest): SCreateResponse<ConnectedBlockSource> {
+       return try {
+            var projectId = SPageContext.getHeader("ProjectId")
+            if(projectId.isNullOrEmpty()){
+               projectId = request.projectId
+            }
+           if(request.buildingId == null){
+               delete("projectId = '$projectId' and buildingId isnull and domain = '${request.domain}' and mepSystemType = '${request.mepSystemType}'")
+           }else {
+               delete("projectId = '$projectId' and  buildingId = '${request.buildingId}' and domain = '${request.domain}' and mepSystemType = '${request.mepSystemType}'")
+           }
+            val sCreateRequest = SCreateRequest<ConnectedBlockSource>()
+            sCreateRequest.content = request.sourceList!!
+            ConnectedBlockSourceService.createList(sCreateRequest)
+        }catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Fun replaceConnectedBlockSource
+
+
+} // Class ConnectedBlockSourceService

+ 207 - 0
data-center/src/main/kotlin/com/persagy/server/services/graphtype/GraphicTypeMapperService.kt

@@ -0,0 +1,207 @@
+package com.persagy.server.services.graphtype
+
+import com.persagy.server.services.base.RService
+import com.persagy.server.datacenter.models.entities.graphtype.GraphicType
+import com.persagy.server.datacenter.models.entities.graphtype.RelationTypeProject
+import com.persagy.server.datacenter.models.entities.rel.*
+import com.persagy.server.mappers.IRelationCountMapper
+import com.persagy.server.services.objects.EquipmentService
+import com.persagy.server.services.objects.FloorService
+import com.persagy.server.services.objects.PropertyService
+import com.persagy.server.services.rel.RSyInBdService
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.responses.SQueryResponse
+import org.slf4j.LoggerFactory
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Service
+
+/**
+ * 查询总览
+ *
+ * @author  邓婷婷
+ */
+@Service
+open class GraphicTypeMapperService {
+
+    // 日志
+    private val logger = LoggerFactory.getLogger(GraphicTypeMapperService::class.java)
+
+    /** 实例化 mapper 对象 */
+    @Autowired
+    lateinit var mapper: IRelationCountMapper
+
+    /**
+     * 查询数量
+     */
+    fun queryCount(): SQueryResponse<GraphicType> {
+        return try {
+            val queryResponse = SQueryResponse<GraphicType>()
+            val projectId = SPageContext.getHeader("ProjectId")
+            val graphicTypeService = RService(SMybatisDao(GraphicType::class.java))
+            val relationTypeProjectService = RService(SMybatisDao(RelationTypeProject::class.java))
+            val graphicTypeList = graphicTypeService.select(SFilter.not(SFilter.isNull("parentId"))).exec()
+            for(graphicType in graphicTypeList){
+                val relationTypeProjectList = relationTypeProjectService.select(SFilter.eq("graphicId",graphicType.graphTypeId!!),SFilter.eq("projectId",projectId!!)).exec()
+               logger.debug("數據={${graphicType.graphTypeName}  數量:{${relationTypeProjectList.size}} }")
+
+                for(relationTypeProject in relationTypeProjectList){
+                    val tableName = relationTypeProject.tableName
+                    if(!tableName.isNullOrEmpty()&&tableName!=""){
+                        val names = tableName.split(",")
+                        var count = 0
+                        for(n in names){
+                            count += mapper.relationCount(n!!, projectId)
+                        }
+                        if(relationTypeProject.isThorough!!){
+                            relationTypeProject.count = (count / 2).toLong()
+                        }else{
+                            relationTypeProject.count = count.toLong()
+                        }
+                    }else{
+                        relationTypeProject.count = 0
+                    }
+                }
+                graphicType.relationTypeProjectList = relationTypeProjectList
+            }
+            queryResponse.content = graphicTypeList
+            queryResponse
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, e.message!!)
+        }
+    }
+
+    /**
+     * 查询数量
+     */
+    fun queryCounts(): SQueryResponse<GraphicType> {
+        return try {
+            val rTn2SptService = RService(SMybatisDao(RTn2Sp::class.java))
+            val rSh2SpService = RService(SMybatisDao(RSh2Sp::class.java))
+            val rEq2SyService = RService(SMybatisDao(REq2Sy::class.java))
+            val rPe2SpService = RService(SMybatisDao(RPe2Sp::class.java))
+            val rEq2EqService = RService(SMybatisDao(REq2Eq::class.java))
+            val rSy2SpService = RService(SMybatisDao(RSy2Sp::class.java))
+            val rEq2SpService = RService(SMybatisDao(REq2Sp::class.java))
+            val rSp2SpService = RService(SMybatisDao(RSp2Sp::class.java))
+            val queryResponse = SQueryResponse<GraphicType>()
+            val projectId = SPageContext.getHeader("ProjectId")
+            val graphicTypeService = RService(SMybatisDao(GraphicType::class.java))
+            val relationTypeProjectService = RService(SMybatisDao(RelationTypeProject::class.java))
+            val graphicTypeList = graphicTypeService.select(SFilter.not(SFilter.isNull("parentId"))).exec()
+            for(graphicType in graphicTypeList){
+                val relationTypeProjectList = relationTypeProjectService.select(SFilter.eq("graphicId",graphicType.graphTypeId!!),SFilter.eq("projectId",projectId!!)).exec()
+
+                for(relationTypeProject in relationTypeProjectList){
+                    val tableName = relationTypeProject.tableName
+                    if(!tableName.isNullOrEmpty()&&tableName!=""){
+                        var count = 0
+                        val names = tableName.split(",")
+                        for(n in names){
+                            logger.debug("數據=${n  }")
+                            if (n == "r_sy_in_fl"||n =="r_sh_through_sh"||n =="r_sh_in_bd"
+                                    ||n =="r_sy_for_bd"|| n =="r_sy_in_sh"|| n =="r_eq_for_fl"
+                                    || n =="r_sy_for_fl"||n =="r_sy_eq"||n =="r_sy_for_sh"
+                                    ||n =="r_fl_through_fl"||n =="zone_space_base"||n =="floor"||n =="equipment"
+                                    ||n =="general_system"||n =="r_eq_for_sh"||n =="r_eq_in_sh"
+                                    ||n =="r_pe_in_sh"||n =="r_eq_for_bd"||n =="property"||n == "r_sp_in_bd"
+                                    ||n =="r_sp_in_fl"){
+                                count += mapper.relationCount(n!!, projectId)
+                            }else if (n =="r_tn2sp"){
+                                val exec = rTn2SptService.select(SFilter.eq("projectId", projectId), SFilter.eq("type", relationTypeProject.relationType!!)).exec()
+                                count += exec.size
+                            }else if (n =="r_sh2sp"){
+                                try {
+                                    logger.debug("类型=${relationTypeProject.relationType  }")
+                                    val exec = rSh2SpService.select(SFilter.eq("ProjectId", projectId), SFilter.eq("Type", relationTypeProject.relationType!!)).exec()
+                                    count += exec.size
+                                } catch (e: Exception) {
+                                    e.printStackTrace()
+                                }
+                            }else if (n =="r_eq2sy"){
+                                val exec = rEq2SyService.select(SFilter.eq("projectId", projectId), SFilter.eq("type", relationTypeProject.relationType!!)).exec()
+                                count += exec.size
+                            }else  if (n =="r_pe2sp"){
+                                val exec = rPe2SpService.select(SFilter.eq("ProjectId", projectId), SFilter.eq("Type", relationTypeProject.relationType!!)).exec()
+                                count += exec.size
+                                logger.debug("资产= ${exec.size}")
+                            }else if (n =="r_eq2eq"){
+                                val exec = rEq2EqService.select(SFilter.eq("projectId", projectId), SFilter.eq("type", relationTypeProject.relationType!!)).exec()
+                                count += exec.size
+                            }else if (n =="r_sy2sp"){
+                                val exec = rSy2SpService.select(SFilter.eq("projectId", projectId), SFilter.eq("type", relationTypeProject.relationType!!)).exec()
+                                count += exec.size
+                            }else if (n =="r_eq2sp"){
+                                if (!relationTypeProject.zoneType.isNullOrEmpty()){
+                                    val exec = rEq2SpService.select(SFilter.eq("projectId", projectId), SFilter.eq("type", relationTypeProject.relationType!!),SFilter.eq("ZoneType", relationTypeProject.zoneType!!)).exec()
+                                    count += exec.size
+                                    logger.debug("空间数量=${relationTypeProject.relationType  }    ${exec.size} ****************************************************************************************************")
+                                }else{
+                                    val exec = rEq2SpService.select(SFilter.eq("projectId", projectId), SFilter.eq("type", relationTypeProject.relationType!!)).exec()
+                                    count += exec.size
+                                }
+                            }else if (n =="r_sp2sp"){
+                                val exec = rSp2SpService.select(SFilter.eq("projectId", projectId), SFilter.eq("type", relationTypeProject.relationType!!)).exec()
+                                count += exec.size
+                            }else if (n == "property_eq"){
+                                val exec = PropertyService.select(SFilter.eq("projectId", projectId!!), SFilter.not(SFilter.isNull("EquipmentId"))).exec()
+                                count += exec.size
+                            }else if (n == "property_fl"){
+                                val exec = PropertyService.select(SFilter.eq("projectId", projectId!!), SFilter.not(SFilter.isNull("floorId"))).exec()
+                                count += exec.size
+                            }else if (n == "equipment_com"){
+                                val exec = EquipmentService.select(SFilter.eq("projectId", projectId!!), SFilter.not(SFilter.isNull("parentId"))).exec()
+                                count = exec.size
+                            }else if (n == "bd_sy_eq_com"){
+                                val rSyInBdList = RSyInBdService.select(SFilter.eq("projectId", projectId!!)).exec()
+                                count += rSyInBdList.size
+                                val execEquip = EquipmentService.select(SFilter.eq("projectId", projectId!!), SFilter.not(SFilter.isNull("buildingId"))).exec()
+                                count += execEquip.size
+                                val exec = EquipmentService.select(SFilter.eq("projectId", projectId!!), SFilter.not(SFilter.isNull("parentId"))).exec()
+                                count += exec.size
+                            }else if (n == "property_bd"){
+                                val execEquip = PropertyService.select(SFilter.eq("projectId", projectId!!), SFilter.not(SFilter.isNull("buildingId"))).exec()
+                                count += execEquip.size
+                            }else if (n == "floor_bd"){
+                                val execEquip = FloorService.select(SFilter.eq("projectId", projectId!!), SFilter.not(SFilter.isNull("buildId"))).exec()
+                                count += execEquip.size
+                            }else if (n == "equipment_fl"){
+                                val execEquip = EquipmentService.select(SFilter.eq("projectId", projectId!!), SFilter.not(SFilter.isNull("floorId")))
+                                execEquip.tableName = "v_equipment"
+                                val exec = execEquip.exec()
+                                count += exec.size
+                            }
+                        }
+//                        for(n in names){
+//                            count += mapper.relationCount(n!!, projectId)
+//                        }
+//                        if(relationTypeProject.isThorough!!){
+//                            relationTypeProject.count = (count / 2).toLong()
+//                        }else{
+                            relationTypeProject.count = count.toLong()
+//                        }
+                    }else{
+                        relationTypeProject.count = 0
+                    }
+                }
+                graphicType.relationTypeProjectList = relationTypeProjectList
+            }
+            queryResponse.content = graphicTypeList
+            queryResponse
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, e.message!!)
+        }
+    } // Fun
+
+    /**
+     * 更新状态
+     */
+    fun updateState(id: String,computationalState: Long): Boolean{
+        return mapper.updateState(id,computationalState)
+    } // Fun
+
+} // Class GraphicTypeMapperService

+ 137 - 0
data-center/src/main/kotlin/com/persagy/server/services/graphtype/GraphicTypeService.kt

@@ -0,0 +1,137 @@
+package com.persagy.server.services.graphtype
+
+import com.persagy.server.datacenter.models.entities.graphtype.GraphicType
+import com.persagy.server.datacenter.models.entities.graphtype.RelationType
+import com.persagy.server.datacenter.models.entities.graphtype.RelationTypeProject
+import com.persagy.server.services.base.RService
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.SCascadeQuery
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.requests.SQueryRequest
+import com.sybotan.service.models.responses.SQueryResponse
+import org.slf4j.LoggerFactory
+import java.util.*
+
+/**
+ * 查询总览
+ *
+ * @author  邓婷婷
+ */
+object GraphicTypeService : RService<GraphicType>(SMybatisDao(GraphicType::class.java))  {
+    // 日志
+    private val logger = LoggerFactory.getLogger(GraphicTypeService::class.java)
+    /**  */
+    val service = SObjectService(RelationTypeProject::class.java)
+    /**
+     * 查询关系总览
+     */
+    fun overview(): SQueryResponse<GraphicType> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val request = SQueryRequest()
+            request.pageSize = 1000
+            request.orders = "sort"
+            request.filters = "parentId isnull"
+            request.cascade = ArrayList<SCascadeQuery>()
+
+            val childType = SCascadeQuery()
+            childType.name = "childGraphicTypeList"
+            childType.cascade = ArrayList<SCascadeQuery>()
+            childType.orders = "sort,GraphTypeCode"
+            request.cascade!!.add(childType)
+
+//            val relationType = SCascadeQuery()
+//            relationType.name = "relationTypeProjectList"
+//            relationType.filters = "projectId = '$projectId'"
+//            childType.cascade!!.add(relationType)
+
+            copyRelationType(projectId!!)
+
+            val pageQuery = GraphicTypeService.pageQuery(request)
+            if (!pageQuery.content.isNullOrEmpty()){
+                for ( content in pageQuery.content!!){
+                    if (!content.childGraphicTypeList.isNullOrEmpty()){
+                        val childGraphicTypeList = content.childGraphicTypeList
+                        for (childGraphicType in childGraphicTypeList!!){
+                            val relationTypeProjectList = service.select(SFilter.eq("projectId", projectId), SFilter.eq("graphicId", childGraphicType.graphTypeId!!)).order("RelationTypeCode").exec()
+                            if (relationTypeProjectList.size>0){
+                                childGraphicType.relationTypeProjectList = relationTypeProjectList
+                            }
+                        }
+                    }
+                }
+            }
+
+            pageQuery
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function overview()
+
+    /**
+     * 复制关系类型表
+     *
+     * @param   projectId       项目ID
+     */
+    private fun copyRelationType(projectId: String) {
+        val relationTypeProjectService = SObjectService(SMybatisDao(RelationTypeProject::class.java))
+        val relationTypeService = SObjectService(SMybatisDao(RelationType::class.java))
+        val n = relationTypeProjectService.select(SFilter.eq("projectId", projectId)).execCount()
+
+        if (n == 0L) {//需要录入数据
+            val requests = SQueryRequest()
+            val relationTypeList = relationTypeService.selectAll().exec()
+            logger.debug("數據長度= ${relationTypeList.size}")
+            for (relationType in relationTypeList) {
+                try {
+                    val relationTypeProject = RelationTypeProject()
+                    relationTypeProject.id = UUID.randomUUID().toString().replace("-", "")
+                    relationTypeProject.relationTypeName = relationType.relationTypeName
+                    relationTypeProject.relationTypeCode = relationType.relationTypeCode
+                    relationTypeProject.graphicId = relationType.graphicId
+                    relationTypeProject.note = relationType.note
+                    relationTypeProject.conneObject = relationType.conneObject
+                    relationTypeProject.isSource = relationType.isSource
+                    relationTypeProject.isAutomatic = relationType.isAutomatic
+                    relationTypeProject.manual = relationType.manual
+                    relationTypeProject.prompting = relationType.prompting
+                    relationTypeProject.tableName = relationType.tableName
+                    relationTypeProject.isThorough = relationType.isThorough
+                    relationTypeProject.relationType = relationType.relationType;
+                    relationTypeProject.zoneType = relationType.zoneType;
+                    relationTypeProject.projectId = projectId
+                    relationTypeProject.computationalState = 1
+                    relationTypeProject.manualQuery = relationType.manualQuery
+                    relationTypeProject.mainType = relationType.mainType
+                    relationTypeProject.fromType = relationType.fromType
+                    relationTypeProject.addRel = relationType.addRel
+                    relationTypeProject.delRel = relationType.delRel
+                    relationTypeProject.relManualType = relationType.relManualType
+                    relationTypeProject.mainObject = relationType.mainObject
+                    relationTypeProject.fromObject = relationType.fromObject
+                    relationTypeProject.mepSystemType = relationType.mepSystemType
+                    relationTypeProjectService.insert(relationTypeProject)
+
+
+//                    try {
+//                        val relationTypeProjectService = SObjectService(SMybatisDao(RelationTypeProject::class.java))
+//                        val relationType = relationTypeProjectService.select(SFilter.eq("projectId", projectId!!),SFilter.eq("RelationType", relationAddRequest.relType!!)).entity()
+//                        if (relationType!=null){
+//                            relationType.computingTime = time()
+//                            relationTypeProjectService.update(relationType)
+//                        }
+//                    } catch (e: Exception) {
+//                        e.printStackTrace()
+//                    }
+
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+            }
+        }
+    } // Function copyRelationType()
+} // Class GraphicTypeService

+ 392 - 0
data-center/src/main/kotlin/com/persagy/server/services/graphtype/RelationTypeProjectService.kt

@@ -0,0 +1,392 @@
+package com.persagy.server.services.graphtype
+
+import com.persagy.server.services.base.RService
+import cn.sagacloud.server.datacenter.utils.IdUtils
+import com.persagy.server.datacenter.models.entities.graphtype.RelationTypeProject
+import com.persagy.server.mappers.IRelationExcelExportMapper
+import com.persagy.server.mappers.IRelationExcelImportMapper
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.utils.SSpringContextUtil
+import org.apache.poi.xssf.usermodel.XSSFSheet
+import org.apache.poi.xssf.usermodel.XSSFWorkbook
+import org.slf4j.LoggerFactory
+import org.springframework.web.multipart.MultipartFile
+import java.io.File
+import javax.servlet.http.HttpServletResponse
+
+/**
+ * 查询总览
+ *
+ * @author  邓婷婷
+ */
+object RelationTypeProjectService : RService<RelationTypeProject>(SMybatisDao(RelationTypeProject::class.java))  {
+
+    // 日志
+    private val logger = LoggerFactory.getLogger(RelationTypeProjectService::class.java)
+
+    /** 导出excel对应的Mapper */
+    private val excelExport by lazy {
+        SSpringContextUtil.getBean(IRelationExcelExportMapper::class.java) as IRelationExcelExportMapper
+    }
+
+    /** 导入excel对应的Mapper */
+    private val excelImport by lazy {
+        SSpringContextUtil.getBean(IRelationExcelImportMapper::class.java) as IRelationExcelImportMapper
+    }
+
+    private val codeColMap by lazy {
+        val map = HashMap<String, String>()
+        map["对象ID"] = "id"
+        map["对象名称"] = "name"
+        map["对象本地编码"] = "local_id"
+        map["对象本地名称"] = "local_name"
+        map
+    }
+
+    private val codeTableMap by lazy {
+        val map = HashMap<String, String>()
+        map["bd"] = "building"
+        map["eq"] = "equipment"
+        map["fl"] = "floor"
+        map["pe"] = "property"
+        map["pj"] = "project"
+        map["sh"] = "shaft"
+        map["sp"] = "zone_space_base"
+        map["sy"] = "general_system"
+        map["tn"] = "tenant"
+        map
+    }
+
+    val itemList = arrayOf("_sbm", "abc", "name", "id", "local_id", "local_name", "object_type", "building_floor",
+            "_sbm", "_abc", "_name", "_id", "_local_id", "_local_name","_object_type", "_building_floor")
+
+    /** 关系记录启始行 */
+    private const val rowStart = 5
+    /** 主对项ID所在列 */
+    private const val id1Col = 3
+    /** 从对项ID所在列 */
+    private const val id2Col = 11
+
+    /** 主对项识别码所在列 */
+    private const val idCode1Col = 0
+    /** 从对项识别码所在列 */
+    private const val idCode2Col = 8
+
+    /** 导入状态所在列 */
+    private const val stateCol = 16
+
+    /**
+     * 下载模板
+     * @param   response        应答体
+     */
+    fun templateDownloads(response: HttpServletResponse) {
+        val workbook = XSSFWorkbook(RelationTypeProjectService::class.java.classLoader.getResourceAsStream("excel/relation-template.xlsx"))
+        response.contentType = "application/octet-stream"
+        response.setHeader("Content-disposition", "attachment;filename=relation-template.xlsx")
+        response.flushBuffer()
+        workbook.write(response.outputStream)
+    } // Function templateDownloads()
+
+    /**
+     * 下载报告
+     *
+     * @param   response        应答体
+     * @param   relType         关系类型
+     * @param   zoneType        业务空间类型
+     */
+    fun reportDownloads(response: HttpServletResponse, relType: String, zoneType: String? = null) {
+        val zone = if (zoneType != null) {
+            "_${zoneType}"
+        } else {
+            ""
+        }
+        val projectId = SPageContext.getHeader("ProjectId")
+        val file = File("/tmp/relation-$projectId-${relType}${zone}.xlsx")
+        val workbook = if (file.exists()) {
+            XSSFWorkbook(file)
+        } else {
+            XSSFWorkbook(RelationTypeProjectService::class.java.classLoader.getResourceAsStream("excel/relation-template.xlsx"))
+        }
+        response.contentType = "application/octet-stream"
+        response.setHeader("Content-disposition", "attachment;filename=report-${relType}${zone}.xlsx")
+        response.flushBuffer()
+        workbook.write(response.outputStream)
+    } // Function templateDownloads()
+
+    /**
+     * 导出excel
+     *
+     * @param   response        应答体
+     * @param   relType         关系类型
+     * @param   code            识别码类型
+     * @param   zoneType        业务空间类型
+     */
+    fun exportExcel(response: HttpServletResponse, projectId: String,relType: String, code: String = "对象ID", zoneType: String? = null) {
+        val workbook = XSSFWorkbook(RelationTypeProjectService::class.java.classLoader.getResourceAsStream("excel/relation-template.xlsx"))
+        response.contentType = "application/octet-stream"
+        response.setHeader("Content-disposition", "attachment;filename=relation-$relType.xlsx")
+        response.flushBuffer()
+
+        val sheet = workbook.getSheet("关系维护")
+
+//        val projectId = SPageContext.getHeader("ProjectId")
+
+        try {
+            writeExcelRelation(sheet, projectId!!, relType, code, zoneType)
+        }catch (e: Exception) {
+            // DO NOTHING
+        }
+
+        workbook.write(response.outputStream)
+    } // Function exportExcel()
+
+    /**
+     * 向excel表中写关系
+     *
+     * @param   sheet           Excel Sheet
+     * @param   projectId       项目ID
+     * @param   relType         关系类型
+     * @param   code            识别码类型
+     * @param   zoneType        业务空间类型
+     */
+    @Suppress("UNCHECKED_CAST")
+    private fun writeExcelRelation(sheet: XSSFSheet, projectId: String, relType: String, code: String, zoneType: String? = null) {
+        val len = relType.indexOf("_")
+        val cmd = if (len > 0) {
+            relType.substring(0, len)
+        } else {
+            relType
+        }
+        val type = relType
+//        val type = if (len > 0) {
+//            relType.substring(len + 1)
+//        } else {
+//            ""
+//        }
+
+        val list = if (relType == "eq2bd" || relType == "pe2bd") {
+            val exportMethod = excelExport.javaClass.getDeclaredMethod("${relType}In", String::class.java)
+            exportMethod!!.invoke(excelExport, projectId) as List<HashMap<String, Any?>>
+        } else if (relType == "eq2fl" || relType == "pe2fl") {
+            val exportMethod = excelExport.javaClass.getDeclaredMethod("${relType}In", String::class.java)
+            exportMethod!!.invoke(excelExport, projectId) as List<HashMap<String, Any?>>
+        } else {
+            if(zoneType.isNullOrEmpty()) {
+                val exportMethod = excelExport.javaClass.getDeclaredMethod(cmd, String::class.java, String::class.java)
+                exportMethod!!.invoke(excelExport, projectId, type) as List<HashMap<String, Any?>>
+            } else {
+                val exportMethod = excelExport.javaClass.getDeclaredMethod(cmd, String::class.java, String::class.java, String::class.java)
+                exportMethod!!.invoke(excelExport, projectId, type, zoneType) as List<HashMap<String, Any?>>
+            }
+        }
+
+        var rowNum = rowStart
+
+        // 填写识别码对应
+        sheet.getRow(2).getCell(1).setCellValue(code)
+
+        for (it in list) {
+            val row = sheet.createRow(rowNum)
+            for ((i, item) in itemList.withIndex()) {
+                val cellValue = it[item]
+                val cell = row.createCell(i)
+                if (cellValue != null) {
+                    cell.setCellValue(cellValue.toString())
+                }
+            }
+
+            // 添加识别码
+            row.createCell(0).setCellValue(row.getCell(id1Col).toString())
+            row.createCell(8).setCellValue(row.getCell(id2Col).toString())
+            rowNum++
+        }
+    } // Fun writeExcelRelation()
+
+    /**
+     * 导入excel
+     *
+     * @param   file            上传的Excel文件
+     * @param   relType         关系类型
+     * @param   zoneType        业务空间类型
+     * @return  应答体
+     */
+    fun importExcel(file: MultipartFile, relType: String, zoneType: String? = null): SBaseResponse {
+        try {
+            if (file.isEmpty) {
+                throw Exception("未选择文件")
+            }
+
+            val zone = if (zoneType != null) {
+                "_${zoneType}"
+            } else {
+                ""
+            }
+            val projectId = SPageContext.getHeader("ProjectId")
+            try {
+
+                val relationTypeProjectService = SObjectService(SMybatisDao(RelationTypeProject::class.java))
+                val relationType = relationTypeProjectService.select(SFilter.eq("projectId", projectId!!),SFilter.eq("RelationType", relType!!)).entity()
+                if (relationType!=null){
+                    relationType.computingTime = IdUtils.time()
+                    relationTypeProjectService.update(relationType)
+                }
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+
+            val workbook = XSSFWorkbook(file.inputStream)
+            val sheet = workbook.getSheet("关系维护")
+
+            // 填写识别码对应
+            val code = sheet.getRow(2).getCell(1).toString()
+
+            preExcelRelation(sheet, projectId!!, relType, code, zoneType)
+
+            readExcelRelation(sheet, projectId, relType, zoneType)
+
+            val outFile = File("/tmp/relation-$projectId-${relType}${zone}.xlsx")
+            workbook.write(outFile.outputStream())
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure, e.message!!)
+        }
+        return SBaseResponse(SResponseType.success)
+    } // Fun importExcel()
+    /**
+     * 预处理Excel数据
+     *
+     * @param   sheet           Excel Sheet
+     * @param   projectId       项目ID
+     * @param   relType         关系类型
+     * @param   code            识别码类型
+     * @param   zoneType        业务空间类型
+     */
+    private fun preExcelRelation(sheet: XSSFSheet, projectId: String, relType: String, code: String, zoneType: String? = null): Boolean {
+        var result = true
+        val rowNum = rowStart
+
+
+        for (i in rowNum .. sheet.lastRowNum) {
+            try {
+
+                val row = sheet.getRow(i)
+                if (row?.getCell(idCode1Col) == null ||row.getCell(idCode2Col) == null){
+                    continue
+                }
+                val idCode1ColValue = row.getCell(idCode1Col).toString()
+                val idCode2ColValue = row.getCell(idCode2Col).toString()
+                // 主对象识别码为空,则不能导入数据
+                if (idCode1ColValue.isEmpty() || idCode2ColValue.isEmpty()) {
+                    row.createCell(stateCol).setCellValue("失败,主对象or从对象的识别编码为空")
+                    // result = false
+                    continue
+                }
+
+                if (code.compareTo("对象ID", true) == 0) {
+                    row.createCell(id1Col).setCellValue(idCode1ColValue)
+                    row.createCell(id2Col).setCellValue(idCode2ColValue)
+                } else  {
+
+                    val id1List = excelImport.findObjectId(projectId, codeTableMap[relType.substring(0, 2)]!!, codeColMap[code]!!, idCode1ColValue)
+                    val id2List = excelImport.findObjectId(projectId, codeTableMap[relType.substring(3, 5)]!!, codeColMap[code]!!, idCode2ColValue)
+
+                    if (id1List.count() < 1) {
+                        row.createCell(stateCol).setCellValue("未找到主对象")
+                        continue
+                    }
+                    if (id1List.count() > 1) {
+                        row.createCell(stateCol).setCellValue("匹配到多个主对象")
+                        continue
+                    }
+                    if (id2List.count() < 1) {
+                        row.createCell(stateCol).setCellValue("未找到从对象")
+                        continue
+                    }
+                    if (id2List.count() > 1) {
+                        row.createCell(stateCol).setCellValue("匹配到多个从对象")
+                        continue
+                    }
+                    row.createCell(id1Col).setCellValue(id1List[0])
+                    row.createCell(id2Col).setCellValue(id2List[0])
+                }
+            } catch (e: Exception) {
+                e.printStackTrace()
+                // DO NOTHING
+            }
+        }
+
+        return result
+    } // Fun preExcelRelation()
+    /**
+     * 从Excel读取关系并存入数据库中
+     *
+     * @param   sheet           Excel Sheet
+     * @param   projectId       项目ID
+     * @param   relType         关系类型
+     * @param   zoneType        业务空间类型
+     */
+    private fun readExcelRelation(sheet: XSSFSheet, projectId: String, relType: String, zoneType: String? = null) {
+        try {
+            val len = relType.indexOf("_")
+            val cmd = if (len > 0) {
+                relType.substring(0, len)
+            } else {
+                relType
+            }
+//        val type = if (len > 0) {
+//            relType.substring(len + 1)
+//        } else {
+//            ""
+//        }
+
+            val type = relType
+
+            val importMethod = if (relType == "eq2bd" || relType == "pe2bd") {
+                excelImport.javaClass.getDeclaredMethod("${relType}In", String::class.java, String::class.java, String::class.java, String::class.java)
+            } else if (relType == "eq2fl" || relType == "pe2fl") {
+                excelImport.javaClass.getDeclaredMethod("${relType}In", String::class.java, String::class.java, String::class.java, String::class.java)
+            } else {
+                if(zoneType.isNullOrEmpty()) {
+                    excelImport.javaClass.getDeclaredMethod(cmd, String::class.java, String::class.java, String::class.java, String::class.java)
+                } else {
+                    excelImport.javaClass.getDeclaredMethod(cmd, String::class.java, String::class.java, String::class.java, String::class.java, String::class.java)
+                }
+            }
+
+            val rowNum = rowStart
+            for (i in rowNum .. sheet.lastRowNum) {
+                val row = sheet.getRow(i)
+                try {
+                if (row == null||row.getCell(id1Col) == null||row.getCell(id2Col) == null){
+                    sheet.getRow(0).createCell(stateCol).setCellValue("第$i 行数据为空")
+                    continue
+                }
+                val id1 = row.getCell(id1Col).toString()
+                val id2 = row.getCell(id2Col).toString()
+                // 任意一个ID为空,则不能导入数据
+                if (id1.isEmpty() || id2.isEmpty()) {
+                    return
+                }
+                    if(zoneType.isNullOrEmpty()) {
+                        importMethod.invoke(excelImport, projectId, type, id1, id2)
+                    } else {
+                        importMethod.invoke(excelImport, projectId, type, id1, id2, zoneType)
+                    }
+                    row.createCell(stateCol).setCellValue("关联成功")
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                    row.createCell(stateCol).setCellValue("关联失败")
+                }
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    } // Fun readExcelRelation()
+
+} // Class RelationTypeProjectService
+

+ 220 - 0
data-center/src/main/kotlin/com/persagy/server/services/objects/BuildingService.kt

@@ -0,0 +1,220 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.objects
+
+import cn.sagacloud.server.datacenter.utils.IdUtils
+import cn.sagacloud.server.datacenter.utils.ShaftNameUtil
+import com.persagy.server.datacenter.models.entities.objects.Building
+import com.persagy.server.services.assistant.ObjInfoService
+import com.persagy.server.services.base.Service
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SPageContext
+import java.util.*
+
+/**
+ * 建筑信息服务
+ *
+ * @author 张维新
+ */
+object BuildingService : Service<Building>(SMybatisDao(Building::class.java)) {
+
+    /**
+     * 创建对象前回调函数
+     *
+     * @param   building      创建前的回调函数
+     * @return  返回true,可以创建对象
+     */
+    override fun onCreateBefore(building: Building): Boolean  {
+        val projectId = SPageContext.getHeader("ProjectId")
+        building.projectId = projectId
+        if (!building.id.isNullOrEmpty()) {
+            val isWith = building.id!!.startsWith("Bd")
+            if (!isWith) {
+                building.id = IdUtils.buildIdCreate(projectId!!)
+            }
+        } else {
+            building.id = IdUtils.buildIdCreate(projectId!!)
+        }
+
+        if (building.name.isNullOrEmpty()){
+            val buildingName = ShaftNameUtil.shaftName("建筑-")
+            building.name = buildingName
+        }
+        return true
+    } // Function onCreateBefore()
+
+
+    /**
+     * 删除之前
+     */
+    override fun onDeleteBefore(entity: Building): Boolean {
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            entity.projectId = projectId
+
+            val exec = FloorService.select(SFilter.eq("buildId", entity.id!!)).exec()
+
+//            object : Thread() {
+//                override fun run() {
+//                    val  building = BuildingService.select(SFilter.eq("id", entity.id!!)).entity()
+//                    /** 日志 */
+//                    val dataCenterLogs = DataCenterLogs()
+//                    dataCenterLogs.id = IdUtils.uuidCreate()
+//                    dataCenterLogs.author = "dataCenter"
+//                    dataCenterLogs.projectId = projectId
+//                    dataCenterLogs.objectType = entity.objectType
+//                    dataCenterLogs.type = "delete"
+//                    dataCenterLogs.objectId = building!!.id
+//                    val hashMap = HashMap<String, Any?>()
+//                    hashMap[entity.objectType!!] = building
+//                    dataCenterLogs.dataSource = hashMap
+//                    logService.insert(dataCenterLogs)
+//                }
+//            }.start()
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return super.onDeleteBefore(entity)
+    } // Function onDeleteBefore()
+
+    /**
+     * @Description:创建之后
+     * @Param:
+     * @Return:
+     */
+    override fun onCreateSuccess(entityList: ArrayList<Building>) {
+        super.onCreateSuccess(entityList)
+        try {
+            for (building in entityList) {
+                ObjInfoService.createInfo(building,true,"Bd","Building")
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+//    /**
+//     * @Description: 创建或更新信息点
+//     * @Param: objType,projectId,objId,list,map,flag
+//     */
+//    fun createInfo(objType: String,projectId: String,objId: String,lastUpdate: Date?,list: ArrayList<HashMap<String,String?>>,map: HashMap<String,Any?>?,flag: Boolean){
+//        val SIMPLEDATEFORMAT_DC = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
+//        for (itemMap in list) {
+//            var objInfos = ObjInfos()
+//            objInfos.objType = objType
+//            objInfos.projectId = projectId
+//            objInfos.objId = objId
+//            objInfos.infoId = itemMap["infoPointCode"]
+//
+//            if(itemMap["secondTag"] !=null){
+//                val value = (map!![itemMap["secondTag"]] as HashMap<String,Any>)[itemMap["infoPointCode"]].toString()
+//                objInfos.value = value
+//            }else{
+//                val value = map!![itemMap["infoPointCode"]].toString()
+//                objInfos.value = value
+//            }
+//            val oService = SBaseService(SMybatisDao(ObjInfos::class.java))
+//            if(flag){
+//                objInfos.time = SIMPLEDATEFORMAT_DC.format(Date())
+//                oService.insert(objInfos)
+//            }else{
+//                objInfos.time = SIMPLEDATEFORMAT_DC.format(lastUpdate)
+//                oService.update(objInfos)
+//            }
+//
+//        }
+//    }
+//
+//    /**
+//     * @Description: 查找信息点选择创建或修改
+//     * @Param: entityList,flag
+//     */
+//    fun findInfo(entityList: ArrayList<Building>,flag: Boolean){
+//        val prodefs = PropertyDefProjectService.select(SFilter.eq("projectId",entityList.get(0).projectId!!),SFilter.eq("type","Building"), SFilter.or(SFilter.eq("inputMode","L"), SFilter.eq("inputMode","M"))).exec()
+//        var consList = ArrayList<HashMap<String,String?>>()
+//        var buildList = ArrayList<HashMap<String,String?>>()
+//        var peopleList = ArrayList<HashMap<String,String?>>()
+//        for (prodef in prodefs) {
+//            var itemMap = HashMap<String,String?>()
+//            itemMap["firstTag"] = prodef.firstTag
+//            itemMap["secondTag"] = prodef.secondTag
+//            itemMap["infoPointCode"] = prodef.infoPointCode
+//            when {
+//                prodef.firstTag.equals("ConsumptionInfo") -> {
+//                    consList.add(itemMap)
+//                }
+//                prodef.firstTag.equals("BuildingInfo") -> {
+//                    buildList.add(itemMap)
+//                }
+//                prodef.firstTag.equals("PeopleInfo") -> {
+//                    peopleList.add(itemMap)
+//                }
+//            }
+//        }
+//        for (building in entityList) {
+//            val lastUpdate = building.lastUpdate
+//            if(building.buildingInfo!=null){
+//                createInfo("Bd",building.projectId!!,building.id!!,lastUpdate,buildList,building.buildingInfo,flag)
+//            }
+//            if(building.consumptionInfo!=null){
+//                createInfo("Bd",building.projectId!!,building.id!!,lastUpdate,consList,building.consumptionInfo,flag)
+//            }
+//            if(building.peopleInfo!=null){
+//                createInfo("Bd",building.projectId!!,building.id!!,lastUpdate,peopleList,building.peopleInfo,flag)
+//            }
+//        }
+//    }
+
+    /**
+     * @Description: 更新之后
+     * @Param: entityList
+     */
+    override fun onUpdateSuccess(entityList: ArrayList<Building>) {
+        super.onUpdateSuccess(entityList)
+        try {
+            for (building in entityList) {
+                ObjInfoService.createInfo(building,false,"Bd","Building")
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+
+    /**
+     * @Description: 删除之后
+     * @Param: entityList
+     */
+    override fun onDeleteSuccess(entityList: ArrayList<Building>) {
+        super.onDeleteSuccess(entityList)
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (building in entityList) {
+                ObjInfoService.delete(SFilter.eq("projectId",projectId!!), SFilter.eq("objId",building.id!!), SFilter.eq("objType","Bd"))
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+
+} // Object BuildingService

+ 157 - 0
data-center/src/main/kotlin/com/persagy/server/services/objects/ComponentService.kt

@@ -0,0 +1,157 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.objects
+
+import cn.sagacloud.server.datacenter.utils.IdUtils
+import cn.sagacloud.server.datacenter.utils.ShaftNameUtil
+import com.persagy.server.datacenter.models.entities.logs.DataCenterLogs
+import com.persagy.server.datacenter.models.entities.objects.Equipment
+import com.persagy.server.services.assistant.ObjInfoService
+import com.persagy.server.services.base.Service
+import com.sybotan.database.SFilter
+import com.sybotan.database.SQueryBuilder
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SPageContext
+
+/**
+ * 部件信息服务
+ *
+ * @author 张维新
+ */
+object ComponentService : Service<Equipment>(SMybatisDao(Equipment::class.java)) {
+
+    /**
+     * 创建对象前回调函数
+     *
+     * @param   component      创建前的回调函数
+     */
+    override fun onCreateBefore(component: Equipment): Boolean  {
+        val projectId = SPageContext.getHeader("ProjectId")
+        component.projectId = projectId
+        if (!component.id.isNullOrEmpty()) {
+            val isStartsWith = component.id.toString().startsWith("Ec")
+            if (!isStartsWith) {
+                /** 部件id */
+                component.id = IdUtils.equipmentComponentIdCreate(projectId!!)
+            }
+        } else {
+            /** 部件id */
+            component.id = IdUtils.equipmentComponentIdCreate(projectId!!)
+        }
+        /** 项目id */
+        component.projectId = projectId
+        /** 部件名字 */
+        if (component.name.isNullOrEmpty()) {
+            component.name = ShaftNameUtil.shaftName("部件-")
+        }
+        component.objectType = "Component"
+        return true
+    } // Function onCreateBefore()
+
+    /**
+     * 查询之前的操作
+     *
+     * @param   queryBuilder    查询条件
+     */
+    override fun onQueryBefore(queryBuilder: SQueryBuilder<Equipment>) {
+        queryBuilder.tableName = "v_component"
+       return
+    } // Function onQueryBefore()
+
+    /**
+     * 查询统计之前操作
+     *
+     * @param   queryBuilder    查询条件
+     */
+    override fun onCountBefore(queryBuilder: SQueryBuilder<Equipment>) {
+        queryBuilder.tableName = "v_component"
+       return
+    } // Function onCountBefore()
+
+    override fun onDeleteBefore(cquipment: Equipment): Boolean {
+        try {
+            cquipment.objectType = "Component"
+            val  entity = this.select(SFilter.eq("id", cquipment.id!!)).entity()
+
+            val projectId = SPageContext.getHeader("ProjectId")
+            val coming = SPageContext.getHeader("Coming")
+            val account = SPageContext.getHeader("Account")
+            /** 日志 */
+            val dataCenterLogs = DataCenterLogs()
+            dataCenterLogs.id = IdUtils.uuidCreate()
+            dataCenterLogs.author = "dataCenter"
+            dataCenterLogs.projectId = projectId
+            dataCenterLogs.objectType = cquipment.objectType
+            dataCenterLogs.type = "delete"
+            dataCenterLogs.coming = coming
+            dataCenterLogs.account = account
+            dataCenterLogs.objectId = entity!!.id
+            val hashMap = HashMap<String, Any?>()
+            hashMap[cquipment.objectType!!] = entity
+            dataCenterLogs.dataSource = hashMap
+            logService.insert(dataCenterLogs)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return super.onDeleteBefore(cquipment)
+    }
+
+    override fun onUpdateBefore(entity: Equipment): Boolean {
+        entity.objectType = "Component"
+        return super.onUpdateBefore(entity)
+    }
+
+    /**
+     * @Description:添加成功之后
+     */
+    override fun onCreateSuccess(entityList: ArrayList<Equipment>) {
+        super.onCreateSuccess(entityList)
+        for (equipment in entityList) {
+            ObjInfoService.createInfo(equipment,true,"Ec",equipment.category!!)
+        }
+    }
+
+    /**
+     * @Description:更新成功后
+     */
+    override fun onUpdateSuccess(entityList: ArrayList<Equipment>) {
+        super.onUpdateSuccess(entityList)
+        for (equipment in entityList) {
+            ObjInfoService.createInfo(equipment,false,"Ec",equipment.category!!)
+        }
+    }
+
+    /**
+     * @Description:删除成功之后
+     */
+    override fun onDeleteSuccess(entityList: ArrayList<Equipment>) {
+        super.onDeleteSuccess(entityList)
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (entity in entityList) {
+                ObjInfoService.delete(SFilter.eq("projectId",projectId!!), SFilter.eq("objId",entity.id!!), SFilter.eq("objType","Ec"))
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+} // Object ComponentService

+ 494 - 0
data-center/src/main/kotlin/com/persagy/server/services/objects/EquipmentService.kt

@@ -0,0 +1,494 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.objects
+
+import cn.sagacloud.server.datacenter.utils.IdUtils
+import cn.sagacloud.server.datacenter.utils.ShaftNameUtil
+import cn.sagacloud.server.scanbuilding.UserLog
+import com.persagy.server.datacenter.models.entities.assistant.ObjInfos
+import com.persagy.server.datacenter.models.entities.graphtype.RelationTypeProject
+import com.persagy.server.datacenter.models.entities.logs.DataCenterLogs
+import com.persagy.server.datacenter.models.entities.objects.Equipment
+import com.persagy.server.datacenter.models.entities.objects.Property
+import com.persagy.server.services.assistant.ObjInfoService
+import com.persagy.server.services.base.Service
+import com.sybotan.base.extensions.toJson
+import com.sybotan.database.SFilter
+import com.sybotan.database.SQueryBuilder
+import com.sybotan.database.extensions.keyValue
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.requests.SUpdateRequest
+import com.sybotan.service.models.responses.SQueryResponse
+import org.json.JSONArray
+import org.json.JSONObject
+import org.slf4j.LoggerFactory
+
+/**
+ * 设备信息服务
+ *
+ * @author 张维新
+ */
+object EquipmentService : Service<Equipment>(SMybatisDao(Equipment::class.java)) {
+
+    private val logger = LoggerFactory.getLogger(EquipmentService::class.java)
+
+    /** 关系总览服务 */
+    val relationTypeProjectservice = SBaseService(SMybatisDao(RelationTypeProject::class.java))
+
+    /**
+     * 创建前赋值操作
+     *
+     * @param   equip   设备对象
+     */
+    override fun onCreateBefore(equip: Equipment): Boolean {
+        /** 查询准备类型 */
+        val projectId = SPageContext.getHeader("ProjectId")
+        if (!equip.id.isNullOrEmpty()) {
+            val isStartsWith = equip.id.toString().startsWith("Eq")
+            if (!isStartsWith) {
+                /** 资产id */
+                equip.id = IdUtils.equipmentIdCreate(projectId!!)
+            }
+        } else {
+            /** 资产id */
+            equip.id = IdUtils.equipmentIdCreate(projectId!!)
+        }
+        /** 项目id */
+        equip.projectId = projectId
+        /** 设备名字 */
+        if (equip.name.isNullOrEmpty()) {
+            equip.name = ShaftNameUtil.shaftName("设备-")
+        }
+
+        equip.codeType = 1
+        return true
+    } // Function onCreateBefore()
+
+    override fun onCountSuccess(count: Long) {
+        super.onCountSuccess(count)
+
+    }
+
+
+    /**
+     * 查询设备数量之前设置条件
+     *
+     * @param   queryBuilder    条件信息
+     */
+    override fun onCountBefore(queryBuilder: SQueryBuilder<Equipment>) {
+        queryBuilder.tableName = "v_equipment"
+        return
+    }  // Function onCreateBefore()
+
+    /**
+     * 查询设备之前添加条件方法
+     *
+     * @param   queryBuilder    条件信息
+     */
+    override fun onQueryBefore(queryBuilder: SQueryBuilder<Equipment>) {
+        queryBuilder.tableName = "v_equipment"
+        /** 调整数量 */
+//        SQueryRequest.maxRow
+//        val pr = PropertyService.select(SFilter.eq("id", "Pe20b75606191ea7ab530b314b0abaa176")).entity()
+//        val listp = ArrayList<Property>()
+//        pr!!.equipId = null
+//        listp.add(pr)
+//        val sUpdate= SUpdateRequest<Property>()
+//        sUpdate.content = listp
+//        sUpdate.projection = arrayListOf("EquipmentId")
+//        PropertyService.updateList(sUpdate)
+//        logger.debug("修改结束*********************************")
+////
+//        val list = arrayListOf("1180765",
+//                "1180762")
+//        this.select(SFilter.inList(SEndWithChar("bimId",":"),list) ).exec()
+
+        return
+    } // Function onCreateBefore()
+
+    /**
+     * 修改设备信息之前的操作
+     */
+    override fun onUpdateBefore(entity: Equipment): Boolean {
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            if (entity.propertyId.isNullOrEmpty()) {
+//                val property = PropertyService.select(SFilter.eq("equipmentId", entity.id!!)).entity()
+//                logger.debug("设备初次关联*********************************")
+//                if (property!=null){
+//                    property.equipId = null
+//                    val list = ArrayList<Property>()
+//                    list.add(property)
+//                    val sUpdateRequest = SUpdateRequest<Property>()
+//                    sUpdateRequest.content = list
+//                    sUpdateRequest.projection = arrayListOf("EquipmentId")
+//                    PropertyService.updateList(sUpdateRequest)
+//                }
+            } else {
+                val property = PropertyService.select(SFilter.eq("equipmentId", entity.id!!)).entity()
+                if (property != null) {
+
+                    logger.debug("已经有关联的信息*********************************")
+                    /** 设备关联的资产如果更改了先取消以前的,在关联新的 */
+                    if (entity.propertyId != property.id) {
+                        property.equipId = null
+                        property.bimId = null
+                        val list = ArrayList<Property>()
+                        list.add(property)
+                        val sUpdateRequest = SUpdateRequest<Property>()
+                        sUpdateRequest.content = list
+                        sUpdateRequest.projection = arrayListOf("EquipmentId", "BIMID")
+
+                        val updateList = PropertyService.updateList(sUpdateRequest)
+                        logger.debug("现在**${sUpdateRequest.toJson()}*******************************")
+                        logger.debug("现在**${updateList.toJson()}*******************************")
+
+                        val pr = PropertyService.select(SFilter.eq("id", entity.propertyId!!)).entity()
+                        val listp = ArrayList<Property>()
+                        pr!!.equipId = entity.id
+                        pr.bimId = entity.bimId
+                        listp.add(pr)
+                        val sUpdate = SUpdateRequest<Property>()
+                        sUpdate.content = listp
+                        sUpdate.projection = arrayListOf("EquipmentId", "BIMID")
+                        PropertyService.updateList(sUpdate)
+                        logger.debug("现在关联**${sUpdate.toJson()}*******************************")
+
+                        try {
+                            /** 处理关系标记 */
+                            val listtype = ArrayList<String>()
+                            listtype.add("pe2bd")
+                            listtype.add("pe2fl")
+                            listtype.add("pe2sh")
+                            listtype.add("pe2sp")
+                            for (type in listtype){
+                                val entity = relationTypeProjectservice.select(SFilter.eq("projectId", projectId!!), SFilter.eq("relationType", type)).entity()
+                                if (entity!=null){
+                                    entity.computationalState = 2
+                                    relationTypeProjectservice.update(entity)
+                                }
+                            }
+                        } catch (e: Exception) {
+                            e.printStackTrace()
+                        }
+                    }
+                } else {
+                    val prop = PropertyService.select(SFilter.eq("id", entity.propertyId!!)).entity()
+                    logger.debug("第一次关联***${prop!!.toJson()}******************************")
+                    if (prop != null) {
+                        prop.equipId = entity.id
+                        prop.lastUpdate = null
+                        prop.createTime = null
+                        prop.name = "1236"
+                        val listp = ArrayList<Property>()
+                        listp.add(prop)
+                        val sUpdate = SUpdateRequest<Property>()
+                        sUpdate.content = listp
+                        sUpdate.projection = arrayListOf("EquipmentId")
+                        val updateList = PropertyService.updateList(sUpdate)
+                        logger.debug("第一次更新信息***${sUpdate.toJson()}******************************")
+                        logger.debug("第一次更新***${updateList.toJson()}******************************")
+                        try {
+                            /** 处理关系标记 */
+                            val listtype = ArrayList<String>()
+                            listtype.add("pe2bd")
+                            listtype.add("pe2fl")
+                            listtype.add("pe2sh")
+                            listtype.add("pe2sp")
+                            for (type in listtype){
+                                val entity = relationTypeProjectservice.select(SFilter.eq("projectId", projectId!!), SFilter.eq("relationType", type)).entity()
+                                if (entity!=null){
+                                    entity.computationalState = 2
+                                    relationTypeProjectservice.update(entity)
+                                }
+                            }
+                        } catch (e: Exception) {
+                            e.printStackTrace()
+                        }
+                    }
+                }
+            }
+
+            try {
+                val projectId = SPageContext.getHeader("ProjectId")
+                val comming = SPageContext.getHeader("Coming")
+                val account = SPageContext.getHeader("Account")
+                /** 日志 */
+                val dataCenterLogs = DataCenterLogs()
+                dataCenterLogs.id = IdUtils.uuidCreate()
+                dataCenterLogs.author = "dataCenter"
+                dataCenterLogs.projectId = projectId
+                dataCenterLogs.objectType = entity.objectType
+                dataCenterLogs.type = "update-before"
+                dataCenterLogs.account = account
+                dataCenterLogs.coming = comming
+                dataCenterLogs.objectId = entity.keyValue("id").toString()
+                val hashMap = HashMap<String, Any?>()
+                hashMap[entity.objectType!!] = entity
+                dataCenterLogs.dataSource = hashMap
+                logService.insert(dataCenterLogs)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return true
+    } // Function onUpdateBefore()
+
+
+
+
+    /**
+     * 删除之前操作
+     */
+    override fun onDeleteBefore(entity: Equipment): Boolean {
+        try {
+            val equipment = this.select(SFilter.eq("id", entity.id!!)).entity()
+
+            val projectId = SPageContext.getHeader("ProjectId")
+            val coming = SPageContext.getHeader("Coming")
+            val account = SPageContext.getHeader("Account")
+            try {
+                /** 日志 */
+                val dataCenterLogs = DataCenterLogs()
+                dataCenterLogs.id = IdUtils.uuidCreate()
+                dataCenterLogs.author = "dataCenter"
+                dataCenterLogs.projectId = projectId
+                dataCenterLogs.objectType = entity.objectType
+                dataCenterLogs.type = "delete"
+                dataCenterLogs.account = account
+                dataCenterLogs.coming = coming
+                dataCenterLogs.objectId = equipment!!.id
+                val hashMap = HashMap<String, Any?>()
+                hashMap[entity.objectType!!] = equipment
+                dataCenterLogs.dataSource = hashMap
+                logService.insert(dataCenterLogs)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            /** 清除对应关系 */
+            if (equipment != null) {
+                val property = PropertyService.select(SFilter.eq("EquipmentId", equipment.id!!)).entity()
+                if (property != null && equipment.taskState != null && equipment.taskState == -1 && property.taskState != null && property.taskState == -1) {
+                    val list = ArrayList<Property>()
+                    list.add(property)
+                    PropertyService.deleteByKeysList(list)
+                } else {
+                    if (property != null) {
+                        property.equipId = null
+                        property.bimId = null
+                        val list = ArrayList<Property>()
+                        list.add(property)
+                        val sUpdateRequest = SUpdateRequest<Property>()
+                        sUpdateRequest.content = list
+                        val listStr = ArrayList<String>()
+                        listStr.add("EquipmentId")
+                        listStr.add("BIMID")
+                        sUpdateRequest.projection = listStr
+                        PropertyService.updateList(sUpdateRequest)
+                    }
+                }
+            }
+
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return super.onDeleteBefore(entity)
+    } // Function onDeleteBefore()
+
+    /**
+     * 查询项目下的设备和部件
+     */
+    fun queryEquipCom(): SQueryResponse<Equipment> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val equipList = select(SFilter.eq("projectId", projectId!!)).exec()
+            val sQueryResponse = SQueryResponse<Equipment>(SResponseType.success)
+            sQueryResponse.content = equipList
+            sQueryResponse
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure)
+        }
+    } // Function queryEquipCom()
+
+    override fun onCreateSuccess(entityList: ArrayList<Equipment>) {
+        entityList.forEach {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val comming = SPageContext.getHeader("Coming")
+            val account = SPageContext.getHeader("Account")
+
+            try {
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "1")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", it.keyValue("id"))
+                jsonObject.put("obj_type", it.objectType)
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+//                kafkaService.sendNotice("datacenter", ObjectNotice(projectId!!, it.objectType!!, "create", IdUtils.uuidCreate(), hashSetOf(it.keyValue("id").toString())), false)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            try {
+                val entity = EquipmentService.select(SFilter.eq("equipId", it.keyValue("id")!!)).entity()
+                if (entity != null) {
+                    /** 日志 */
+                    val dataCenterLogs = DataCenterLogs()
+                    dataCenterLogs.id = IdUtils.uuidCreate()
+                    dataCenterLogs.author = "dataCenter"
+                    dataCenterLogs.projectId = projectId
+                    dataCenterLogs.objectType = it.objectType
+                    dataCenterLogs.type = "create"
+                    dataCenterLogs.coming = comming
+                    dataCenterLogs.account = account
+                    dataCenterLogs.objectId = it.keyValue("id").toString()
+                    val hashMap = HashMap<String, Any?>()
+                    hashMap[it.objectType!!] = it
+                    dataCenterLogs.dataSource = hashMap
+                    logService.insert(dataCenterLogs)
+
+                    //添加信息点创建 表号功能号
+                    ObjInfoService.createInfo(entity,true,"Eq",entity.category!!)
+                }
+
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+        }
+    } //
+
+    /**
+     * 更新成功能回调函数
+     *
+     * @param   entityList      更新成功对象列表
+     */
+    override fun onUpdateSuccess(entityList: ArrayList<Equipment>) {
+        val projectId = SPageContext.getHeader("ProjectId")
+        val comming = SPageContext.getHeader("Coming")
+        val account = SPageContext.getHeader("Account")
+        try {
+            val jsonObject = JSONObject()
+            jsonObject.put("type", "7")
+            jsonObject.put("projectId", projectId)
+            jsonObject.put("obj_type", entityList[0].objectType)
+            val jsonArray = JSONArray()
+            for (entity in entityList) {
+                val jsonInfos = JSONObject()
+                jsonInfos.put("id", entity.keyValue("id"))
+                jsonInfos.put("obj_type", entity.objectType)
+                jsonArray.put(jsonInfos)
+                try {
+                    val equip = EquipmentService.select(SFilter.eq("equipId", entity.keyValue("id")!!)).entity()
+                    if (equip != null) {
+                        /** 日志 */
+                        val dataCenterLogs = DataCenterLogs()
+                        dataCenterLogs.id = IdUtils.uuidCreate()
+                        dataCenterLogs.author = "dataCenter"
+                        dataCenterLogs.projectId = projectId
+                        dataCenterLogs.objectType = entity.objectType
+                        dataCenterLogs.type = "update-after"
+                        dataCenterLogs.account = account
+                        dataCenterLogs.coming = comming
+                        dataCenterLogs.objectId = entity.keyValue("id").toString()
+                        val hashMap = HashMap<String, Any?>()
+                        hashMap[entity.objectType!!] = entity
+                        dataCenterLogs.dataSource = hashMap
+                        logService.insert(dataCenterLogs)
+
+                        //更新信息点 表号功能号
+                        ObjInfoService.createInfo(entity,false,"Eq",entity.category!!)
+                    }
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+                try {
+                    /** 发送消息 */
+//                    kafkaService.sendNotice("datacenter", ObjectNotice(projectId!!, entity.objectType!!, "update", IdUtils.uuidCreate(), hashSetOf(entity.keyValue("id").toString())), false)
+                } catch (e: Exception) {
+                    e.toString()
+                }
+
+            }
+            jsonObject.put("infos", jsonArray)
+            logger.debug("修改发送消息$jsonObject")
+            /** 发送消息 */
+            messageHandler.sendMessage(jsonObject.toString())
+
+
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+
+        try {
+            for (entity in entityList){
+                try {
+                    if (!comming.isNullOrEmpty()){
+                        if (comming == "app"){
+                            val user = LocationPointServices.userService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("phone", account!!)).entity()
+                            val userLog = UserLog()
+                            userLog.comming = "app"
+                            userLog.action = "更新设备"
+                            userLog.id = IdUtils.uuidCreate()
+                            userLog.note = "项目ID: "+projectId+" 用户ID:"+user!!.id+" 手机号:"+ account+" 请求来源:"+comming+ " "+entity.toJson()
+                            userLog.phone = account
+                            userLog.projectId = projectId
+                            userLog.userId = user!!.id
+                            userLog.name = user.name
+                            userLog.objectId = entity.id
+                            LocationPointServices.userLogService.insert(userLog)
+                        }
+                    }
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+
+    } // Function onUpdateSuccess()
+
+    /**
+     * @Description:删除成功之后
+     */
+    override fun onDeleteSuccess(entityList: ArrayList<Equipment>) {
+        super.onDeleteSuccess(entityList)
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val oService = SBaseService(SMybatisDao(ObjInfos::class.java))
+            for (entity in entityList) {
+                //更新信息点 表号功能号
+                oService.delete(SFilter.eq("projectId",projectId!!), SFilter.eq("objId",entity.id!!), SFilter.eq("objType","Eq"))
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+
+
+
+} // Object EquipmentService

+ 476 - 0
data-center/src/main/kotlin/com/persagy/server/services/objects/FloorService.kt

@@ -0,0 +1,476 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.objects
+
+import cn.sagacloud.server.datacenter.utils.IdUtils
+import cn.sagacloud.server.datacenter.utils.ShaftNameUtil
+import com.persagy.server.datacenter.models.entities.logs.DataCenterLogs
+import com.persagy.server.datacenter.models.entities.objects.Floor
+import com.persagy.server.services.assistant.ObjInfoService
+import com.persagy.server.services.base.Service
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.requests.SUpdateRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import org.json.JSONArray
+import org.json.JSONObject
+
+/**
+ * 楼层信息服务
+ *
+ * @author 张维新
+ */
+object FloorService : Service<Floor>(SMybatisDao(Floor::class.java)) {
+
+    /**
+     * 创建之前操作
+     */
+    override fun onCreateBefore(floor: Floor): Boolean  {
+        val projectId = SPageContext.getHeader("ProjectId")
+        floor.projectId = projectId
+        /** 楼层id */
+        if (!floor.id.isNullOrEmpty()) {
+            val isWith = floor.id!!.startsWith("Fl")
+            if (!isWith) {
+                floor.id = IdUtils.floorIdCreate(projectId!!)
+            }
+        } else {
+            floor.id = IdUtils.floorIdCreate(projectId!!)
+        }
+
+        if (floor.name.isNullOrEmpty()){
+            floor.name = ShaftNameUtil.shaftName("楼层-")
+        }
+        if (!floor.buildId.isNullOrEmpty()){
+            val floorList = select(SFilter.eq("projectId", projectId!!), SFilter.eq("buildId", floor.buildId!!)).exec()
+            if (floorList.size>0){
+                for (floor001 in floorList){
+                    if (floor001.sequenceId == floor.sequenceId){
+                        return false
+                    }
+                }
+            }
+        }
+        return true
+    } // Function onCreateBefore()
+
+  fun create(request: SCreateRequest<Floor>): SCreateResponse<Floor> {
+      return try {
+          val projectId = SPageContext.getHeader("ProjectId")
+          val comming = SPageContext.getHeader("Coming")
+          val account = SPageContext.getHeader("Account")
+          if (!request.content.isNullOrEmpty()){
+              for (floor in request.content){
+                  try {
+                      floor.projectId = projectId
+                      /** 楼层id */
+                      if (!floor.id.isNullOrEmpty()) {
+                          val isWith = floor.id!!.startsWith("Fl")
+                          if (!isWith) {
+                              floor.id = IdUtils.floorIdCreate(projectId!!)
+                          }
+                      } else {
+                          floor.id = IdUtils.floorIdCreate(projectId!!)
+                      }
+
+                      if (floor.name.isNullOrEmpty()){
+                          floor.name = ShaftNameUtil.shaftName("楼层-")
+                      }
+                      if (!floor.buildId.isNullOrEmpty()){
+                          val floorList = select(SFilter.eq("projectId", projectId!!), SFilter.eq("buildId", floor.buildId!!)).exec()
+                          if (floorList.size>0){
+                              for (floor001 in floorList){
+                                  if (floor001.sequenceId == floor.sequenceId){
+                                      val sCreateResponse = SCreateResponse<Floor>(SResponseType.failure)
+                                      sCreateResponse.message = "楼层顺序号不可以重复"
+                                      return sCreateResponse
+                                  }
+                              }
+                          }
+                      }
+                      val insert = insert(floor)
+                      if (insert){
+                          try {
+                              val jsonObject = JSONObject()
+                              jsonObject.put("type", "1")
+                              jsonObject.put("projectId", projectId)
+                              jsonObject.put("id", floor.id)
+                              jsonObject.put("obj_type", "Floor")
+                              /** 发送消息 */
+                              messageHandler.sendMessage(jsonObject.toString())
+    //                kafkaService.sendNotice("datacenter", ObjectNotice(projectId!!, it.objectType!!, "create",IdUtils.uuidCreate(), hashSetOf(it.keyValue("id").toString())),false)
+
+                          } catch (e: Exception) {
+                              e.printStackTrace()
+                          }
+                          try {
+                              /** 日志 */
+                              val dataCenterLogs = DataCenterLogs()
+                              dataCenterLogs.id = IdUtils.uuidCreate()
+                              dataCenterLogs.author = "dataCenter"
+                              dataCenterLogs.projectId = projectId
+                              dataCenterLogs.objectType = "Floor"
+                              dataCenterLogs.type = "create"
+                              dataCenterLogs.coming = comming
+                              dataCenterLogs.account = account
+                              dataCenterLogs.objectId = floor.id
+                              val hashMap = HashMap<String, Any?>()
+                              hashMap["Floor"] = floor
+                              dataCenterLogs.dataSource = hashMap
+                              logService.insert(dataCenterLogs)
+                          } catch (e: Exception) {
+                              e.printStackTrace()
+                          }
+                      }
+                  } catch (e: Exception) {
+                      e.printStackTrace()
+                  }
+              }
+              val sCreateResponse = SCreateResponse<Floor>(SResponseType.success)
+              sCreateResponse.entityList = request.content
+              return sCreateResponse
+
+          }else{
+              val sCreateResponse = SCreateResponse<Floor>(SResponseType.failure)
+              sCreateResponse.message = "不可以传入空列表"
+              return sCreateResponse
+          }
+      } catch (e: Exception) {
+          e.printStackTrace()
+          SCreateResponse(SResponseType.failure,e.message.toString())
+      }
+  } // Fun
+
+    fun upDates(request: SUpdateRequest<Floor>): SBaseResponse{
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val comming = SPageContext.getHeader("Coming")
+            val account = SPageContext.getHeader("Account")
+            val listId = ArrayList<String>()
+            if (!request.content.isNullOrEmpty()){
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "7")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("obj_type", "Floor")
+                val jsonArray = JSONArray()
+                for (floor in request.content!!){
+                    if (!floor.buildId.isNullOrEmpty()){
+
+                        val floorList = select(SFilter.eq("projectId", projectId!!), SFilter.eq("buildId", floor.buildId!!), SFilter.not(SFilter.eq("id",floor.id!!))).exec()
+                        if (floorList.size>0){
+                            for (floor001 in floorList){
+                                try {
+                                    if (floor001.sequenceId == floor.sequenceId){
+                                        if (listId.size>0){
+                                            for (id in listId){
+                                                val jsonInfos = JSONObject()
+                                                jsonInfos.put("id", id)
+                                                jsonInfos.put("obj_type", "Floor")
+                                                jsonArray.put(jsonInfos)
+                                            }
+                                            jsonObject.put("infos", jsonArray)
+                                            /** 发送消息 */
+                                            messageHandler.sendMessage(jsonObject.toString())
+                                        }
+                                        val sBaseResponse = SBaseResponse(SResponseType.failure)
+                                        sBaseResponse.message = "楼层顺序号不可以重复"
+                                        return sBaseResponse
+                                    }
+                                } catch (e: Exception) {
+                                    e.printStackTrace()
+                                }
+                            }
+                        }
+                    }
+                    try {
+                        if (!request.projection.isNullOrEmpty()&&request.projection!!.size>0){
+
+                            val update = update(floor, request.projection)
+                            if (update){
+                                listId.add(floor.id!!)
+                                try {
+                                    /** 日志 */
+                                    val dataCenterLogs = DataCenterLogs()
+                                    dataCenterLogs.id = IdUtils.uuidCreate()
+                                    dataCenterLogs.author = "dataCenter"
+                                    dataCenterLogs.projectId = projectId
+                                    dataCenterLogs.objectType = "Floor"
+                                    dataCenterLogs.type = "update-after"
+                                    dataCenterLogs.account = account
+                                    dataCenterLogs.coming = comming
+                                    dataCenterLogs.objectId = floor.id
+                                    val hashMap = HashMap<String, Any?>()
+                                    hashMap["Floor"] = floor
+                                    dataCenterLogs.dataSource = hashMap
+                                    logService.insert(dataCenterLogs)
+                                } catch (e: Exception) {
+                                    e.printStackTrace()
+                                }
+                            }
+                        }else{
+                            val update = update(floor)
+                            if (update){
+                                listId.add(floor.id!!)
+                                try {
+                                    /** 日志 */
+                                    val dataCenterLogs = DataCenterLogs()
+                                    dataCenterLogs.id = IdUtils.uuidCreate()
+                                    dataCenterLogs.author = "dataCenter"
+                                    dataCenterLogs.projectId = projectId
+                                    dataCenterLogs.objectType = "Floor"
+                                    dataCenterLogs.type = "update-after"
+                                    dataCenterLogs.account = account
+                                    dataCenterLogs.coming = comming
+                                    dataCenterLogs.objectId = floor.id
+                                    val hashMap = HashMap<String, Any?>()
+                                    hashMap["Floor"] = floor
+                                    dataCenterLogs.dataSource = hashMap
+                                    logService.insert(dataCenterLogs)
+                                } catch (e: Exception) {
+                                    e.printStackTrace()
+                                }
+                            }
+                        }
+                    } catch (e: Exception) {
+                        e.printStackTrace()
+                    }
+                }
+
+                if (listId.size>0){
+                    for (id in listId){
+                        val jsonInfos = JSONObject()
+                        jsonInfos.put("id", id)
+                        jsonInfos.put("obj_type", "Floor")
+                        jsonArray.put(jsonInfos)
+                    }
+                    jsonObject.put("infos", jsonArray)
+                    /** 发送消息 */
+                    messageHandler.sendMessage(jsonObject.toString())
+                }
+                val sBaseResponse = SBaseResponse(SResponseType.success)
+                return sBaseResponse
+            }else{
+                val sBaseResponse = SBaseResponse(SResponseType.failure)
+                return sBaseResponse
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SBaseResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Fun
+
+
+
+
+    /**
+     * 删除之前操作
+     */
+    override fun onDeleteBefore(entity: Floor): Boolean {
+        val  floor = this.select(SFilter.eq("id", entity.id!!)).entity()
+
+        val projectId = SPageContext.getHeader("ProjectId")
+        val coming = SPageContext.getHeader("Coming")
+        val account = SPageContext.getHeader("Account")
+        /** 日志 */
+        val dataCenterLogs = DataCenterLogs()
+        dataCenterLogs.id = IdUtils.uuidCreate()
+        dataCenterLogs.author = "dataCenter"
+        dataCenterLogs.projectId = projectId
+        dataCenterLogs.objectType = entity.objectType
+        dataCenterLogs.type = "delete"
+        dataCenterLogs.coming = coming
+        dataCenterLogs.account = account
+        dataCenterLogs.objectId = floor!!.id
+        val hashMap = HashMap<String, Any?>()
+        hashMap[entity.objectType!!] = floor
+        dataCenterLogs.dataSource = hashMap
+        logService.insert(dataCenterLogs)
+        return super.onDeleteBefore(entity)
+    } // Function onDeleteBefore()
+
+    /**
+     * 更新楼层 Outline
+     */
+    fun updateOutline(request: SUpdateRequest<Floor>): SBaseResponse{
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val comming = SPageContext.getHeader("Coming")
+            val account = SPageContext.getHeader("Account")
+            val listId = ArrayList<String>()
+            if (!request.content.isNullOrEmpty()){
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "7")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("obj_type", "Floor")
+                val jsonArray = JSONArray()
+                for (floor in request.content!!){
+                    try {
+                        val listOutline = ArrayList<String>()
+                        listOutline.add("Outline")
+                            val update = update(floor,listOutline)
+                            if (update){
+                                listId.add(floor.id!!)
+                                try {
+                                    /** 日志 */
+                                    val dataCenterLogs = DataCenterLogs()
+                                    dataCenterLogs.id = IdUtils.uuidCreate()
+                                    dataCenterLogs.author = "dataCenter"
+                                    dataCenterLogs.projectId = projectId
+                                    dataCenterLogs.objectType = "Floor"
+                                    dataCenterLogs.type = "update-after"
+                                    dataCenterLogs.account = account
+                                    dataCenterLogs.coming = comming
+                                    dataCenterLogs.objectId = floor.id
+                                    val hashMap = HashMap<String, Any?>()
+                                    hashMap["Floor"] = floor
+                                    dataCenterLogs.dataSource = hashMap
+                                    logService.insert(dataCenterLogs)
+                                } catch (e: Exception) {
+                                    e.printStackTrace()
+                                }
+                            }
+
+                    } catch (e: Exception) {
+                        e.printStackTrace()
+                    }
+                }
+
+                if (listId.size>0){
+                    for (id in listId){
+                        val jsonInfos = JSONObject()
+                        jsonInfos.put("id", id)
+                        jsonInfos.put("obj_type", "Floor")
+                        jsonArray.put(jsonInfos)
+                    }
+                    jsonObject.put("infos", jsonArray)
+                    /** 发送消息 */
+                    messageHandler.sendMessage(jsonObject.toString())
+
+                    try {
+                        /** 处理关系标记 */
+                        val listtype = ArrayList<String>()
+                        listtype.add("sh2bd")
+                        listtype.add("bd2sp")
+                        listtype.add("fl2sp")
+                        listtype.add("syeq2bd")
+                        listtype.add("sy2fl")
+                        listtype.add("eq2fl")
+                        listtype.add("pe2bd")
+                        listtype.add("pe2fl")
+                        for (type in listtype){
+                            val entity = EquipmentService.relationTypeProjectservice.select(SFilter.eq("projectId", projectId!!), SFilter.eq("relationType", type)).entity()
+                            if (entity!=null){
+                                entity.computationalState = 2
+                                EquipmentService.relationTypeProjectservice.update(entity)
+                            }
+                        }
+                    } catch (e: Exception) {
+                        e.printStackTrace()
+                    }
+                }
+                val sBaseResponse = SBaseResponse(SResponseType.success)
+                return sBaseResponse
+            }else{
+                val sBaseResponse = SBaseResponse(SResponseType.failure)
+                return sBaseResponse
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SBaseResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Fun
+
+    /**
+     * @Description: 删除之后
+     * @Param: entityList
+     */
+    override fun onDeleteSuccess(entityList: ArrayList<Floor>) {
+        super.onDeleteSuccess(entityList)
+
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (floor in entityList) {
+                ObjInfoService.delete(SFilter.eq("projectId",projectId!!), SFilter.eq("objId",floor.id!!), SFilter.eq("objType","Fl"))
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+//    /**
+//     * @Description: 查找信息点选择创建或修改
+//     * @Param: entityList,flag
+//     */
+//    fun findInfo(entityList: ArrayList<Floor>, flag: Boolean){
+//        val prodefs = PropertyDefProjectService.select(SFilter.eq("projectId",entityList.get(0).projectId!!),SFilter.eq("firstTag","PeopleInfo"),SFilter.eq("type","Floor"), SFilter.or(SFilter.eq("inputMode","L"), SFilter.eq("inputMode","M"))).exec()
+//        var peopleList = ArrayList<HashMap<String,String?>>()
+//        for (prodef in prodefs) {
+//            var itemMap = HashMap<String,String?>()
+//            itemMap["firstTag"] = prodef.firstTag
+//            itemMap["secondTag"] = prodef.secondTag
+//            itemMap["infoPointCode"] = prodef.infoPointCode
+//            peopleList.add(itemMap)
+//        }
+//        for (floor in entityList) {
+//            if(floor.peopleInfo!=null){
+//                BuildingService.createInfo("Fl",floor.projectId!!,floor.id!!,floor.lastUpdate,peopleList,floor.peopleInfo,flag)
+//            }
+//        }
+//    }
+
+    /**
+     * @Description:创建成功后
+     * @Param:entityList
+     */
+    override fun onCreateSuccess(entityList: ArrayList<Floor>) {
+        super.onCreateSuccess(entityList)
+        try {
+            for (floor in entityList) {
+                ObjInfoService.createInfo(floor,true,"Fl","Floor")
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+    /**
+     * @Description:更新成功后
+     * @Param:entityList
+     */
+    override fun onUpdateSuccess(entityList: ArrayList<Floor>) {
+        super.onUpdateSuccess(entityList)
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (floor in entityList) {
+                ObjInfoService.createInfo(floor,false,"Fl","Floor")
+//                ObjInfoService.delete(SFilter.eq("projectId",projectId!!), SFilter.eq("objId",floor.id!!), SFilter.eq("objType","Fl"))
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+
+} // Object FloorService

+ 497 - 0
data-center/src/main/kotlin/com/persagy/server/services/objects/GeneralSystemService.kt

@@ -0,0 +1,497 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.objects
+
+import cn.sagacloud.server.datacenter.utils.IdUtils
+import cn.sagacloud.server.datacenter.utils.ShaftNameUtil
+import com.persagy.server.datacenter.models.entities.assistant.BuildingFloorInfo
+import com.persagy.server.datacenter.models.entities.dict.DClassDef
+import com.persagy.server.datacenter.models.entities.logs.DataCenterLogs
+import com.persagy.server.datacenter.models.entities.objects.Equipment
+import com.persagy.server.datacenter.models.entities.objects.GeneralSystem
+import com.persagy.server.datacenter.models.entities.objects.Shaft
+import com.persagy.server.datacenter.models.entities.objects.ZoneSpace
+import com.persagy.server.datacenter.models.entities.rel.RSyEq
+import com.persagy.server.datacenter.models.entities.rel.RSyEqList
+import com.persagy.server.datacenter.models.entities.rel.RSyInBd
+import com.persagy.server.datacenter.models.entities.rel.RSyInFl
+import com.persagy.server.services.assistant.ObjInfoService
+import com.persagy.server.services.base.Service
+import com.persagy.server.services.rel.RSyInBdService
+import com.persagy.server.services.rel.RSyInFlService
+import com.sybotan.base.extensions.toJson
+import com.sybotan.database.SFilter
+import com.sybotan.database.SQueryBuilder
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.requests.SQueryRequest
+import com.sybotan.service.models.responses.SCreateResponse
+import com.sybotan.service.models.responses.SQueryResponse
+import org.json.JSONObject
+
+/**
+ * 系统信息服务
+ *
+ * @author 张维新
+ */
+object GeneralSystemService : Service<GeneralSystem>(SMybatisDao(GeneralSystem::class.java)) {
+
+
+    /** 对象查询 */
+    val defService = SBaseService(SMybatisDao(DClassDef::class.java))
+
+    /**
+     * 创建之前的操作
+     */
+    override fun onCreateBefore(generalSystem: GeneralSystem): Boolean {
+        val projectId = SPageContext.getHeader("ProjectId")
+
+        return true
+    } // Function onCreateBefore()
+
+
+    /**
+     * 创建系统
+     */
+    fun createBdFl(request: SCreateRequest<GeneralSystem>): SCreateResponse<GeneralSystem>{
+        val projectId = SPageContext.getHeader("ProjectId")
+
+        val contentList = request.content
+        if (contentList.isNotEmpty()){
+
+            for (generalSystem in contentList){
+
+                try {
+                    if (generalSystem.id.isNullOrEmpty()) {
+                        generalSystem.id = IdUtils.systemIdCreate(projectId!!)
+                    } else {
+                        val startsWith = generalSystem.id!!.startsWith("Sy")
+                        if (!startsWith) {
+                            generalSystem.id = IdUtils.systemIdCreate(projectId!!)
+                        }
+                    }
+                    generalSystem.projectId = projectId
+                    if (generalSystem.name.isNullOrEmpty()) {
+                        /** TODO:待修改 */
+                        val dClassDef = defService.select(SFilter.eq("id", generalSystem.category!!)).entity()
+                        if (dClassDef!=null){
+                            generalSystem.name = ShaftNameUtil.shaftName(dClassDef.name+"系统-")
+                        }else{
+                            generalSystem.name = ShaftNameUtil.shaftName("系统-")
+                        }
+                    }
+
+                    val insert = insert(generalSystem)
+                    if (insert){
+                        /** 处理建筑楼层 */
+                        val buildingFloorInfoList = generalSystem.buildingFloorInfoList
+                        if (!buildingFloorInfoList.isNullOrEmpty()){
+
+                            for (buildingFloorInfo in buildingFloorInfoList){
+                                try {
+                                    if (!buildingFloorInfo.buildID.isNullOrEmpty()){
+                                        /** 建筑  */
+                                        val rSyInBd = RSyInBd()
+                                        rSyInBd.buildingId = buildingFloorInfo.buildID
+                                        rSyInBd.projectId = projectId
+                                        rSyInBd.sysId = generalSystem.id
+                                        rSyInBd.sign = 1
+                                        RSyInBdService.replace(rSyInBd)
+                                    }
+                                    if (!buildingFloorInfo.floorID.isNullOrEmpty()){
+
+                                        val rSyInFl = RSyInFl()
+                                        rSyInFl.buildingId = buildingFloorInfo.buildID
+                                        rSyInFl.floorId = buildingFloorInfo.floorID
+                                        rSyInFl.sysId = generalSystem.id
+                                        rSyInFl.sign = 1
+                                        rSyInFl.projectId = projectId
+                                        /** 楼层 */
+                                        RSyInFlService.replace(rSyInFl)
+                                    }
+                                } catch (e: Exception) {
+                                    e.printStackTrace()
+                                }
+                            }
+                        }
+                        try {
+                            val jsonObject = JSONObject()
+                            jsonObject.put("type", "1")
+                            jsonObject.put("projectId", projectId)
+                            jsonObject.put("id", generalSystem.id)
+                            /** 发送消息 */
+                            messageHandler.sendMessage(jsonObject.toString())
+                        } catch (e: Exception) {
+                            e.printStackTrace()
+                        }
+                    }
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+            }
+            return  SCreateResponse(SResponseType.success)
+        }else{
+            return  SCreateResponse(SResponseType.failure)
+        }
+    } // Function createBdFl()
+
+    /**
+     * 查询之前的操作
+     */
+    override fun onQueryBefore(queryBuilder: SQueryBuilder<GeneralSystem>) {
+        queryBuilder.tableName = "v_general_system"
+        return
+    } // Function onQueryBefore()
+
+    /**
+     * 查询统计之前操作
+     */
+    override fun onCountBefore(queryBuilder: SQueryBuilder<GeneralSystem>) {
+        queryBuilder.tableName = "general_system"
+    } // Function onCountBefore()
+
+    /**
+     * 删除之前操作
+     */
+    override fun onDeleteBefore(entity: GeneralSystem): Boolean {
+        try {
+            val generalSystem = this.select(SFilter.eq("id", entity.id!!)).entity()
+            val projectId = SPageContext.getHeader("ProjectId")
+            val coming = SPageContext.getHeader("Coming")
+            val account = SPageContext.getHeader("Account")
+            /** 日志 */
+            val dataCenterLogs = DataCenterLogs()
+            dataCenterLogs.id = IdUtils.uuidCreate()
+            dataCenterLogs.author = "dataCenter"
+            dataCenterLogs.projectId = projectId
+            dataCenterLogs.objectType = entity.objectType
+            dataCenterLogs.type = "delete"
+            dataCenterLogs.coming = coming
+            dataCenterLogs.account = account
+            dataCenterLogs.objectId = generalSystem!!.id
+            val hashMap = HashMap<String, Any?>()
+            hashMap[entity.objectType!!] = generalSystem
+            dataCenterLogs.dataSource = hashMap
+            logService.insert(dataCenterLogs)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return super.onDeleteBefore(entity)
+    } // Function  onDeleteBefore
+
+
+    /**
+     * 查询没有和当前空间绑定的系统
+     *
+     * @param   type        空间类型
+     * @param   spaceId     空间id
+     */
+    fun unSpaceSys(type: String, spaceId: String, request: SQueryRequest): SQueryResponse<GeneralSystem> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val queryBuilder = select(request.filters)
+            queryBuilder.tableName="f_unsys_in_space('$projectId','$type','$spaceId')"
+            if (null != request.projection) {
+                queryBuilder.projection(request.projection!!)
+            }
+            if (null != request.orders) {
+                queryBuilder.order(request.orders!!)
+            }
+            val pageInfo = queryBuilder.pageQuery(request.pageNumber, request.pageSize)
+
+            SQueryResponse(pageInfo)
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, e.message!!)
+        }
+
+    } // Function  unSpaceSys
+
+//    /**
+//     * 查询没有和当前系统关联的设备
+//     *
+//     * @param   sysId        系统id
+//     */
+//    fun unSysEquip(sysId: String, request: SQueryRequest): SQueryResponse<Equipment>{
+//        return  try {
+//            val projectId = SPageContext.getHeader("ProjectId")
+//             val equipmentService = SObjectService(SMybatisDao(Equipment::class.java))
+//            val queryBuilder = equipmentService.select(request.filters)
+//            queryBuilder.tableName="f_uneq_in_sy_equip('$projectId','$sysId')"
+//            if (null != request.projection) {
+//                queryBuilder.projection(request.projection!!)
+//            }
+//            if (null != request.orders) {
+//                queryBuilder.order(request.orders!!)
+//            }
+//
+//            val pageInfo = queryBuilder.pageQuery(request.pageNumber, request.pageSize)
+//
+//            SQueryResponse(pageInfo)
+//        } catch (e: Exception) {
+//            e.printStackTrace()
+//            SQueryResponse(SResponseType.failure, "")
+//        }
+//    } // Fun UnSysEquip
+
+    /**
+     * 查询没有和当前系统关联的设备
+     *
+     * @param   sysId        系统id
+     */
+    fun unSysEquip(sysId: String, request: SQueryRequest): SQueryResponse<Equipment>{
+        return  try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val equipmentService = SObjectService(SMybatisDao(Equipment::class.java))
+            val rSyEqService = SObjectService(SMybatisDao(RSyEq::class.java))
+            val rSyEqList = rSyEqService.select(SFilter.eq("sysId", sysId), SFilter.eq("projectId", projectId!!)).exec()
+
+            val list = ArrayList<String>()
+            val listf = ArrayList<SFilter>()
+            for (rSyEq in rSyEqList){
+                list.add(rSyEq.equipId!!)
+            }
+
+            if (list.size>0){
+                listf.add(SFilter.eq("projectId", projectId!!))
+                listf.add(SFilter.not(SFilter.inList("id", list)))
+            }else{
+                listf.add(SFilter.eq("projectId", projectId!!))
+            }
+
+            equipmentService.pageQuery(request,listf)
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, "")
+        }
+    } // Fun UnSysEquip
+
+    /**
+     * 查询没有和当前系统关联的竖井
+     *
+     * @param   sysId        系统id
+     */
+    fun unSysShaft(sysId: String, request: SQueryRequest): SQueryResponse<Shaft>{
+        return  try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val shaftservice = SObjectService(SMybatisDao(Shaft::class.java))
+            val queryBuilder = shaftservice.select(request.filters)
+            queryBuilder.tableName="f_uneq_in_sy_shaft('$projectId','$sysId')"
+            if (null != request.projection) {
+                queryBuilder.projection(request.projection!!)
+            }
+            if (null != request.orders) {
+                queryBuilder.order(request.orders!!)
+            }
+            val pageInfo = queryBuilder.pageQuery(request.pageNumber, request.pageSize)
+
+            SQueryResponse(pageInfo)
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, "")
+        }
+    } // Fun unSysShaft
+
+    /**
+     * 查询没有和当前系统关联的空间
+     *
+     * @param   sysId        系统id
+     */
+    fun unSysZoneSpaceBaseTable(sysId: String, request: SQueryRequest): SQueryResponse<ZoneSpace>{
+        return  try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val zoneSpaceBaseTableservice = SObjectService(SMybatisDao(ZoneSpace::class.java))
+            val queryBuilder = zoneSpaceBaseTableservice.select(request.filters)
+            queryBuilder.tableName="f_uneq_in_sy_space('$projectId','$sysId')"
+            if (null != request.projection) {
+                queryBuilder.projection(request.projection!!)
+            }
+            if (null != request.orders) {
+                queryBuilder.order(request.orders!!)
+            }
+            val pageInfo = queryBuilder.pageQuery(request.pageNumber, request.pageSize)
+
+            SQueryResponse(pageInfo)
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, "")
+        }
+    } // Fun unSysZoneSpaceBaseTable
+
+    /**
+     * 创建系统下的设备关系
+     */
+    fun createLinkEquip(rSyEqList: RSyEqList): SCreateResponse<RSyEq> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val sysId = rSyEqList.sysId
+            val service = SObjectService(SMybatisDao(RSyEq::class.java))
+
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+
+            for (equipId in rSyEqList.listEquipId!!){
+                val r = RSyEq()
+                r.sysId = sysId
+                r.equipId = equipId
+                r.projectId = projectId
+
+                var result = service.insert(r)
+
+                if (result){
+                    successList.add(r)
+                }else{
+                    failureList.add(r)
+                }
+            }
+            if (successList.size>0){
+                val sCreateResponse = SCreateResponse<RSyEq>(SResponseType.success)
+                if (failureList.size>0){
+                    sCreateResponse.message ="失败对象:"+failureList.toJson()
+                }
+                sCreateResponse
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    }
+
+    /**
+     * 查询系统信息
+     */
+    fun pageQuerys(buildingId: String?, floorId: String?,request: SQueryRequest): SQueryResponse<GeneralSystem> {
+        val projectId = SPageContext.getHeader("ProjectId")
+        val syinFlService = SObjectService(SMybatisDao(RSyInFl::class.java))
+        val syinBdService = SObjectService(SMybatisDao(RSyInBd::class.java))
+        val buildingFloorInfoService = SObjectService(SMybatisDao(BuildingFloorInfo::class.java))
+        val idList = ArrayList<String>()
+        val notIdList = ArrayList<String>()
+        var list = ArrayList<SFilter>()
+        list.add(SFilter.eq("projectId",projectId!!))
+
+        if(!floorId.isNullOrEmpty()&&!floorId.equals("1")&&(buildingId.isNullOrEmpty()||buildingId.equals("1"))){
+            /** 楼层id不为空且不为1,建筑id为空 ---> 系统和楼层关系表 取系统id */
+            val objList = syinFlService.select(SFilter.eq("floorId", floorId)).distinct().projection("sysId").exec()
+            if(!objList.isNullOrEmpty()){
+                for (obj in objList){
+                    idList.add(obj.sysId!!)
+                }
+            }else{
+                idList.add("")
+            }
+            list.add(SFilter.inList("id",idList))
+        }else if((floorId.isNullOrEmpty()||floorId.equals("1"))&&!buildingId.isNullOrEmpty()&&!buildingId.equals("1")){
+            /** 楼层id为空,建筑id不为空且不为1 ---> 系统和建筑关系表 取系统id */
+            val objList = syinBdService.select(SFilter.eq("buildingId", buildingId)).distinct().projection("sysId").exec()
+            if(!objList.isNullOrEmpty()) {
+                for (obj in objList) {
+                    idList.add(obj.sysId!!)
+                }
+            }else{
+                idList.add("")
+            }
+            list.add(SFilter.inList("id", idList))
+        }else if(!floorId.isNullOrEmpty()&&floorId.equals("1")&&!buildingId.isNullOrEmpty()&&buildingId.equals("1")){
+            /** 楼层id为1,建筑id为1 ---> 系统id不在(系统和楼层关系表 取系统id  系统和建筑关系表 取系统id)之内*/
+            val objList1 = syinFlService.selectAll().distinct().projection("sysId").exec()
+            if(!objList1.isNullOrEmpty()){
+                for (obj in objList1){
+                    idList.add(obj.sysId!!)
+                }
+            }
+            val objList2 = syinBdService.selectAll().distinct().projection("sysId").exec()
+            if(!objList2.isNullOrEmpty()) {
+                for (obj in objList2) {
+                    idList.add(obj.sysId!!)
+                }
+            }
+            list.add(SFilter.not(SFilter.inList("id", idList)))
+        }else if(!floorId.isNullOrEmpty()&&!floorId.equals("1")&&!buildingId.isNullOrEmpty()&&!buildingId.equals("1")){
+            /** 楼层id不为空,建筑id不为空 ---> 系统和楼层关系表 取系统id  将建筑id作为条件 */
+            val objList = syinFlService.select(SFilter.eq("floorId", floorId),SFilter.eq("buildingId", buildingId)).distinct().projection("sysId").exec()
+            if(!objList.isNullOrEmpty()) {
+                for (obj in objList) {
+                    idList.add(obj.sysId!!)
+                }
+            }else{
+                idList.add("")
+            }
+            list.add(SFilter.inList("id", idList))
+        }else if(floorId.isNullOrEmpty()&&buildingId.isNullOrEmpty()){
+            /** 楼层id为空,建筑id为空 ---> 查询所有 */
+        }
+        val pageInfo = pageQuery(request, list)
+
+        for(system in pageInfo.content!!){
+            val queryBuilder = buildingFloorInfoService.selectAll()
+            queryBuilder.tableName="f_get_bd_and_fl('${system.id}','$buildingId','$floorId')"
+            val bdflList = queryBuilder.exec()
+            system.buildingFloorInfoList = bdflList
+        }
+        return pageInfo
+    } // Fun pageQuerys
+
+    /**
+     * @Description: 创建成功
+     */
+    override fun onCreateSuccess(entityList: ArrayList<GeneralSystem>) {
+        super.onCreateSuccess(entityList)
+        for (generalSystem in entityList) {
+            ObjInfoService.createInfo(generalSystem,true,"Sy",generalSystem.category!!)
+        }
+    }
+
+    /**
+     * @Description: 更新信息点
+     */
+    override fun onUpdateSuccess(entityList: ArrayList<GeneralSystem>) {
+        super.onUpdateSuccess(entityList)
+        for (generalSystem in entityList) {
+            ObjInfoService.createInfo(generalSystem,false,"Sy",generalSystem.category!!)
+        }
+    }
+
+    /**
+     * @Description:删除成功之后
+     */
+    override fun onDeleteSuccess(entityList: ArrayList<GeneralSystem>) {
+        super.onDeleteSuccess(entityList)
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (entity in entityList) {
+                ObjInfoService.delete(SFilter.eq("projectId",projectId!!), SFilter.eq("objId",entity.id!!), SFilter.eq("objType","Sy"))
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+
+} // Object GeneralSystemService

+ 153 - 0
data-center/src/main/kotlin/com/persagy/server/services/objects/LocationPointServices.kt

@@ -0,0 +1,153 @@
+package com.persagy.server.services.objects
+
+import com.persagy.server.services.base.RService
+import cn.sagacloud.server.datacenter.utils.IdUtils
+import cn.sagacloud.server.scanbuilding.User
+import cn.sagacloud.server.scanbuilding.UserLog
+import com.persagy.server.datacenter.models.entities.assistant.PointImage
+import com.persagy.server.datacenter.models.entities.objects.LocationPoint
+import com.sybotan.base.extensions.toJson
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import org.slf4j.LoggerFactory
+
+/**
+ * 点位标签服务
+ *
+ * @author 张维新
+ */
+object LocationPointServices : RService<LocationPoint>(SMybatisDao(LocationPoint::class.java)) {
+
+    /** 日志 */
+    private val logger = LoggerFactory.getLogger(LocationPointServices::class.java)
+    /** 点位图片库 */
+    var pointImageService = SObjectService(SMybatisDao(PointImage::class.java))
+    /** 扫楼日志 */
+    var userLogService = SObjectService(SMybatisDao(UserLog::class.java))
+    /** 用户 */
+    var userService = SObjectService(SMybatisDao(User::class.java))
+
+    /**
+     * 创建之前的操作
+     */
+    override fun onCreateBefore(entity: LocationPoint): Boolean {
+        logger.debug("创建的点位=${entity.toJson()}")
+        val projectId = SPageContext.getHeader("ProjectId")
+        if (entity.id.isNullOrEmpty()) {
+            return false
+        }
+        if (entity.imageList != null && entity.imageList!!.isNotEmpty()) {
+            for (image in entity.imageList!!) {
+                try {
+                    image.objectId = entity.id
+                    val replace = pointImageService.replace(image)
+                    if (replace){
+                        logger.debug("点位图片存储成功*****************************")
+                    }else{
+                        logger.debug("点位图片存储失败*****************************")
+                    }
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+            }
+        }
+        entity.projectId = projectId
+        return super.onCreateBefore(entity)
+    } // Function onCreateBefore()
+
+    override fun onCreateSuccess(entityList: ArrayList<LocationPoint>) {
+        super.onCreateSuccess(entityList)
+
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val comming = SPageContext.getHeader("Coming")
+            val account = SPageContext.getHeader("Account")
+            for (entity in entityList){
+                try {
+                    if (!comming.isNullOrEmpty()){
+                        if (comming == "app"){
+                            val user = userService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("phone", account!!)).entity()
+                            val userLog = UserLog()
+                            userLog.comming = "app"
+                            userLog.action = "创建点位标签"
+                            userLog.id = IdUtils.uuidCreate()
+                            userLog.note = "项目ID: "+projectId+" 用户ID:"+user!!.id+" 手机号:"+ account+" 请求来源:"+comming+ " "+entity.toJson()
+                            userLog.phone = account
+                            userLog.projectId = projectId
+                            userLog.userId = user!!.id
+                            userLog.name = user.name
+                            userLog.objectId = entity.id
+                            userLogService.insert(userLog)
+                        }
+                    }
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+
+    } // Fun
+
+    /**
+     * 更新之前的操作
+     */
+    override fun onUpdateBefore(entity: LocationPoint): Boolean {
+        if (entity.id.isNullOrEmpty()) {
+            return false
+        }
+        if (entity.imageList != null && entity.imageList!!.isNotEmpty()) {
+            for (image in entity.imageList!!) {
+                try {
+                    image.objectId = entity.id
+                    val replace = pointImageService.replace(image)
+                    if (replace){
+
+                    }else{
+
+                    }
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+            }
+        }
+        return super.onUpdateBefore(entity)
+    } // Function onCreateBefore()
+
+    override fun onUpdateSuccess(entityList: ArrayList<LocationPoint>) {
+        super.onUpdateSuccess(entityList)
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val comming = SPageContext.getHeader("Coming")
+            val account = SPageContext.getHeader("Account")
+            for (entity in entityList){
+                try {
+                    if (!comming.isNullOrEmpty()){
+                        if (comming == "app"){
+                            val user = userService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("phone", account!!)).entity()
+                            val userLog = UserLog()
+                            userLog.comming = "app"
+                            userLog.action = "更新点位标签"
+                            userLog.id = IdUtils.uuidCreate()
+                            userLog.note = "项目ID: "+projectId+" 用户ID:"+user!!.id+" 手机号:"+ account+" 请求来源:"+comming+ " "+entity.toJson()
+                            userLog.phone = account
+                            userLog.projectId = projectId
+                            userLog.userId = user!!.id
+                            userLog.name = user.name
+                            userLog.objectId = entity.id
+                            userLogService.insert(userLog)
+                        }
+                    }
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+} // Object LocationPointServices

+ 155 - 0
data-center/src/main/kotlin/com/persagy/server/services/objects/ProjectService.kt

@@ -0,0 +1,155 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.objects
+
+import com.persagy.server.services.base.Service
+import com.persagy.server.datacenter.models.entities.objects.Project
+import com.sybotan.mybatis.SMybatisDao
+import org.slf4j.LoggerFactory
+
+/**
+ * 项目信息服务
+ *
+ * @author 张维新
+ */
+object ProjectService : Service<Project>(SMybatisDao(Project::class.java)) {
+    /** 日志 */
+    private val logger = LoggerFactory.getLogger(ProjectService::class.java)
+
+
+
+    /**
+     * 创建项目
+     *
+     * @param   code        城市编码
+     * @param   password    项目密码
+     * @param   project     项目对象
+     * @return              创建结果信息
+     */
+//    fun create(code: String?, password: String, project: Project, messageHandler: MessageHandler?): SCreateResponse {
+//        return try {
+//            /** code不能为空 */
+//            if (code.isNullOrEmpty()) {
+//                val sCreateResponse = SCreateResponse()
+//                sCreateResponse.message = "请输入正确的区域编码"
+//                sCreateResponse.result = SResponseType.failure
+//                return sCreateResponse
+//            } else {
+//                /** 查询code是否正确 */
+//                val entity = DictProvincialCityCodeService.select(SFilter.eq("code", code)).entity()
+//                if (entity == null) {
+//                    val sCreateResponse = SCreateResponse()
+//                    sCreateResponse.message = "区域码不存在"
+//                    sCreateResponse.result = SResponseType.failure
+//                    return sCreateResponse
+//                }
+//            }
+//            /** 获取区域存在几个建筑 */
+//            val count = baseDao.select(SFilter.contain("id", code)).exec()
+//            logger.debug("数量=${count.size}")
+//            /** 项目id */
+//            if (!project.id.isNullOrEmpty()) {
+//                val isWith = project.id!!.startsWith("Pj")
+//                if (!isWith) {
+//                    project.id = IdUtils.projectIdCreate(code, count.size)
+//                }
+//            } else {
+//                project.id = IdUtils.projectIdCreate(code, count.size)
+//            }
+//
+//            if (project.name.isNullOrEmpty()){
+//                val genId = String.format("%1$4s", count.size+1).replace(' ', '0')
+//                val cityCodeEntity = DictProvincialCityCodeService.select(SFilter.eq("code", code)).entity()
+//                var  nameCity =cityCodeEntity!!.name!!+genId+"项目"
+//                if (!cityCodeEntity.parent.isNullOrEmpty()){
+//                    val cityCode = DictProvincialCityCodeService.select(SFilter.eq("code", cityCodeEntity.parent!!)).entity()
+//                    nameCity = cityCode!!.name+cityCodeEntity.name!!+genId+"项目"
+//
+//                    if (!cityCode.parent.isNullOrEmpty()){
+//                        val city = DictProvincialCityCodeService.select(SFilter.eq("code", cityCode.parent!!)).entity()
+//                        nameCity = city!!.name+cityCode.name+cityCodeEntity.name!!+genId+"项目"
+//                    }
+//                }
+//                project.name = nameCity
+//            }
+//
+//            logger.debug("项目id = ${project.id}")
+//            /** 项目密码 */
+//            project.password = password
+//            val isSuccess = baseDao.insert(project)
+//            /** 创建成功 */
+//            if (isSuccess) {
+//                val jsonObject = JSONObject()
+//                jsonObject.put("type", "1")
+//                jsonObject.put("projectId", project.id)
+//                jsonObject.put("id", project.id)
+//                /** 发送消息 */
+//                messageHandler!!.sendMessage(jsonObject.toString())
+//                /** 返回创建成功的项目id */
+//                SCreateResponse(project.id!!)
+//            } else {
+//                val sCreateResponse = SCreateResponse()
+//                sCreateResponse.message = "创建失败"
+//                sCreateResponse.result = SResponseType.failure
+//                sCreateResponse
+//            }
+//        } catch (e: Exception) {
+//            e.printStackTrace()
+//            SCreateResponse(SResponseType.failure, e.message!!)
+//        }
+//    } // Function create()
+
+    /**
+     * 根据id删除
+     *
+     * @param   idList      id数组
+     * @return              删除的结果信息
+     */
+//    fun delete(idList: ArrayList<String>, messageHandler: MessageHandler?): SDeleteResponse {
+//        try {
+//            /** 成功集合 */
+//            val successList = ArrayList<Any>()
+//            /** 失败集合 */
+//            val failureList = ArrayList<Any>()
+//            for (id in idList) {
+//                val isDelete = ProjectService.delete("id" to id)
+//                /** 删除成功 */
+//                if (isDelete) {
+//                    val jsonObject = JSONObject()
+//                    jsonObject.put("type", "2")
+//                    jsonObject.put("projectId", id)
+//                    jsonObject.put("id", id)
+//                    /** 发送消息 */
+//                    messageHandler!!.sendMessage(jsonObject.toString())
+//                    successList.add(id)
+//                } else {
+//                    /** 删除失败 */
+//                    failureList.add(id)
+//                }
+//            }
+//            return SDeleteResponse(successList, failureList)
+//        } catch (e: Exception) {
+//            e.printStackTrace()
+//            return SDeleteResponse(SResponseType.failure, e.message!!)
+//        }
+//    } // Function delete()
+
+} // Object ProjectService

+ 243 - 0
data-center/src/main/kotlin/com/persagy/server/services/objects/PropertyService.kt

@@ -0,0 +1,243 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.objects
+
+import cn.sagacloud.server.datacenter.utils.IdUtils
+import cn.sagacloud.server.datacenter.utils.ShaftNameUtil
+import cn.sagacloud.server.scanbuilding.User
+import cn.sagacloud.server.scanbuilding.UserLog
+
+import com.persagy.server.datacenter.models.entities.logs.DataCenterLogs
+import com.persagy.server.datacenter.models.entities.objects.Equipment
+import com.persagy.server.datacenter.models.entities.objects.Property
+import com.persagy.server.services.base.Service
+import com.persagy.server.services.dict.EquipFamilyService
+import com.sybotan.base.extensions.toJson
+import com.sybotan.database.SFilter
+import com.sybotan.database.SQueryBuilder
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+
+/**
+ * 资产信息服务
+ *
+ * @author 张维新
+ */
+object PropertyService : Service<Property>(SMybatisDao(Property::class.java)) {
+
+    /** 扫楼日志 */
+    var userLogService = SObjectService(SMybatisDao(UserLog::class.java))
+    /** 用户 */
+    var userService = SObjectService(SMybatisDao(User::class.java))
+
+    /**
+     * 创建之前操作
+     */
+    override fun onCreateBefore(property: Property): Boolean  {
+        val projectId = SPageContext.getHeader("ProjectId")
+        val coming = SPageContext.getHeader("Coming")
+        if (!property.id.isNullOrEmpty()) {
+            val isStartsWith = property.id.toString().startsWith("Pe")
+            if (!isStartsWith) {
+                /** 资产id */
+                property.id = IdUtils.peIdCreate(projectId!!)
+            }
+        } else {
+            /** 资产id */
+            property.id = IdUtils.peIdCreate(projectId!!)
+        }
+        /** 项目id */
+        property.projectId = projectId
+        // 创建标记
+        if(coming.isNullOrEmpty()&&coming == "app"){
+            property.source = "app"
+        }
+        if (!property.family.isNullOrEmpty()){
+            val family = EquipFamilyService.select(SFilter.eq("family", property.family!!)).entity()
+            if (family!=null){
+                /** 资产名字 */
+                if (property.name.isNullOrEmpty()) {
+                    property.name = ShaftNameUtil.shaftName(family.familyName+"-")
+                }
+            }else{
+                /** 资产名字 */
+                if (property.name.isNullOrEmpty()) {
+                    property.name = ShaftNameUtil.shaftName("资产-")
+                }
+            }
+            return true
+        }else{
+            return false
+        }
+    } // Function onCreateBefore()
+
+    override fun onCreateSuccess(entityList: ArrayList<Property>) {
+        super.onCreateSuccess(entityList)
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val comming = SPageContext.getHeader("Coming")
+            val account = SPageContext.getHeader("Account")
+            for (entity in entityList){
+                try {
+                    if (!comming.isNullOrEmpty()){
+                        if (comming == "app"){
+                            val user = userService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("phone", account!!)).entity()
+                            val userLog = UserLog()
+                            userLog.comming = "app"
+                            userLog.action = "创建资产"
+                            userLog.id = IdUtils.uuidCreate()
+                            userLog.note = "项目ID: "+projectId+" 用户ID:"+user!!.id+" 手机号:"+ account+" 请求来源:"+comming+ " "+entity.toJson()
+                            userLog.phone = account
+                            userLog.projectId = projectId
+                            userLog.userId = user!!.id
+                            userLog.name = user.name
+                            userLog.objectId = entity.id
+                            userLogService.insert(userLog)
+                        }
+                    }
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+
+
+    /**
+     * 查询资产数量前的操作
+     *
+     * @param   queryBuilder  条件
+     */
+    override fun onCountBefore(queryBuilder: SQueryBuilder<Property>) {
+        queryBuilder.tableName = "v_property"
+        return
+    } // Function onCountBefore()
+
+    /**
+     * 查询资产数量前的操作
+     *
+     * @param   queryBuilder  条件
+     */
+    override fun onQueryBefore(queryBuilder: SQueryBuilder<Property>) {
+        queryBuilder.tableName = "v_property"
+        return
+    } // Function onQueryBefore()
+
+
+    override fun onUpdateBefore(entity: Property): Boolean {
+
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val comming = SPageContext.getHeader("Coming")
+            val account = SPageContext.getHeader("Account")
+                try {
+                    if (!comming.isNullOrEmpty()){
+                        if (comming == "app"){
+                            val user = userService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("phone", account!!)).entity()
+                            val userLog = UserLog()
+                            userLog.comming = "app"
+                            userLog.action = "创建资产"
+                            userLog.id = IdUtils.uuidCreate()
+                            userLog.note = "项目ID: "+projectId+" 用户ID:"+user!!.id+" 手机号:"+ account+" 请求来源:"+comming+ " "+entity.toJson()
+                            userLog.phone = account
+                            userLog.projectId = projectId
+                            userLog.userId = user!!.id
+                            userLog.name = user.name
+                            userLog.objectId = entity.id
+                            userLogService.insert(userLog)
+                        }
+                    }
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return super.onUpdateBefore(entity)
+    }
+
+
+
+    /**
+     * 删除之前操作
+     */
+    override fun onDeleteBefore(entity: Property): Boolean {
+        try {
+            val  property = this.select(SFilter.eq("id", entity.id!!)).entity()
+
+            val projectId = SPageContext.getHeader("ProjectId")
+            val coming = SPageContext.getHeader("Coming")
+            val account = SPageContext.getHeader("Account")
+            try {
+                /** 日志 */
+                val dataCenterLogs = DataCenterLogs()
+                dataCenterLogs.id = IdUtils.uuidCreate()
+                dataCenterLogs.author = "dataCenter"
+                dataCenterLogs.projectId = projectId
+                dataCenterLogs.objectType = entity.objectType
+                dataCenterLogs.type = "delete"
+                dataCenterLogs.account = account
+                dataCenterLogs.coming = coming
+                dataCenterLogs.objectId = property!!.id
+                val hashMap = HashMap<String, Any?>()
+                hashMap[entity.objectType!!] = property
+                dataCenterLogs.dataSource = hashMap
+                logService.insert(dataCenterLogs)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+
+            try {
+                /** 清除 */
+                if (property!=null&&!property.equipId.isNullOrEmpty()){
+
+                    if (property.equipId!!.startsWith("Eq")){
+                        val equipment = EquipmentService.select(SFilter.eq("equipId", property.equipId!!)).entity()
+                        if (equipment!=null&&equipment.taskState!=null&&equipment.taskState == -1&&equipment.bimId.isNullOrEmpty() ){
+                            val listDel = ArrayList<Equipment>()
+                            listDel.add(equipment)
+                            EquipmentService.deleteByKeysList(listDel)
+                        }
+                    }else if (property.equipId!!.startsWith("Ec")){
+                        val component = ComponentService.select(SFilter.eq("equipId", property.equipId!!)).entity()
+                        if (component?.taskState != null &&component.taskState == -1&&component.bimId.isNullOrEmpty() ){
+                            val listDel = ArrayList<Equipment>()
+                            listDel.add(component)
+                            EquipmentService.deleteByKeysList(listDel)
+                        }
+                    }
+                }
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+
+        return super.onDeleteBefore(entity)
+    } // Function onDeleteBefore()
+
+} // Object PropertyService

+ 515 - 0
data-center/src/main/kotlin/com/persagy/server/services/objects/ShaftService.kt

@@ -0,0 +1,515 @@
+package com.persagy.server.services.objects
+
+import cn.sagacloud.server.datacenter.utils.IdUtils
+import cn.sagacloud.server.datacenter.utils.ShaftNameUtil
+import cn.sagacloud.server.synchronize.MessageHandler
+import com.alibaba.fastjson.JSONObject
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+import com.persagy.server.datacenter.models.entities.assistant.ShaftFuncType
+import com.persagy.server.datacenter.models.entities.assistant.ShaftWithCount
+import com.persagy.server.datacenter.models.entities.dict.DataDictionaryDescription
+import com.persagy.server.datacenter.models.entities.logs.DataCenterLogs
+import com.persagy.server.datacenter.models.entities.objects.*
+import com.persagy.server.datacenter.models.entities.rel.*
+import com.persagy.server.datacenter.models.entities.task.BuildingDic
+import com.persagy.server.datacenter.models.entities.task.FloorDic
+import com.persagy.server.services.base.Service
+import com.sybotan.base.utils.SJsonUtil
+import com.sybotan.database.SFilter
+import com.sybotan.database.SPageQueryInfo
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.requests.SQueryRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SQueryResponse
+import org.slf4j.LoggerFactory
+import org.springframework.web.bind.annotation.RequestBody
+import java.util.*
+import kotlin.collections.ArrayList
+import kotlin.collections.HashMap
+import kotlin.collections.HashSet
+
+/**
+ * 竖井信息服务
+ *
+ * @author 张维新
+ */
+object ShaftService : Service<Shaft>(SMybatisDao(Shaft::class.java)) {
+    private val logger = LoggerFactory.getLogger(ShaftService::class.java)
+
+    /** 竖井和业务空间关系 */
+    var rSh2SpService = SObjectService(SMybatisDao(RSh2Sp::class.java))
+
+
+    /**
+     * 创建之前操作
+     *
+     * @param   shaft   竖井对象
+     */
+    override fun onCreateBefore(shaft: Shaft): Boolean  {
+        val projectId = SPageContext.getHeader("ProjectId")
+        /** 竖井id */
+        if (!shaft.id.isNullOrEmpty()) {
+            val isWith = shaft.id!!.startsWith("Sh")
+            if (!isWith) {
+                shaft.id = IdUtils.shaftIdCreate(projectId!!)
+            }
+        } else {
+            shaft.id = IdUtils.shaftIdCreate(projectId!!)
+        }
+        shaft.projectId = projectId
+        if (shaft.name.isNullOrEmpty()) {
+            shaft.name = ShaftNameUtil.shaftName("竖井-")
+        }
+        return true
+    } // Function onCreateBefore()
+
+    /**
+     * 查询竖井信息-包含统计信息
+     *
+     * @param       request
+     * @return      竖井统计信息
+     */
+    fun queryWithCount(@RequestBody request: SQueryRequest): SQueryResponse<ShaftWithCount> {
+        val service = SBaseService(SMybatisDao(ShaftWithCount::class.java))
+        return try {
+//            val queryBuilder = service.select(request.filters).filter(SFilter.notNull("id")).filter(SFilter.eq("ProjectId", SPageContext.getHeader("ProjectId")!!))
+            val queryBuilder = service.select(request.filters).filter(SFilter.eq("ProjectId", SPageContext.getHeader("ProjectId")!!))
+            if (null != request.projection) {
+                queryBuilder.projection(request.projection!!)
+            }
+            if (null != request.orders) {
+                queryBuilder.order(request.orders!!)
+            }
+            val pageInfo = queryBuilder.pageQuery(request.pageNumber, request.pageSize)
+            SQueryResponse(pageInfo)
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, e.message!!)
+        }
+
+    } // Function queryWithCount()
+
+    /** 解析 ArrayList<HashMap<String, Any?>> 类型的辅助类*/
+    class T {
+        val a = ArrayList<HashMap<String, Any?>>()
+    }
+
+    /**
+     * 查询竖井功能
+     *
+     * @return      竖井功能列表
+     */
+    fun queryShaftFuncType(): SQueryResponse<ShaftFuncType> {
+//        val service = SBaseService(SMybatisDao(ExplainShaft::class.java))
+        val service = SBaseService(SMybatisDao(DataDictionaryDescription::class.java))
+        val result = SQueryResponse<ShaftFuncType>()
+        result.content = ArrayList()
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val entity = service.select(SFilter.eq("type", "Shaft"), SFilter.eq("InfoPointCode", "ShaftFuncType")).entity()
+            val listType = ArrayList<ShaftFuncType>()
+            // val dataDictionaryMap = SJsonUtil.fromJson<ArrayList<HashMap<String, Any?>>>(entity!!.dataSource!!)
+           /** 获取到field类型 获取到泛型类 */
+            val t = T()
+            val field = t::class.java.getDeclaredField("a")
+            val dataDictionaryMap = SJsonUtil.fromJson(entity!!.dataSource!!, field.genericType) as ArrayList<HashMap<String, Any?>>
+//            val list = baseDao.select(SFilter.eq("projectId", projectId!!), SFilter.notNull("StructureInfo.ShaftFuncType")).exec()
+            val list = baseDao.select("projectId = '$projectId' ").exec()
+            if (list.isNotEmpty()) {
+                val set = HashSet<String>()
+                for (shaft in list) {
+                    if (shaft.structureInfo!!["ShaftFuncType"] != null) {
+                        val any = shaft.structureInfo!!["ShaftFuncType"].toString()
+                        set.add(any)
+                    }
+                }
+                for (str in set) {
+
+                    for (map  in dataDictionaryMap) {
+                        val id = map["Code"].toString()
+                        val name = map["Name"].toString()
+                        if (id == str) {
+                            val shaftFuncType = ShaftFuncType()
+                            shaftFuncType.id = id
+                            shaftFuncType.name = name
+                            listType.add(shaftFuncType)
+                        }
+                    }
+                }
+            }
+//            val shaftFuncTypeList = JSONUtils.parse((service.select(SFilter.eq("type", "Shaft"),SFilter.eq("InfoPointCode", "ShaftFuncType")).entity() )!!.dataSource)
+//            val shaftFuncTypeMap = jsonToMap(shaftFuncTypeList as ArrayList<Map<String, String>>)
+//            val map = HashMap<String, ShaftFuncType>()
+//            for (shaft in list) {
+//                if (shaft.structureInfo!!["ShaftFuncType"]!=null&&shaftFuncTypeMap.containsKey(shaft.structureInfo!!["ShaftFuncType"]!!) && !map.containsKey(shaft.structureInfo!!["ShaftFuncType"]!!)) {
+//                    val shaftFuncType = ShaftFuncType()
+//                    shaftFuncType.id = shaft.structureInfo!!["ShaftFuncType"]!!.toString()
+//                    shaftFuncType.name = shaftFuncTypeMap[shaft.structureInfo!!["ShaftFuncType"]!!]!!.toString()
+//                    map[shaftFuncType.id!!] = shaftFuncType
+//                }
+//            }
+//            (result.content as ArrayList<ShaftFuncType>).addAll(map.values)
+            result.content = listType
+            result
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function queryShaftFuncType()
+
+    private fun jsonToMap(shaftFuncTypeList: ArrayList<Map<String, String>>): Map<String, String> {
+        val result = HashMap<String, String>()
+        for (map in shaftFuncTypeList) {
+            result[map["id"].toString()] = map["name"].toString()
+        }
+        return result
+    }// Function jsonToMap()
+
+    /**
+     * 关联元空间
+     *
+     * @param       request
+     * @return      关联反馈
+     */
+    fun relateSpace(request: RelationSpaceShaft, messageHandler: MessageHandler?): SBaseResponse {
+        val failureList = ArrayList<Any>()
+        val service = SBaseService(SMybatisDao(RelationSpaceShaft::class.java))
+        // 先取消后重新建立
+        service.delete("shaftId" to request.shaftId!!)
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (space in request.spaceId!!.split(Regex(","))) {
+                val relationSpaceShaft = RelationSpaceShaft()
+                relationSpaceShaft.id = UUID.randomUUID().toString()
+                relationSpaceShaft.spaceId = space
+                relationSpaceShaft.shaftId = request.shaftId
+                relationSpaceShaft.projectId = projectId
+                if (space.isNotEmpty() && spaceExists(space, failureList)) {
+                    service.insert(relationSpaceShaft)
+                }
+            }
+            if (failureList.size == 0) {
+                val jsonObject = JSONObject()
+                jsonObject["type"] = "8"
+                jsonObject["id"] = request.shaftId
+                jsonObject["projectId"] = projectId
+                jsonObject["description"] = request.spaceId
+                /** 发送消息 */
+                messageHandler!!.sendMessage(jsonObject.toString())
+                SBaseResponse(SResponseType.success)
+            } else {
+                SBaseResponse(SResponseType.failure, "元空间$failureList" + "不存在")
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SBaseResponse(SResponseType.failure)
+        }
+    } // Function relateSpace()
+
+    /**
+     * 元空间是否存在
+     *
+     * @param       space       failureList
+     * @return      是否存在
+     */
+    private fun spaceExists(space: String, failureList: ArrayList<Any>): Boolean {
+        val service = SBaseService(SMybatisDao(ZoneIspace::class.java))
+        val list = service.select(SFilter.eq("RoomID", space)).exec()
+        if (list.size > 0) {
+            return true
+        }
+        failureList.add(space)
+        return false
+    } // Function spaceExists()
+
+
+    override fun onDeleteBefore(entity: Shaft): Boolean {
+        try {
+            val  shaft = this.select(SFilter.eq("id", entity.id!!)).entity()
+
+            val projectId = SPageContext.getHeader("ProjectId")
+            val coming = SPageContext.getHeader("Coming")
+            val account = SPageContext.getHeader("Account")
+            /** 日志 */
+            val dataCenterLogs = DataCenterLogs()
+            dataCenterLogs.id = IdUtils.uuidCreate()
+            dataCenterLogs.author = "dataCenter"
+            dataCenterLogs.projectId = projectId
+            dataCenterLogs.objectType = entity.objectType
+            dataCenterLogs.type = "delete"
+            dataCenterLogs.account = account
+            dataCenterLogs.coming = coming
+            dataCenterLogs.objectId = shaft!!.id
+            val hashMap = HashMap<String, Any?>()
+            hashMap[entity.objectType!!] = shaft
+            dataCenterLogs.dataSource = hashMap
+            logService.insert(dataCenterLogs)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return super.onDeleteBefore(entity)
+    } // Function onDeleteBefore()
+
+
+//    /**
+//     * 是否已关联元空间
+//     *
+//     * @param       request
+//     * @return      关联反馈
+//     */
+//    private fun isSpaceRelated(request: RelationSpaceShaft): Boolean {
+//        val service = SBaseService(SMybatisDao(RelationSpaceShaft::class.java))
+//        val list = service.select(SFilter.eq("spaceId", request.spaceId!!), SFilter.eq("shaftId", request.shaftId!!)).exec()
+//        if (list.size > 0) {
+//            return true
+//        }
+//        return false
+//    } // Function isSpaceRelated()
+
+    /**
+     * 查询没有和当前竖井贯通的竖井
+     *
+     * @param   shaftId     竖井id
+     * @param   request     条件
+     */
+//    fun unShaftThroughShaft(shaftId: String,@RequestBody request: SQueryRequest): SQueryResponse<Shaft> {
+//        return try {
+//            val listf = ArrayList<SFilter>()
+//            val list = ArrayList<String>()
+//            val projectId = SPageContext.getHeader("ProjectId")
+//            try {
+//                val execList = RShaftThroughShaftService.select(SFilter.eq("shaftId", shaftId), SFilter.eq("projectId", projectId!!)).exec()
+//                val execOtherList = RShaftThroughShaftService.select(SFilter.eq("shaftOtherId", shaftId), SFilter.eq("projectId", projectId!!)).exec()
+//
+//                for (exec in execList){
+//                    list.add(exec.shaftOtherId!!)
+//                }
+//                for (exec in execOtherList){
+//                    list.add(exec.shaftId!!)
+//                }
+//            } catch (e: Exception) {
+//                e.printStackTrace()
+//            }
+//
+//            if (list.size>0){
+//                listf.add(SFilter.eq("projectId",projectId!!))
+//                listf.add(SFilter.not(SFilter.inList("ShaftID",list)))
+//            }else{
+//
+//                listf.add(SFilter.eq("projectId",projectId!!))
+//            }
+//
+//            val pageQuery = ShaftService.pageQuery(request, listf)
+//            pageQuery
+//        } catch (e: Exception) {
+//            e.printStackTrace()
+//            SQueryResponse(SResponseType.failure, e.message!!)
+//        }
+//
+//    } // Function unShaftThroughShaft()
+
+    /**
+     * 查询和当前竖井有关联的空间
+     */
+    fun shaftZoneSpaceBaseTable(shaftId: String, request: SQueryRequest): SQueryResponse<ZoneSpace>{
+        return try {
+            val list = ArrayList<String>()
+            val listf = ArrayList<SFilter>()
+            val projectId = SPageContext.getHeader("ProjectId")
+            val zoneSpaceBaseTableService = SObjectService(SMybatisDao(ZoneSpace::class.java))
+            val rShContainSpBaseervice = SObjectService(SMybatisDao(RShContainSpBase::class.java))
+            val rShContainSpBaseList = rSh2SpService.select(SFilter.eq("Id1", shaftId), SFilter.eq("projectId", projectId!!)).exec()
+            logger.error("空间数量= ${rShContainSpBaseList.size}")
+            for (rShContainSpBase in rShContainSpBaseList) {
+                list.add(rShContainSpBase.id2!!)
+            }
+            listf.add(SFilter.eq("projectId", projectId!!))
+            if (list.size > 0) {
+                listf.add(SFilter.inList("id", list))
+            }else{
+                listf.add(SFilter.eq("id", ""))
+            }
+            logger.error("空间数量总= ${list.size}")
+            zoneSpaceBaseTableService.pageQuery(request, listf)
+        }catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, e.message.toString())
+        }
+    } // Fun shaftZoneSpaceBaseTable
+
+    /**
+     * 查询和当前竖井没有关联的空间
+     */
+    fun unShaftZoneSpaceBaseTable(shaftId: String, request: SQueryRequest): SQueryResponse<ZoneSpace>{
+        return try {
+            val list = ArrayList<String>()
+            val listf = ArrayList<SFilter>()
+            val projectId = SPageContext.getHeader("ProjectId")
+            val zoneSpaceBaseTableService = SObjectService(SMybatisDao(ZoneSpace::class.java))
+
+            val rShContainSpBaseList = rSh2SpService.select(SFilter.eq("Id1", shaftId), SFilter.eq("projectId", projectId!!)).exec()
+
+            for (rShContainSpBase in rShContainSpBaseList) {
+                list.add(rShContainSpBase.id2!!)
+            }
+            listf.add(SFilter.eq("projectId", projectId!!))
+            if (list.size > 0) {
+                listf.add(SFilter.not(SFilter.inList("id", list)))
+            }
+
+            zoneSpaceBaseTableService.pageQuery(request, listf)
+        }catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, "")
+        }
+    } // Fun unShaftZoneSpaceBaseTable
+
+    /**
+     * 查询和当前竖井有关联的业务空间所在建筑及楼层信息
+     */
+    fun shaftZoneSpaceBaseTableBuilding(shaftId: String,objectType:String?): SQueryResponse<BuildingDic>{
+        val pageQuery: SPageQueryInfo<BuildingDic>
+        val gson = Gson()
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            var request = SQueryRequest()
+            val service = SBaseService(SMybatisDao(BuildingDic::class.java))
+            val queryBuilder = service.select(request.filters)
+            queryBuilder.tableName = "public.f_get_building_dic_for_sh2sp('$projectId','$shaftId','$objectType')"
+            pageQuery = queryBuilder.pageQuery(1, 1000)
+            logger.debug("數據打印*******************************************************************")
+            for(floor in pageQuery.content!!){
+
+                if(floor.floorListStr != null){
+                    val listStr = floor.floorListStr!!.replace("/\\","")
+                    val newStr = "["+listStr.substring(1,listStr.length-1)+"]"
+                    val type = object : TypeToken<ArrayList<FloorDic>>() {
+                    }.type
+                    val siInSpList = gson.fromJson<ArrayList<FloorDic>>(newStr, type)
+                    /** 排序处理 */
+                    val setId = HashSet<String>()
+                    for (floor in siInSpList){
+                        setId.add(floor.floorId!!)
+                    }
+                    val floorLists = ArrayList<FloorDic>()
+                    val floorList = FloorService.select(SFilter.inList("id", setId.toList())).order("sequenceId desc").exec()
+                    for (floors in floorList){
+                        val floorDic = FloorDic()
+                        floorDic.floorId = floors.id
+                        floorDic.floorLocalName = floors.localName
+                        floorDic.floorName = floors.name
+                        floorLists.add(floorDic)
+                    }
+                    floor.floorList = floorLists
+                    floor.floorListStr = null
+                }
+            }
+            SQueryResponse(pageQuery)
+        }catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, "")
+        }
+    } // Fun shaftZoneSpaceBaseTable
+
+
+    /**
+     * 查询没有和当前竖井关联的设备
+     *
+     * @param  shaftId        竖井id
+     */
+    fun unShaftEquip(shaftId: String, request: SQueryRequest): SQueryResponse<Equipment>{
+        return  try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val equipmentService = SObjectService(SMybatisDao(Equipment::class.java))
+            val rEqInShService = SObjectService(SMybatisDao(REqInSh::class.java))
+            val rSyEqList = rEqInShService.select(SFilter.eq("shaftId", shaftId), SFilter.eq("projectId", projectId!!)).exec()
+
+            val list = ArrayList<String>()
+            val listf = ArrayList<SFilter>()
+            for (rSyEq in rSyEqList){
+                list.add(rSyEq.equipId!!)
+            }
+
+            if (list.size>0){
+                listf.add(SFilter.eq("projectId", projectId!!))
+                listf.add(SFilter.not(SFilter.inList("id", list)))
+            }else{
+                listf.add(SFilter.eq("projectId", projectId!!))
+            }
+
+            equipmentService.pageQuery(request,listf)
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, "")
+        }
+    } // Fun unShaftEquip
+
+    /**
+     * 查询没有和当前竖井关联的设备
+     *
+     * @param  shaftId        竖井id
+     */
+    fun unShaftOtherShaft(shaftId: String, request: SQueryRequest): SQueryResponse<Shaft>{
+        return  try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val rShaftThroughShaftService = SObjectService(SMybatisDao(RShaftThroughShaft::class.java))
+            val rShaftThroughShaftList = rShaftThroughShaftService.select(SFilter.eq("shaftId", shaftId), SFilter.eq("projectId", projectId!!)).exec()
+
+            val list = ArrayList<String>()
+            val listf = ArrayList<SFilter>()
+            for (rShaftThroughShaft in rShaftThroughShaftList){
+                list.add(rShaftThroughShaft.shaftOtherId!!)
+            }
+
+            if (list.size>0){
+                listf.add(SFilter.eq("projectId", projectId!!))
+                listf.add(SFilter.not(SFilter.inList("id", list)))
+            }else{
+                listf.add(SFilter.eq("projectId", projectId!!))
+            }
+
+            ShaftService.pageQuery(request,listf)
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, "")
+        }
+    } // Fun unShaftOtherShaft
+
+    /**
+     * 查询没有和当前竖井关联的系统
+     *
+     * @param  shaftId        竖井id
+     */
+    fun unShaftSys(shaftId: String, request: SQueryRequest): SQueryResponse<GeneralSystem>{
+        return  try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val generalSystemService = SObjectService(SMybatisDao(GeneralSystem::class.java))
+            val rSyInShService = SObjectService(SMybatisDao(RSyInSh::class.java))
+            val rSyInShList = rSyInShService.select(SFilter.eq("shaftId", shaftId), SFilter.eq("projectId", projectId!!)).exec()
+
+            val list = ArrayList<String>()
+            val listf = ArrayList<SFilter>()
+            for (rSyInSh in rSyInShList){
+                list.add(rSyInSh.sysId!!)
+            }
+
+            if (list.size>0){
+                listf.add(SFilter.eq("projectId", projectId!!))
+                listf.add(SFilter.not(SFilter.inList("id", list)))
+            }else{
+                listf.add(SFilter.eq("projectId", projectId!!))
+            }
+
+            generalSystemService.pageQuery(request,listf)
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, "")
+        }
+    } // Fun unShaftSys
+
+} // Object ShaftService

+ 134 - 0
data-center/src/main/kotlin/com/persagy/server/services/objects/SpaceService.kt

@@ -0,0 +1,134 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.objects
+
+import cn.sagacloud.server.datacenter.utils.IdUtils
+import cn.sagacloud.server.datacenter.utils.ShaftNameUtil
+import com.persagy.server.datacenter.models.entities.logs.DataCenterLogs
+import com.persagy.server.datacenter.models.entities.objects.ZoneIspace
+import com.persagy.server.datacenter.models.requests.DCSQueryRequest
+import com.persagy.server.services.base.Service
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.responses.SQueryResponse
+
+/**
+ * 模型空间信息服务
+ *
+ * @author 张维新
+ */
+object SpaceService : Service<ZoneIspace>(SMybatisDao(ZoneIspace::class.java)) {
+
+    /**
+     * 创建前的操作
+     *
+     * @param   space   创建的对象
+     */
+    override fun onCreateBefore(space: ZoneIspace): Boolean {
+        val projectId = SPageContext.getHeader("ProjectId")
+        /** 元空间id */
+        if (!space.id.isNullOrEmpty()) {
+            val isWith = space.id!!.startsWith("Si")
+            if (!isWith) {
+                space.id = IdUtils.iSpaceIdCreate(projectId!!)
+            }
+        } else {
+            space.id = IdUtils.iSpaceIdCreate(projectId!!)
+        }
+        space.projectId = projectId
+
+        /** 设备名字 */
+        if (space.name.isNullOrEmpty()) {
+            space.name = ShaftNameUtil.shaftName("空间-")
+        }
+        return true
+    } // Function onCreateBefore()
+
+    override fun onDeleteBefore(entity: ZoneIspace): Boolean {
+        try {
+            val zoneIspace = this.select(SFilter.eq("id", entity.id!!)).entity()
+
+            val projectId = SPageContext.getHeader("ProjectId")
+            val coming = SPageContext.getHeader("Coming")
+            val account = SPageContext.getHeader("Account")
+            /** 日志 */
+            val dataCenterLogs = DataCenterLogs()
+            dataCenterLogs.id = IdUtils.uuidCreate()
+            dataCenterLogs.author = "dataCenter"
+            dataCenterLogs.projectId = projectId
+            dataCenterLogs.objectType = entity.objectType
+            dataCenterLogs.type = "delete"
+            dataCenterLogs.coming = coming
+            dataCenterLogs.account = account
+            dataCenterLogs.objectId = zoneIspace!!.id
+            val hashMap = HashMap<String, Any?>()
+            hashMap[entity.objectType!!] = zoneIspace
+            dataCenterLogs.dataSource = hashMap
+            logService.insert(dataCenterLogs)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return super.onDeleteBefore(entity)
+    }
+
+
+    /**
+     * 查询元空间
+     */
+    fun queryIspace(request: DCSQueryRequest): SQueryResponse<ZoneIspace> {
+        return try {
+            if (!request.floorId.isNullOrEmpty()) {
+
+                val projectId = SPageContext.getHeader("ProjectId")
+
+                val queryBuilder = select(request.filters)
+                val entity = FloorService.select(SFilter.eq("id", request.floorId!!)).entity()
+                if (entity!=null&&entity.modelId.isNullOrEmpty()){
+                    queryBuilder.filter(SFilter.eq("floorId", request.floorId!!))
+                }else{
+                    queryBuilder.tableName = "f_ispace('$projectId','${request.floorId}')"
+                }
+                if (null != request.projection) {
+                    queryBuilder.projection(request.projection!!)
+                }
+                if (null != request.orders) {
+                    queryBuilder.order(request.orders!!)
+                }
+
+                val sPageQueryInfo = queryBuilder.pageQuery(request.pageNumber, request.pageSize)
+
+                val sQueryResponse = SQueryResponse(sPageQueryInfo)
+                sQueryResponse.message = request.floorId!!
+                sQueryResponse
+
+            } else {
+                pageQuery(request, arrayListOf(SFilter.eq("projectId", SPageContext.getHeader("ProjectId").toString())))
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, e.message!!)
+        }
+    } //
+
+
+} // Object SpaceService

+ 157 - 0
data-center/src/main/kotlin/com/persagy/server/services/objects/TenantService.kt

@@ -0,0 +1,157 @@
+package com.persagy.server.services.objects
+
+import cn.sagacloud.server.datacenter.utils.IdUtils
+import cn.sagacloud.server.datacenter.utils.IdUtils.tenantIdCreate
+import cn.sagacloud.server.datacenter.utils.ShaftNameUtil
+import com.persagy.server.datacenter.models.entities.logs.DataCenterLogs
+import com.persagy.server.datacenter.models.entities.objects.Tenant
+import com.persagy.server.datacenter.models.entities.objects.TenantWithCount
+import com.persagy.server.datacenter.models.entities.objects.ZoneSpace
+import com.persagy.server.services.assistant.ObjInfoService
+import com.persagy.server.services.base.Service
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.requests.SQueryRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SQueryResponse
+import org.springframework.web.bind.annotation.RequestBody
+import java.util.*
+import kotlin.collections.ArrayList
+
+/**
+ * 租户信息服务
+ *
+ * @author  李井强
+ */
+object TenantService : Service<Tenant>(SMybatisDao(Tenant::class.java)) {
+
+    /**
+     * 创建之前操作
+     *
+     * @param   tenant  租户对象
+     */
+    override fun onCreateBefore(tenant: Tenant): Boolean  {
+        val projectId = SPageContext.getHeader("ProjectId")
+        tenant.projectId = projectId
+        if (tenant.id.isNullOrEmpty()){
+            tenant.id = tenantIdCreate(projectId!!)
+        }
+
+        if (tenant.name.isNullOrEmpty()) {
+            tenant.name = ShaftNameUtil.shaftName("租户-")
+        }
+        return true
+    } // Function onCreateBefore()
+
+    /**
+     * 查询租户信息-包含统计信息
+     *
+     * @param       request
+     * @return      租户统计信息
+     */
+    fun queryWithCount(@RequestBody request: SQueryRequest): SQueryResponse<TenantWithCount> {
+        val service = SBaseService(SMybatisDao(TenantWithCount::class.java))
+        return try {
+            val queryBuilder = service.select(request.filters)
+                    .filter(SFilter.eq("ProjectId", SPageContext.getHeader("ProjectId")!!))
+            if (null != request.projection) {
+                queryBuilder.projection(request.projection!!)
+            }
+            if (null != request.orders) {
+                queryBuilder.order(request.orders!!)
+            }
+            val pageInfo = queryBuilder.pageQuery(request.pageNumber, request.pageSize)
+            SQueryResponse(pageInfo)
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function queryWithCount()
+
+
+    /**
+     * 空间是否存在
+     *
+     * @param       zone       failureList
+     * @return      是否存在
+     */
+    private fun zoneExists(zone: String, failureList: ArrayList<Any>): Boolean {
+        val service = SBaseService(SMybatisDao(ZoneSpace::class.java))
+        val list = service.select(SFilter.eq("RoomID", zone)).exec()
+        if (list.size > 0) {
+            return true
+        }
+        failureList.add(zone)
+        return false
+    }// Function zoneExists()
+
+    /** 删除之前操作 */
+    override fun onDeleteBefore(entity: Tenant): Boolean {
+        try {
+            val  tenant = this.select(SFilter.eq("id", entity.id!!)).entity()
+            val projectId = SPageContext.getHeader("ProjectId")
+            val coming = SPageContext.getHeader("Coming")
+            val account = SPageContext.getHeader("Account")
+            /** 日志 */
+            val dataCenterLogs = DataCenterLogs()
+            dataCenterLogs.id = IdUtils.uuidCreate()
+            dataCenterLogs.author = "dataCenter"
+            dataCenterLogs.projectId = projectId
+            dataCenterLogs.objectType = entity.objectType
+            dataCenterLogs.type = "delete"
+            dataCenterLogs.account = account
+            dataCenterLogs.coming = coming
+            dataCenterLogs.objectId = tenant!!.id
+            val hashMap = HashMap<String, Any?>()
+            hashMap[entity.objectType!!] = tenant
+            dataCenterLogs.dataSource = hashMap
+            logService.insert(dataCenterLogs)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return super.onDeleteBefore(entity)
+    } // Function onDeleteBefore()
+
+
+    /**
+     * @Description: 创建成功
+     */
+    override fun onCreateSuccess(entityList: ArrayList<Tenant>) {
+        super.onCreateSuccess(entityList)
+        for (tenant in entityList) {
+            ObjInfoService.createInfo(tenant,true,"VOTn","Tenant")
+        }
+    }
+
+
+    /**
+     * @Description: 更新信息点
+     */
+    override fun onUpdateSuccess(entityList: ArrayList<Tenant>) {
+        super.onUpdateSuccess(entityList)
+        for (tenant in entityList) {
+            ObjInfoService.createInfo(tenant,false,"VOTn","Tenant")
+        }
+    }
+
+
+    /**
+     * @Description:删除成功之后
+     */
+    override fun onDeleteSuccess(entityList: ArrayList<Tenant>) {
+        super.onDeleteSuccess(entityList)
+
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (entity in entityList) {
+                ObjInfoService.delete(SFilter.eq("projectId",projectId!!), SFilter.eq("objId",entity.id!!), SFilter.eq("objType","VOTn"))
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+} // Object TenantService

+ 877 - 0
data-center/src/main/kotlin/com/persagy/server/services/objects/ZoneSpaceBaseService.kt

@@ -0,0 +1,877 @@
+/*
+ * ********************************************************************************************************************
+ *
+ *                     :*$@@%$*:                         ;:                ;;    ;;
+ *                   :@@%!  :!@@%:                       %!             ;%%@@%$ =@@@@@@@%;     @%@@@%%%%@@@@@
+ *                  :@%;       :$=                       %%$$$%$$         ;$$  ;$@=   !@$
+ *                  =@!                                  %!              @ $=;%   !@@@%:      !$$$$$$$$$$$$$$=
+ *                  =@*                                  %!              @ $= % %@=   =%@!      %=
+ *             *$%%! @@=        ;=$%%%$*:                %!              @ $= % =%%%%%%@$      *%:         =%
+ *           %@@!:    !@@@%=$@@@@%!  :*@@$:              %!              @ $= % $*     ;@      @*          :%*
+ *         ;@@!          ;!!!;:         ;@%:      =======@%========*     @ $$ % $%*****$@     :@$=*********=@$
+ *         $@*   ;@@@%=!:                *@*
+ *         =@$    ;;;!=%@@@@=!           =@!
+ *          %@$:      =@%: :*@@@*       %@=                    Copyright (c) 2016-2019.  北京上格云技术有限公司
+ *           ;%@@$=$@@%*       *@@@$=%@@%;
+ *              ::;::             ::;::                                              All rights reserved.
+ *
+ * ********************************************************************************************************************
+ */
+
+package com.persagy.server.services.objects
+
+
+import com.persagy.server.services.base.ServiceSpace
+import cn.sagacloud.server.datacenter.utils.IdUtils
+import cn.sagacloud.server.datacenter.utils.ShaftNameUtil
+import cn.sagacloud.server.scanbuilding.UserLog
+import com.persagy.server.datacenter.models.entities.dict.DictSpaceProject
+import com.persagy.server.datacenter.models.entities.graphtype.RelationTypeProject
+import com.persagy.server.datacenter.models.entities.objects.Building
+import com.persagy.server.datacenter.models.entities.objects.ZoneSpace
+import com.persagy.server.datacenter.models.entities.rel.RSpinBd
+import com.persagy.server.datacenter.models.entities.rel.RSpinFl
+import com.persagy.server.datacenter.models.requests.DCSQueryRequest
+import com.persagy.server.datacenter.models.requests.UpDataFloorAndBuildingRequests
+import com.persagy.server.datacenter.models.response.SpaceSQueryResponse
+import com.persagy.server.services.assistant.ObjInfoService
+import com.persagy.server.services.dict.DClassDefService
+import com.persagy.server.services.rel.RSpInBdService
+import com.persagy.server.services.rel.RSpInFlService
+import com.sybotan.base.extensions.toDouble
+import com.sybotan.base.extensions.toJson
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.requests.SUpdateRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SQueryResponse
+import org.json.JSONObject
+import org.slf4j.LoggerFactory
+
+/**
+ * 空间父类
+ *
+ * @author 邓婷婷
+ */
+object ZoneSpaceBaseService : ServiceSpace<ZoneSpace>(SMybatisDao(ZoneSpace::class.java)) {
+
+    /** 日志 */
+    private val logger = LoggerFactory.getLogger(EquipmentService::class.java)
+    /** 业务空间类型服务 */
+    var dictSpaceProjectService = SObjectService(SMybatisDao(DictSpaceProject::class.java))
+    /** 关系总览服务 */
+    val relationTypeProjectservice = SBaseService(SMybatisDao(RelationTypeProject::class.java))
+
+
+    /**
+     * 查询业务空间
+     */
+    fun querySpaces (request: DCSQueryRequest): SpaceSQueryResponse {
+        return try {
+
+//            val queryParser = SSyntaxParser(ByteArrayInputStream(request.filters!!.toByteArray()))
+//            val filters  = queryParser.parserFilters()
+//            logger.debug("filters1=${filters.toJson()}")
+//            for (f in filters){
+//                if (f.first  == "FloorId"){
+//                    f.second
+//                    logger.debug("filters= ${f.second} **************************************************************")
+//                }
+//            }
+
+
+
+
+
+
+            val projectId = SPageContext.getHeader("ProjectId")
+
+//            if(request.zoneType.isNullOrEmpty()&&request.zoneTypeList.isNullOrEmpty()){
+//                val sQueryResponse = SQueryResponse<ZoneSpace>(SResponseType.failure)
+//                sQueryResponse.message = "空间类型不能为空"
+//                return sQueryResponse
+//            }
+            var spaceSQueryResponse = SpaceSQueryResponse()
+
+            val listId = ArrayList<String>()
+            if(!request.buildingId.isNullOrEmpty()&&!request.floorId.isNullOrEmpty()&&request.floorId != "isnull"){
+                var rSpInFlList: ArrayList<RSpinFl>? = null
+                if (!request.zoneType.isNullOrEmpty()){
+                     rSpInFlList =  RSpInFlService.select(SFilter.eq("projectId",projectId!!),SFilter.eq("floorId",request.floorId!!),SFilter.eq("objectType",request.zoneType!!)).exec()
+                }else if (!request.zoneTypeList.isNullOrEmpty()){
+                     rSpInFlList =  RSpInFlService.select(SFilter.eq("projectId",projectId!!),SFilter.eq("floorId",request.floorId!!),SFilter.inList("objectType",request.zoneTypeList!!)).exec()
+                }else{
+                    rSpInFlList =  RSpInFlService.select(SFilter.eq("projectId",projectId!!),SFilter.eq("floorId",request.floorId!!)).exec()
+                }
+                if (rSpInFlList!=null&&rSpInFlList!!.size>0){
+
+                    for (rSpInFl in rSpInFlList){
+                        listId.add(rSpInFl.spaceId!!)
+                    }
+                }
+                if (listId.size>0){
+                    var listSFilter = ArrayList<SFilter>()
+                    listSFilter.add(SFilter.eq("projectId",projectId!!))
+                    listSFilter.add(SFilter.inList("id",listId))
+                    if (!request.zoneType.isNullOrEmpty()){
+                        listSFilter.add(SFilter.eq("objectType",request.zoneType!!))
+                    }else if (!request.zoneTypeList.isNullOrEmpty()){
+                        listSFilter.add(SFilter.inList("objectType",request.zoneTypeList!!))
+                    }
+                  val  pageQuery = pageQuery(request, listSFilter)
+                    spaceSQueryResponse.message = pageQuery.message
+                    spaceSQueryResponse.total = pageQuery.total
+                    spaceSQueryResponse.result = pageQuery.result
+                    spaceSQueryResponse.pageNumber = pageQuery.pageNumber
+                    spaceSQueryResponse.pageSize = pageQuery.pageSize
+                    spaceSQueryResponse.content = pageQuery.content
+                    spaceSQueryResponse
+                }
+
+            }else if(!request.buildingId.isNullOrEmpty()&&!request.floorId.isNullOrEmpty()&&request.floorId == "isnull"){
+
+               val floorList = FloorService.select(SFilter.eq("projectId",projectId!!),SFilter.eq("buildId",request.buildingId!!)).exec()
+               if (floorList.size>0){
+                   val listFloorId = ArrayList<String>()
+                   for (floor in floorList){
+                       listFloorId.add(floor.id!!)
+                   }
+                   if (!request.zoneType.isNullOrEmpty()){
+                       val listSpId = ArrayList<String>()
+                       val rSpInFlList = RSpInFlService.select(SFilter.eq("projectId", projectId!!), SFilter.inList("floorId", listFloorId),SFilter.eq("objectType",request.zoneType!!)).exec()
+                       if (rSpInFlList.size>0){
+
+                           for (rSpInFl in rSpInFlList){
+                               listSpId.add(rSpInFl.spaceId!!)
+                           }
+
+                           val rSpInBdList = RSpInBdService.select(SFilter.eq("projectId", projectId), SFilter.eq("buildingId", request.buildingId!!), SFilter.eq("objectType", request.zoneType!!), SFilter.not(SFilter.inList("spaceId", listSpId))).exec()
+                           if (rSpInBdList.size>0){
+                               for (rSpInBd in rSpInBdList){
+                                   listId.add(rSpInBd.spaceId!!)
+                               }
+                           }
+
+                       }else{
+                           val rSpInBdList = RSpInBdService.select(SFilter.eq("projectId", projectId), SFilter.eq("buildingId", request.buildingId!!), SFilter.eq("objectType", request.zoneType!!)).exec()
+
+                           if (rSpInBdList.size>0){
+                               for (rSpInBd in rSpInBdList){
+                                   listId.add(rSpInBd.spaceId!!)
+                               }
+                           }
+                       }
+
+                       if (listId.size>0){
+                           var listSFilter = ArrayList<SFilter>()
+                           listSFilter.add(SFilter.eq("projectId",projectId!!))
+                           listSFilter.add(SFilter.inList("id",listId))
+                           listSFilter.add(SFilter.eq("objectType",request.zoneType!!))
+                          val pageQuery = pageQuery(request, listSFilter)
+                           spaceSQueryResponse.message = pageQuery.message
+                           spaceSQueryResponse.total = pageQuery.total
+                           spaceSQueryResponse.result = pageQuery.result
+                           spaceSQueryResponse.pageNumber = pageQuery.pageNumber
+                           spaceSQueryResponse.pageSize = pageQuery.pageSize
+                           spaceSQueryResponse.content = pageQuery.content
+                       }
+                   }else {
+                       val listSpId = ArrayList<String>()
+                       var rSpInFlList: ArrayList<RSpinFl>? = null
+                       if (!request.zoneTypeList.isNullOrEmpty()){
+                            rSpInFlList = RSpInFlService.select(SFilter.eq("projectId", projectId!!), SFilter.inList("floorId", listFloorId),SFilter.inList("objectType",request.zoneTypeList!!)).exec()
+                       }else{
+                            rSpInFlList = RSpInFlService.select(SFilter.eq("projectId", projectId!!), SFilter.inList("floorId", listFloorId)).exec()
+                       }
+
+                       if (rSpInFlList.size>0){
+
+                           for (rSpInFl in rSpInFlList){
+                               listSpId.add(rSpInFl.spaceId!!)
+                           }
+
+                           val rSpInBdList = RSpInBdService.select(SFilter.eq("projectId", projectId), SFilter.eq("buildingId", request.buildingId!!), SFilter.eq("objectType", request.zoneType!!), SFilter.not(SFilter.inList("spaceId", listSpId))).exec()
+                           if (rSpInBdList.size>0){
+                               for (rSpInBd in rSpInBdList){
+                                   listId.add(rSpInBd.spaceId!!)
+                               }
+                           }
+
+                       }else{
+                           var rSpInBdList: ArrayList<RSpinBd>
+                           if (!request.zoneTypeList.isNullOrEmpty()){
+                               rSpInBdList = RSpInBdService.select(SFilter.eq("projectId", projectId), SFilter.eq("buildingId", request.buildingId!!), SFilter.inList("objectType", request.zoneTypeList!!)).exec()
+                           }else{
+                               rSpInBdList = RSpInBdService.select(SFilter.eq("projectId", projectId), SFilter.eq("buildingId", request.buildingId!!)).exec()
+                           }
+
+                           if (rSpInBdList.size>0){
+                               for (rSpInBd in rSpInBdList){
+                                   listId.add(rSpInBd.spaceId!!)
+                               }
+                           }
+                       }
+
+                       if (listId.size>0){
+                           var listSFilter = ArrayList<SFilter>()
+                           listSFilter.add(SFilter.eq("projectId",projectId!!))
+                           listSFilter.add(SFilter.inList("id",listId))
+                           if (!request.zoneTypeList.isNullOrEmpty()){
+                               listSFilter.add(SFilter.inList("objectType",request.zoneTypeList!!))
+                           }
+                         val   pageQuery = pageQuery(request, listSFilter)
+                           spaceSQueryResponse.message = pageQuery.message
+                           spaceSQueryResponse.total = pageQuery.total
+                           spaceSQueryResponse.result = pageQuery.result
+                           spaceSQueryResponse.pageNumber = pageQuery.pageNumber
+                           spaceSQueryResponse.pageSize = pageQuery.pageSize
+                           spaceSQueryResponse.content = pageQuery.content
+                       }
+                   }
+               }else{
+                   var rSpInFlList: ArrayList<RSpinBd>
+                   if (!request.zoneType.isNullOrEmpty()){
+                        rSpInFlList = RSpInBdService.select(SFilter.eq("projectId", projectId), SFilter.eq("buildingId", request.buildingId!!),SFilter.eq("objectType",request.zoneType!!)).exec()
+                   }else if (!request.zoneTypeList.isNullOrEmpty()){
+                        rSpInFlList = RSpInBdService.select(SFilter.eq("projectId", projectId), SFilter.eq("buildingId", request.buildingId!!),SFilter.inList("objectType",request.zoneTypeList!!)).exec()
+                   }else{
+                        rSpInFlList = RSpInBdService.select(SFilter.eq("projectId", projectId), SFilter.eq("buildingId", request.buildingId!!)).exec()
+                   }
+
+                   if (rSpInFlList.size>0){
+                       for (rSpInFl in rSpInFlList){
+                           listId.add(rSpInFl.spaceId!!)
+                       }
+                   }
+
+                   if (listId.size>0){
+                       var listSFilter = ArrayList<SFilter>()
+                       listSFilter.add(SFilter.eq("projectId",projectId!!))
+                       listSFilter.add(SFilter.inList("id",listId))
+                       if (!request.zoneType.isNullOrEmpty()){
+                           listSFilter.add(SFilter.eq("objectType",request.zoneType!!))
+                       }else  if (!request.zoneTypeList.isNullOrEmpty()){
+                           listSFilter.add(SFilter.inList("objectType",request.zoneTypeList!!))
+                       }
+
+                     val  pageQuery = pageQuery(request, listSFilter)
+                       spaceSQueryResponse.message = pageQuery.message
+                       spaceSQueryResponse.total = pageQuery.total
+                       spaceSQueryResponse.result = pageQuery.result
+                       spaceSQueryResponse.pageNumber = pageQuery.pageNumber
+                       spaceSQueryResponse.pageSize = pageQuery.pageSize
+                       spaceSQueryResponse.content = pageQuery.content
+                   }
+
+               }
+            }else if (!request.buildingId.isNullOrEmpty()&&request.floorId.isNullOrEmpty()&&request.buildingId != "isnull"){
+                var rSpInFlList: ArrayList<RSpinBd>
+                if (!request.zoneType.isNullOrEmpty()){
+                    rSpInFlList = RSpInBdService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("buildingId", request.buildingId!!),SFilter.eq("objectType",request.zoneType!!)).exec()
+                }else if (!request.zoneTypeList.isNullOrEmpty()){
+                    rSpInFlList = RSpInBdService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("buildingId", request.buildingId!!),SFilter.inList("objectType",request.zoneTypeList!!)).exec()
+                }else{
+                    rSpInFlList = RSpInBdService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("buildingId", request.buildingId!!)).exec()
+                }
+
+                if (rSpInFlList.size>0){
+                    for (rSpInFl in rSpInFlList){
+                        listId.add(rSpInFl.spaceId!!)
+                    }
+                }
+                if (listId.size>0){
+                    var listSFilter = ArrayList<SFilter>()
+                    listSFilter.add(SFilter.eq("projectId",projectId!!))
+                    listSFilter.add(SFilter.inList("id",listId))
+                    if (!request.zoneType.isNullOrEmpty()){
+                        listSFilter.add(SFilter.eq("objectType",request.zoneType!!))
+                    }else if (!request.zoneTypeList.isNullOrEmpty()){
+                        listSFilter.add(SFilter.inList("objectType",request.zoneTypeList!!))
+                    }
+                   val pageQuery = pageQuery(request, listSFilter)
+                    spaceSQueryResponse.message = pageQuery.message
+                    spaceSQueryResponse.total = pageQuery.total
+                    spaceSQueryResponse.result = pageQuery.result
+                    spaceSQueryResponse.pageNumber = pageQuery.pageNumber
+                    spaceSQueryResponse.pageSize = pageQuery.pageSize
+                    spaceSQueryResponse.content = pageQuery.content
+                }
+
+            }else if (!request.buildingId.isNullOrEmpty()&&request.floorId.isNullOrEmpty()&&request.buildingId == "isnull"){
+                logger.debug("未明确建筑****************************************************************************")
+                val buildingList = BuildingService.select(SFilter.eq("projectId", projectId!!)).exec()
+
+                if (buildingList.size>0){
+                    logger.debug("未明确建筑4****************************************************************************")
+                    for (building in buildingList){
+                        val rSpInBdList : ArrayList<RSpinBd>
+                        if (!request.zoneType.isNullOrEmpty()){
+                            rSpInBdList = RSpInBdService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("buildingId", building.id!!), SFilter.eq("objectType", request.zoneType!!)).exec()
+                        }else if (!request.zoneTypeList.isNullOrEmpty()){
+                            rSpInBdList = RSpInBdService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("buildingId", building.id!!), SFilter.inList("objectType", request.zoneTypeList!!)).exec()
+                        }else{
+                            rSpInBdList =RSpInBdService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("buildingId", building.id!!)).exec()
+                        }
+
+                        logger.debug("未明确建筑长度:${rSpInBdList.size}")
+                            for (rSpInBd in rSpInBdList){
+                                /** 需要被排除的空间id */
+                                listId.add(rSpInBd.spaceId!!)
+                            }
+                    }
+
+                            logger.debug("未明确建筑2****************************************************************************")
+                            var listSFilter = ArrayList<SFilter>()
+                            listSFilter.add(SFilter.eq("projectId",projectId!!))
+                            if (listId.size>0) {
+                                listSFilter.add(SFilter.not(SFilter.inList("id", listId)))
+                            }
+                            if (!request.zoneType.isNullOrEmpty()){
+                                listSFilter.add(SFilter.eq("objectType",request.zoneType!!))
+                            }else if (!request.zoneTypeList.isNullOrEmpty()){
+                                listSFilter.add(SFilter.inList("objectType",request.zoneTypeList!!))
+                            }
+                           val pageQuery = pageQuery(request, listSFilter)
+                    spaceSQueryResponse.message = pageQuery.message
+                    spaceSQueryResponse.total = pageQuery.total
+                    spaceSQueryResponse.result = pageQuery.result
+                    spaceSQueryResponse.pageNumber = pageQuery.pageNumber
+                    spaceSQueryResponse.pageSize = pageQuery.pageSize
+                    spaceSQueryResponse.content = pageQuery.content
+                    spaceSQueryResponse
+                }else{
+                    logger.debug("未明确建筑3****************************************************************************")
+                        var listSFilter = ArrayList<SFilter>()
+                        listSFilter.add(SFilter.eq("projectId",projectId!!))
+                    if (!request.zoneType.isNullOrEmpty()){
+                        listSFilter.add(SFilter.eq("objectType",request.zoneType!!))
+                    }else if (!request.zoneTypeList.isNullOrEmpty()){
+                        listSFilter.add(SFilter.inList("objectType",request.zoneTypeList!!))
+                    }
+                      val  pageQuery = pageQuery(request, listSFilter)
+                    spaceSQueryResponse.message = pageQuery.message
+                    spaceSQueryResponse.total = pageQuery.total
+                    spaceSQueryResponse.result = pageQuery.result
+                    spaceSQueryResponse.pageNumber = pageQuery.pageNumber
+                    spaceSQueryResponse.pageSize = pageQuery.pageSize
+                    spaceSQueryResponse.content = pageQuery.content
+                }
+
+            }else if (request.buildingId.isNullOrEmpty()&&request.floorId.isNullOrEmpty()){
+                var listSFilter = ArrayList<SFilter>()
+                listSFilter.add(SFilter.eq("projectId",projectId!!))
+                if (!request.zoneType.isNullOrEmpty()){
+                    listSFilter.add(SFilter.eq("objectType",request.zoneType!!))
+                }else if (!request.zoneTypeList.isNullOrEmpty()){
+                    listSFilter.add(SFilter.inList("objectType",request.zoneTypeList!!))
+                }
+              val   pageQuery = pageQuery(request, listSFilter)
+                spaceSQueryResponse.message = pageQuery.message
+                spaceSQueryResponse.total = pageQuery.total
+                spaceSQueryResponse.result = pageQuery.result
+                spaceSQueryResponse.pageNumber = pageQuery.pageNumber
+                spaceSQueryResponse.pageSize = pageQuery.pageSize
+                spaceSQueryResponse.content = pageQuery.content
+            }
+
+            if (spaceSQueryResponse.content.isNullOrEmpty()){
+                spaceSQueryResponse.content = ArrayList<ZoneSpace>()
+            }
+
+            spaceSQueryResponse.zoneType = request.zoneType
+            spaceSQueryResponse.floorId = request.floorId
+            return spaceSQueryResponse
+        } catch (e: Exception) {
+            e.printStackTrace()
+            val spaceSQueryResponse = SpaceSQueryResponse()
+            spaceSQueryResponse.result = SResponseType.failure
+            spaceSQueryResponse.message = e.message.toString()
+            return spaceSQueryResponse
+        }
+    } // Fun
+
+    /**
+     * 查询业务空间的建筑楼层数量
+     */
+    fun spBuildingFloor(): SQueryResponse<Building>{
+       return try {
+            /** 项目id */
+            val projectId = SPageContext.getHeader("ProjectId")
+
+            val buildingList = BuildingService.select(SFilter.eq("projectId", projectId!!)).order("localName").exec()
+            if (buildingList.size>0){
+                for (building in buildingList){
+
+                   val floorList = FloorService.select(SFilter.eq("projectId", projectId!!),SFilter.eq("buildId", building.id!!)).order("sequenceId desc").exec()
+                    if (floorList.size>0){
+                        building .floor = floorList
+                    }
+                }
+
+                for (building in buildingList){
+
+                   if (building.floor!=null&&building.floor!!.size>0){
+                       for (floor in building.floor!!){
+
+                           val rSpInFlList = RSpInFlService.select(SFilter.eq("projectId", projectId!!),SFilter.eq("floorId", floor.id!!)).exec()
+                           if (rSpInFlList.size>0){
+                               val setId = HashSet<String>()
+                               for (rSpInFl in rSpInFlList){
+                                   setId.add(rSpInFl.spaceId!!)
+                               }
+                               val spaceList = select(SFilter.eq("projectId", projectId!!), SFilter.inList("id", setId.toList()), SFilter.eq("state", 1)).exec()
+                               floor.count = spaceList.size
+                           }
+                       }
+                   }
+                }
+
+            }
+            val sQueryResponse = SQueryResponse<Building>(SResponseType.success)
+            sQueryResponse.content=buildingList
+            sQueryResponse.total = buildingList.size.toLong()
+           sQueryResponse
+        } catch (e: Exception) {
+            e.printStackTrace()
+           SQueryResponse<Building>(SResponseType.failure,e.message.toString())
+        }
+    }
+
+    /**
+     * 查询业务空间所有类型
+     */
+    fun zoneTypequery(request: DCSQueryRequest):SQueryResponse<DictSpaceProject> {
+        try {
+            /** 项目id */
+            val projectId = SPageContext.getHeader("ProjectId")
+
+            val dictSpaceType = dictSpaceProjectService.select(SFilter.eq("projectId", projectId!!)).exec()
+            if (dictSpaceType.size < 1) {
+                val dClassDefList = DClassDefService.select(SFilter.eq("parentId", "Space"), SFilter.not(SFilter.eq("id", "Ispace"))).exec()
+                if (dClassDefList.size > 0) {
+                    for (dClassDef in dClassDefList) {
+                        val dictSpaceProject = DictSpaceProject()
+                        dictSpaceProject.projectId = projectId
+                        dictSpaceProject.id = dClassDef.id
+                        dictSpaceProject.name = dClassDef.name
+                        dictSpaceProject.parentId = dClassDef.parentId
+                        dictSpaceProject.sign = 1
+                        dictSpaceProjectService.replace(dictSpaceProject)
+                    }
+//                    val dictSpaceProject = DictSpaceProject()
+//                    dictSpaceProject.projectId = projectId
+//                    dictSpaceProject.id = "OtherZone"
+//                    dictSpaceProject.name = "其它"
+//                    dictSpaceProject.parentId = "Space"
+//                    dictSpaceProject.sign = 1
+//                    dictSpaceProjectService.replace(dictSpaceProject)
+                }
+            }
+
+            if (request.floorId.isNullOrEmpty()) {
+                val pageQuery = dictSpaceProjectService.pageQuery(request, arrayListOf(SFilter.eq("projectId", projectId!!), SFilter.eq("parentId","Space")))
+                return pageQuery
+            } else {
+                val pageQuery = dictSpaceProjectService.pageQuery(request, arrayListOf(SFilter.eq("projectId", projectId!!), SFilter.eq("parentId","Space")))
+                val contentList = pageQuery.content
+                if (contentList != null && contentList.size > 0) {
+
+                    for (content in contentList) {
+                        if (content.name == "其它") {
+                            if (content.zoneType != null && content.zoneType!!.size > 0) {
+                                for (type in content.zoneType!!) {
+                                    val rSpInFlList = RSpInFlService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("floorId", request.floorId!!), SFilter.eq("objectType", type.id!!)).exec()
+                                    if (rSpInFlList.size > 0) {
+                                        val idSet = ArrayList<String>()
+                                        for (rSpInFl in rSpInFlList) {
+                                            idSet.add(rSpInFl.spaceId!!)
+                                        }
+                                        val zoneSpaceBaseList = ZoneSpaceBaseService.select(SFilter.eq("projectId", projectId), SFilter.inList("id", idSet.toList()), SFilter.eq("state", 1)).exec()
+                                        if (zoneSpaceBaseList.size > 0) {
+                                            type.count = zoneSpaceBaseList.size
+                                        }
+                                    }
+                                }
+                            }
+                        } else {
+                            val rSpInFlList = RSpInFlService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("floorId", request.floorId!!), SFilter.eq("objectType", content.id!!)).exec()
+                            if (rSpInFlList.size > 0) {
+                                val idSet = ArrayList<String>()
+                                for (rSpInFl in rSpInFlList) {
+                                    idSet.add(rSpInFl.spaceId!!)
+                                }
+                                val zoneSpaceBaseList = ZoneSpaceBaseService.select(SFilter.eq("projectId", projectId), SFilter.inList("id", idSet.toList()), SFilter.eq("state", 1)).exec()
+                                if (zoneSpaceBaseList.size > 0) {
+                                    content.count = zoneSpaceBaseList.size
+                                }
+                            }
+                        }
+                    }
+                }
+                return pageQuery
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SQueryResponse<DictSpaceProject>(SResponseType.failure,e.message.toString())
+        }
+    } // Fun
+
+
+    override fun onCreateBefore(entity: ZoneSpace): Boolean {
+        if (entity.objectType.isNullOrEmpty()){
+            return false
+        }
+
+        val projectId = SPageContext.getHeader("ProjectId")
+        /** id */
+        if (!entity.id.isNullOrEmpty()) {
+            val isWith = entity.id!!.startsWith("Sp")
+            if (!isWith) {
+                entity.id = IdUtils.spaceIdCreate(projectId!!)
+            }
+        } else {
+            entity.id = IdUtils.spaceIdCreate(projectId!!)
+        }
+        entity.projectId = projectId
+        /** 空间名字 */
+        if (entity.name.isNullOrEmpty()) {
+            entity.name = ShaftNameUtil.shaftName("空间-")
+        }
+        try {
+            if (entity.height==null||entity.height ==0.0){
+                if (!entity.floorId.isNullOrEmpty()){
+                    val entity1 = FloorService.select(SFilter.eq("id", entity.floorId!!)).entity()
+                    if (entity1!=null){
+                        if (!entity1.structureInfo.isNullOrEmpty()){
+                            val containsKey = entity1.structureInfo!!.containsKey("Height")
+                            if (containsKey){
+                                entity.height = entity1.structureInfo!!["Height"].toString()!!.toDouble()
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return true
+    }
+
+    override fun onCreateSuccess(entityList: ArrayList<ZoneSpace>) {
+        super.onCreateSuccess(entityList)
+        for (zoneSpace in entityList) {
+            ObjInfoService.createInfo(zoneSpace,true,"Sp",zoneSpace.objectType!!)
+        }
+        val projectId = SPageContext.getHeader("ProjectId")
+        try {
+            for (space in entityList){
+                if (!space.buildingId.isNullOrEmpty()&&!space.floorId.isNullOrEmpty()){
+                    val rSpinBd = RSpinBd()
+                    rSpinBd.buildingId = space.buildingId
+                    rSpinBd.objectType = space.objectType
+                    rSpinBd.projectId = space.projectId
+                    rSpinBd.spaceId = space.id
+                    rSpinBd.sign = 1
+                    RSpInBdService.insert(rSpinBd)
+                    val rSpinFl = RSpinFl()
+                    rSpinFl.buildingId = space.buildingId
+                    rSpinFl.floorId = space.floorId
+                    rSpinFl.projectId = space.projectId
+                    rSpinFl.objectType = space.objectType
+                    rSpinFl.spaceId = space.id
+                    rSpinFl.sign = 1
+                    RSpInFlService.insert(rSpinFl)
+                }else if (!space.buildingId.isNullOrEmpty()&&space.floorId.isNullOrEmpty()){
+                    val rSpinBd = RSpinBd()
+                    rSpinBd.buildingId = space.buildingId
+                    rSpinBd.objectType = space.objectType
+                    rSpinBd.projectId = space.projectId
+                    rSpinBd.spaceId = space.id
+                    rSpinBd.sign = 1
+                    RSpInBdService.insert(rSpinBd)
+                }
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+
+        try {
+            /** 处理关系标记 */
+            val listtype = ArrayList<String>()
+//            listtype.add("sp2sp_SpaceNeighborhood_1")
+//            listtype.add("sp2sp_SpaceNeighborhood_2")
+//            listtype.add("sp2sp_SpaceNeighborhood_3")
+//            listtype.add("sp2sp_SpaceNeighborhood_4")
+            listtype.add("sp2sp_SpaceNeighborhood_5")
+            listtype.add("sp2sp_TrafficNetwork_1")
+//            listtype.add("sp2sp_TrafficNetwork_2")
+//            listtype.add("sp2sp_TrafficNetwork_3")
+            listtype.add("sp2sp_ConvectionNetwork_1")
+            listtype.add("sp2sp_ConvectionNetwork_2")
+            listtype.add("sp2sp_ConvectionNetwork_3")
+            listtype.add("sp2sp_RadiationNetwork_1")
+            listtype.add("sp2sp_RadiationNetwork_2")
+            for (type in listtype){
+                val entity = relationTypeProjectservice.select(SFilter.eq("projectId", projectId!!), SFilter.eq("relationType", type)).entity()
+                if (entity!=null){
+                    entity.computationalState = 2
+                    relationTypeProjectservice.update(entity)
+                }
+            }
+            val zoneSpace = entityList[0]
+
+            val relationType = relationTypeProjectservice.select(SFilter.eq("projectId", projectId!!), SFilter.eq("relationType", "eq2sp_in"),SFilter.eq("zoneType", zoneSpace.objectType!!)).entity()
+            if (relationType!=null){
+                    relationType.computationalState = 2
+                    relationTypeProjectservice.update(relationType)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+    override fun onUpdateBefore(entity: ZoneSpace): Boolean {
+
+        val list = ArrayList<String>()
+        list.add("id")
+        list.add("name")
+        ZoneSpaceBaseService.update(entity,list)
+
+        return !entity.objectType.isNullOrEmpty()
+    }
+
+    override fun onUpdateSuccess(entityList: ArrayList<ZoneSpace>) {
+        super.onUpdateSuccess(entityList)
+        for (zoneSpace in entityList) {
+            ObjInfoService.createInfo(zoneSpace,false,"Sp",zoneSpace.objectType!!)
+        }
+
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val comming = SPageContext.getHeader("comming")
+            val account = SPageContext.getHeader("Account")
+            for (entity in entityList){
+                try {
+                    if (!comming.isNullOrEmpty()){
+                        if (comming == "app"){
+                            val user = LocationPointServices.userService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("phone", account!!)).entity()
+                            val userLog = UserLog()
+                            userLog.comming = "app"
+                            userLog.action = "更新空间"
+                            userLog.id = IdUtils.uuidCreate()
+                            userLog.note = "项目ID: "+projectId+" 用户ID:"+user!!.id+" 手机号:"+ account+" 请求来源:"+comming+ " "+entity.toJson()
+                            userLog.phone = account
+                            userLog.projectId = projectId
+                            userLog.userId = user!!.id
+                            userLog.name = user.name
+                            userLog.objectId = entity.id
+                            LocationPointServices.userLogService.insert(userLog)
+                        }
+                    }
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+
+    /**
+     * 修改空间对象的楼层建筑信息
+     *
+     * @param   upDataFloorAndBuildingRequestsList
+     *
+     */
+    fun upDataFloorORBuilding(upDataFloorAndBuildingRequestsList :ArrayList<UpDataFloorAndBuildingRequests>): SBaseResponse {
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+
+            if (upDataFloorAndBuildingRequestsList.isNullOrEmpty()) {
+                val sBaseResponse = SBaseResponse(SResponseType.failure)
+                sBaseResponse.message = "不可以传入空数据"
+                return sBaseResponse
+            }
+            for (upDataFloorAndBuildingRequests in upDataFloorAndBuildingRequestsList) {
+
+                val spaceId = upDataFloorAndBuildingRequests.spaceId
+                val id = upDataFloorAndBuildingRequests.id
+                val type = upDataFloorAndBuildingRequests.type
+
+                try {
+                    if (!id.isNullOrEmpty()) {
+                        if (id.startsWith("Fl")) {
+                            val floor = FloorService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("FloorID", id)).entity()
+
+                            if (floor!=null){
+                                /** 清除空间和建筑楼层的的数据 */
+                                RSpInBdService.delete(SFilter.eq("projectId",projectId!!),SFilter.eq("spaceId",spaceId!!))
+                                RSpInFlService.delete(SFilter.eq("projectId",projectId!!),SFilter.eq("spaceId",spaceId!!))
+                                val rSpinFl = RSpinFl()
+                                rSpinFl.floorId = floor.id
+                                rSpinFl.projectId = projectId
+                                rSpinFl.spaceId = spaceId
+                                rSpinFl.objectType = type
+                                rSpinFl.sign = 1
+                                RSpInFlService.replace(rSpinFl)
+
+                                val rSpinBd = RSpinBd()
+                                rSpinBd.objectType = type
+                                rSpinBd.buildingId = floor.buildId
+                                rSpinBd.spaceId = spaceId
+                                rSpinBd.sign = 1
+                                rSpinBd.projectId = projectId
+                                RSpInBdService.replace(rSpinBd)
+                            }
+
+                        } else if (id.startsWith("Bd")) {
+                            /** 清除空间和建筑楼层的的数据 */
+                            RSpInBdService.delete(SFilter.eq("projectId",projectId!!),SFilter.eq("spaceId",spaceId!!))
+                            RSpInFlService.delete(SFilter.eq("projectId",projectId!!),SFilter.eq("spaceId",spaceId!!))
+                            val rSpinBd = RSpinBd()
+                            rSpinBd.objectType = type
+                            rSpinBd.buildingId = id
+                            rSpinBd.spaceId = spaceId
+                            rSpinBd.sign = 1
+                            rSpinBd.projectId = projectId
+                            RSpInBdService.replace(rSpinBd)
+                        }
+                    } else {
+                        /** 清除空间和建筑楼层的的数据 */
+                        RSpInBdService.delete(SFilter.eq("projectId",projectId!!),SFilter.eq("spaceId",spaceId!!))
+                        RSpInFlService.delete(SFilter.eq("projectId",projectId!!),SFilter.eq("spaceId",spaceId!!))
+                    }
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+                val zoneSpace = ZoneSpace()
+                zoneSpace.id = spaceId
+                if (!id.isNullOrEmpty()) {
+                    if (id.startsWith("Fl")) {
+                        zoneSpace.floorId = id
+                        val floor = FloorService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("FloorID", id)).entity()
+                        zoneSpace.buildingId = floor?.buildId
+                        val list = ArrayList<String>()
+                        list.add("FloorId")
+                        list.add("BuildingId")
+                       update(zoneSpace, list)
+                    } else if (id.startsWith("Bd")) {
+                        val list = ArrayList<String>()
+                        list.add("FloorId")
+                        list.add("BuildingId")
+                        zoneSpace.buildingId = id
+                        zoneSpace.floorId = null
+                        update(zoneSpace, list)
+                    }
+                } else {
+                    /** 清空建筑楼层 */
+                    val list = ArrayList<String>()
+                    list.add("FloorId")
+                    list.add("BuildingId")
+                    zoneSpace.buildingId = null
+                    zoneSpace.floorId = null
+                    update(zoneSpace, list)
+                }
+                if (type == "AirConditioningZone"||type == "CleanZone"||type == "DomesticWaterSupplyZone"
+                        ||type == "FireZone"||type == "FunctionZone"||type == "GeneralZone"
+                        ||type == "HeatingZone"||type == "LightingZone"||type == "NetworkZone"
+                        ||type == "PowerSupplyZone"||type == "SecurityZone"||type == "TenantZone" ){
+                    /** 发送消息 */
+                    sendMessages(projectId!!, spaceId!!, id)
+                }
+            }
+            return SBaseResponse(SResponseType.success)
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure)
+        }
+
+    } // Function upDataFloorORBuilding
+
+    /**
+     * 发送消息
+     *
+     * @param   projectId   项目id
+     * @param   spaceId     业务空间id
+     * @param   id          楼层或建筑id
+     */
+    fun sendMessages(projectId: String, spaceId: String,id: String?){
+        try {
+            val jsonObject = JSONObject()
+            jsonObject.put("type", "20")
+            jsonObject.put("projectId", projectId)
+            jsonObject.put("id", spaceId)
+            jsonObject.put("linkId",id)
+            /** 发送消息 */
+            messageHandler.sendMessage(jsonObject.toString())
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    } // Function sendMessages
+
+    fun upDateOutline(request: SUpdateRequest<ZoneSpace>): SBaseResponse{
+        val projectId = SPageContext.getHeader("ProjectId")
+        if (!request.projection.isNullOrEmpty()){
+            request.projection!!.clear()
+        }
+        val list = ArrayList<String>()
+        list.add("Outline")
+        request.projection = list
+        val zoneSpace = request.content!![0]
+        val updateList = ZoneSpaceBaseService.updateList(request)
+
+        try {
+            /** 处理关系标记 */
+            val listtype = ArrayList<String>()
+//            listtype.add("sp2sp_SpaceNeighborhood_1")
+//            listtype.add("sp2sp_SpaceNeighborhood_2")
+//            listtype.add("sp2sp_SpaceNeighborhood_3")
+//            listtype.add("sp2sp_SpaceNeighborhood_4")
+            listtype.add("sp2sp_SpaceNeighborhood_5")
+//            listtype.add("sp2sp_TrafficNetwork_1")
+//            listtype.add("sp2sp_TrafficNetwork_2")
+            listtype.add("sp2sp_TrafficNetwork_3")
+            listtype.add("sp2sp_ConvectionNetwork_1")
+            listtype.add("sp2sp_ConvectionNetwork_2")
+            listtype.add("sp2sp_ConvectionNetwork_3")
+            listtype.add("sp2sp_RadiationNetwork_1")
+            listtype.add("sp2sp_RadiationNetwork_2")
+            for (type in listtype){
+                val entity = relationTypeProjectservice.select(SFilter.eq("projectId", projectId!!), SFilter.eq("relationType", type)).entity()
+                if (entity!=null){
+                    entity.computationalState = 2
+                    relationTypeProjectservice.update(entity)
+                }
+            }
+            val relationType = relationTypeProjectservice.select(SFilter.eq("projectId", projectId!!), SFilter.eq("relationType", "eq2sp_in"),SFilter.eq("zoneType", zoneSpace.objectType!!)).entity()
+            if (relationType!=null){
+                    relationType.computationalState = 2
+                    relationTypeProjectservice.update(relationType)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return updateList
+    }
+
+    /**
+     * @Description:删除成功之后
+     */
+    override fun onDeleteSuccess(entityList: ArrayList<ZoneSpace>) {
+        super.onDeleteSuccess(entityList)
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (entity in entityList) {
+                ObjInfoService.delete(SFilter.eq("projectId",projectId!!), SFilter.eq("objId",entity.id!!), SFilter.eq("objType","Sp"))
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+} // Object ZoneSpaceBaseService

+ 34 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/REq2SpService.kt

@@ -0,0 +1,34 @@
+package com.persagy.server.services.rel
+
+import cn.sagacloud.server.synchronize.MessageHandler
+import com.persagy.server.datacenter.models.entities.rel.REq2Sp
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.utils.SSpringContextUtil
+import org.json.JSONObject
+
+object REq2SpService: SObjectService<REq2Sp>(SMybatisDao(REq2Sp::class.java)) {
+
+    /** MQ消息对象 */
+    val messageHandler by lazy {
+        SSpringContextUtil.getBean(MessageHandler::class.java) as MessageHandler
+    }
+
+    override fun onDeleteSuccess(rEqInSpZoneLightingList: ArrayList<REq2Sp>) {
+        val projectId = SPageContext.getHeader("ProjectId")
+        for(rEqInSpZoneLighting in rEqInSpZoneLightingList){
+            val jsonObject = JSONObject()
+            jsonObject.put("type", "12")
+            jsonObject.put("projectId", projectId)
+            jsonObject.put("id", rEqInSpZoneLighting.id2)
+            jsonObject.put("obj_type", "EquipinSpace")
+            jsonObject.put("linkId",rEqInSpZoneLighting.id1)
+
+            /** 发送消息 */
+            messageHandler.sendMessage(jsonObject.toString())
+//            kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "EquipinSpace", "12", IdUtils.uuidCreate(), rEqInSpZoneLighting.spaceId!!, rEqInSpZoneLighting.equipId),false)
+        }
+    } // Fun onDeleteSuccess
+
+} //  Object REq2SpService

+ 189 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/REqForBdService.kt

@@ -0,0 +1,189 @@
+package com.persagy.server.services.rel
+
+import com.persagy.server.services.base.RService
+import com.persagy.server.datacenter.models.entities.rel.RBdForEqList
+import com.persagy.server.datacenter.models.entities.rel.REqForBd
+import com.persagy.server.datacenter.models.entities.rel.REqForBdList
+import com.sybotan.base.extensions.toJson
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import org.json.JSONObject
+
+/**
+ * 设备服务于建筑关系服务
+ *
+ * @author 张维新
+ */
+object REqForBdService: RService<REqForBd>(SMybatisDao(REqForBd::class.java)) {
+
+
+    /**
+     * 创建设备服务于建筑关系
+     *
+     * @param   rEqForBd    设备服务于建筑关系对象
+     */
+    fun create(rEqForBd: REqForBd): SCreateResponse<REqForBd> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            rEqForBd.projectId = projectId
+            val isInsert = insert(rEqForBd)
+            if (isInsert){
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "11")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rEqForBd.equipId)
+                jsonObject.put("obj_type", "Eq2Bd")
+                jsonObject.put("linkId",rEqForBd.buildingId)
+
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+
+                SCreateResponse(SResponseType.success)
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e: Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } //Function create()
+
+    /**
+     * 根据对象删除
+     *
+     * @param    rEqForBd     关系对象实例
+     * @return
+     */
+    fun deletes(rEqForBd: REqForBd): SBaseResponse {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val isDelete = delete(rEqForBd)
+            /** 删除成功 */
+            if (isDelete) {
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "12")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rEqForBd.equipId)
+                jsonObject.put("obj_type", "Eq2Bd")
+                jsonObject.put("linkId",rEqForBd.buildingId)
+
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+
+                val sBaseResponse = SBaseResponse(SResponseType.success)
+                sBaseResponse.message = rEqForBd.toJson()
+                sBaseResponse
+            } else {
+                SBaseResponse(SResponseType.failure)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function deletes()
+
+    /**
+     * 创建设备服务于建筑关系
+     *
+     * @param    rEqForBdList     设备和建筑关系的对象列表
+     */
+    fun createEq(rEqForBdList: REqForBdList): SCreateResponse<REqForBd> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            delete("equipID = '${rEqForBdList.equipId}'")
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (buildingId in rEqForBdList.buildingIdList!!){
+                val rEqForBd = REqForBd()
+                rEqForBd.equipId = rEqForBdList.equipId
+                rEqForBd.buildingId = buildingId
+                rEqForBd.projectId = projectId
+                val replace = replace(rEqForBd)
+                if (replace){
+                    successList.add(rEqForBd)
+                }else{
+                    failureList.add(rEqForBd)
+                }
+            }
+            if (successList.size>0){
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "13")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rEqForBdList.equipId)
+                jsonObject.put("obj_type", "Eq2Bd")
+                jsonObject.put("linkId",successList.toJson())
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+
+                val sCreateResponse = SCreateResponse<REqForBd>(SResponseType.success)
+                if (failureList.size>0){
+                    sCreateResponse.message ="失败对象:"+failureList.toJson()
+                }
+                sCreateResponse
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createEq()
+
+    /**
+     * 创建服务于建筑的设备关系
+     *
+     * @param    rEqForBdList    设备和建筑关系的对象列表
+     */
+    fun createsBd(rEqForBdList: RBdForEqList): SCreateResponse<REqForBd> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            delete("buildingID = '${rEqForBdList.buildingId}'")
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (equipId in rEqForBdList.equipIdList!!){
+                val rEqForBd = REqForBd()
+                rEqForBd.buildingId = rEqForBdList.buildingId
+                rEqForBd.equipId = equipId
+                rEqForBd.projectId = projectId
+                val replace = replace(rEqForBd)
+                if (replace){
+                    successList.add(rEqForBd)
+                }else{
+                    failureList.add(rEqForBd)
+                }
+            }
+            if (successList.size>0){
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "13")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rEqForBdList.buildingId)
+                jsonObject.put("obj_type", "Eq2Bd")
+                jsonObject.put("linkId",successList.toJson())
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+
+                if (failureList.size>0){
+                    val sCreateResponse = SCreateResponse<REqForBd>(SResponseType.success)
+                    sCreateResponse.message ="失败对象:"+failureList.toJson()
+                    sCreateResponse
+                }else{
+                    val sCreateResponse = SCreateResponse<REqForBd>(SResponseType.success)
+                    sCreateResponse
+                }
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e:Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createsBd()
+
+} // Class REqForBdService

+ 187 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/REqForFlService.kt

@@ -0,0 +1,187 @@
+package com.persagy.server.services.rel
+
+import com.persagy.server.datacenter.models.entities.rel.REqForFl
+import com.persagy.server.datacenter.models.entities.rel.REqForFlList
+import com.persagy.server.datacenter.models.entities.rel.RFlForEqList
+import com.persagy.server.services.base.RService
+import com.sybotan.base.extensions.toJson
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import org.json.JSONObject
+
+/**
+ * 设备服务于楼层关系服务
+ *
+ * @author 付国宝
+ */
+object REqForFlService: RService<REqForFl>(SMybatisDao(REqForFl::class.java)) {
+
+    /**
+     * 创建设备服务于楼层关系
+     *
+     * @param    rEqForFl      设备服务于楼层关系对象
+     */
+    fun create(rEqForFl: REqForFl): SCreateResponse<REqForFl> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            rEqForFl.projectId = projectId
+            val isInsert = insert(rEqForFl)
+            if (isInsert){
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "11")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rEqForFl.equipId)
+                jsonObject.put("obj_type", "Eq2Fl")
+                jsonObject.put("linkId",rEqForFl.floorId)
+
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+
+                SCreateResponse(SResponseType.success)
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e: Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } //Function create()
+
+    /**
+     * 根据对象删除
+     *
+     * @param    rEqForFl     关系对象实例
+     */
+    fun deletes(rEqForFl: REqForFl): SBaseResponse {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val isDelete = delete(rEqForFl)
+            /** 删除成功 */
+            if (isDelete) {
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "12")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rEqForFl.equipId)
+                jsonObject.put("obj_type", "Eq2Fl")
+                jsonObject.put("linkId",rEqForFl.floorId)
+
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+
+                val sBaseResponse = SBaseResponse(SResponseType.success)
+                sBaseResponse.message = rEqForFl.toJson()
+                sBaseResponse
+            } else {
+                SBaseResponse(SResponseType.failure)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function deletes()
+
+    /**
+     * 创建设备服务于楼层关系
+     *
+     * @param   rEqForFlList    设备和楼层关系的对象列表
+     */
+    fun createEq(rEqForFlList: REqForFlList): SCreateResponse<REqForFl> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            delete("equipId = '${rEqForFlList.equipId}'")
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (floorId in rEqForFlList.floorIdList!!){
+                val rEqForFl = REqForFl()
+                rEqForFl.equipId = rEqForFlList.equipId
+                rEqForFl.floorId = floorId
+                rEqForFl.projectId = projectId
+                val replace = replace(rEqForFl)
+                if (replace){
+                    successList.add(rEqForFl)
+                }else{
+                    failureList.add(rEqForFl)
+                }
+            }
+            if (successList.size>0){
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "13")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rEqForFlList.equipId)
+                jsonObject.put("obj_type", "Eq2Fl")
+                jsonObject.put("linkId",successList.toJson())
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+                
+                val sCreateResponse = SCreateResponse<REqForFl>(SResponseType.success)
+                if (failureList.size>0){
+                    sCreateResponse.message ="失败对象:"+failureList.toJson()
+                }
+                sCreateResponse
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createEq()
+
+    /**
+     * 创建服务于楼层的设备关系
+     *
+     * @param    rEqForFlList     设备和楼层关系的对象列表
+     */
+    fun createsFl(rEqForFlList: RFlForEqList): SCreateResponse<REqForFl> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            delete("floorID = '${rEqForFlList.floorId}'")
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (equipId in rEqForFlList.equipIdList!!){
+                val rEqForFl = REqForFl()
+                rEqForFl.floorId = rEqForFlList.floorId
+                rEqForFl.equipId = equipId
+                rEqForFl.projectId = projectId
+                val replace = replace(rEqForFl)
+                if (replace){
+                    successList.add(rEqForFl)
+                }else{
+                    failureList.add(rEqForFl)
+                }
+            }
+            if (successList.size>0){
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "13")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rEqForFlList.floorId)
+                jsonObject.put("obj_type", "Eq2Fl")
+                jsonObject.put("linkId",successList.toJson())
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+
+                if (failureList.size>0){
+                    val sCreateResponse = SCreateResponse<REqForFl>(SResponseType.success)
+                    sCreateResponse.message ="失败对象:"+failureList.toJson()
+                    sCreateResponse
+                }else{
+                    val sCreateResponse = SCreateResponse<REqForFl>(SResponseType.success)
+                    sCreateResponse
+                }
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e:Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createsFl()
+
+} // Object REqForFlService

+ 187 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/REqForShService.kt

@@ -0,0 +1,187 @@
+package com.persagy.server.services.rel
+
+import com.persagy.server.datacenter.models.entities.rel.REqForSh
+import com.persagy.server.datacenter.models.entities.rel.REqForShList
+import com.persagy.server.datacenter.models.entities.rel.RShForEqList
+import com.persagy.server.services.base.RService
+import com.sybotan.base.extensions.toJson
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import org.json.JSONObject
+
+/**
+ * 设备服务于竖井关系服务
+ *
+ * @author 付国宝
+ */
+object REqForShService: RService<REqForSh>(SMybatisDao(REqForSh::class.java)) {
+
+    /**
+     * 创建设备服务于竖井关系
+     *
+     * @param     rEqForSh     设备服务于竖井关系对象
+     */
+    fun create(rEqForSh: REqForSh): SCreateResponse<REqForSh> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            rEqForSh.projectId = projectId
+            val isInsert = insert(rEqForSh)
+            if (isInsert){
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "11")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rEqForSh.equipId)
+                jsonObject.put("obj_type", "Eq2Sh")
+                jsonObject.put("linkId",rEqForSh.shaftId)
+
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+//                kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "Eq2Sh", "11", IdUtils.uuidCreate(), rEqForSh.equipId!!,rEqForSh.shaftId!!),false)
+                SCreateResponse(SResponseType.success)
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e: Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } //Function create()
+
+    /**
+     * 根据对象删除
+     *
+     * @param     rEqForSh     关系对象实例
+     */
+    fun deletes(rEqForSh: REqForSh): SBaseResponse {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val isDelete = delete(rEqForSh)
+            /** 删除成功 */
+            if (isDelete) {
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "12")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rEqForSh.equipId)
+                jsonObject.put("obj_type", "Eq2Sh")
+                jsonObject.put("linkId",rEqForSh.shaftId)
+
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+//                kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "Eq2Sh", "12", IdUtils.uuidCreate(), rEqForSh.equipId!!,rEqForSh.shaftId!!),false)
+                val sBaseResponse = SBaseResponse(SResponseType.success)
+                sBaseResponse.message = rEqForSh.toJson()
+                sBaseResponse
+            } else {
+                SBaseResponse(SResponseType.failure)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function deletes()
+
+    /**
+     * 创建设备服务于竖井关系
+     *
+     * @param    rEqForShList    设备和竖井关系的对象列表
+     */
+    fun createEq(rEqForShList: REqForShList): SCreateResponse<REqForSh> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            delete("equipId = '${rEqForShList.equipId}'")
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (shaftId in rEqForShList.shaftIdList!!){
+                val rEqForSh = REqForSh()
+                rEqForSh.equipId = rEqForShList.equipId
+                rEqForSh.shaftId = shaftId
+                rEqForSh.projectId = projectId
+                val replace = replace(rEqForSh)
+                if (replace){
+                    successList.add(rEqForSh)
+                }else{
+                    failureList.add(rEqForSh)
+                }
+            }
+            if (successList.size>0){
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "13")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rEqForShList.equipId)
+                jsonObject.put("obj_type", "Eq2Sh")
+                jsonObject.put("linkId",successList.toJson())
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+//                kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "Eq2Sh", "13", IdUtils.uuidCreate(), rEqForShList.equipId!!,null),false)
+                val sCreateResponse = SCreateResponse<REqForSh>(SResponseType.success)
+                if (failureList.size>0){
+                    sCreateResponse.message ="失败对象:"+failureList.toJson()
+                }
+                sCreateResponse
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createEq()
+
+    /**
+     * 创建服务于竖井的设备关系
+     *
+     * @param    rEqForShList    设备和竖井关系的对象列表
+     */
+    fun createsSh(rEqForShList: RShForEqList): SCreateResponse<REqForSh> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            delete("shaftID = '${rEqForShList.shaftId}'")
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (equipId in rEqForShList.equipIdList!!){
+                val rEqForSh = REqForSh()
+                rEqForSh.shaftId = rEqForShList.shaftId
+                rEqForSh.equipId = equipId
+                rEqForSh.projectId = projectId
+                val replace = replace(rEqForSh)
+                if (replace){
+                    successList.add(rEqForSh)
+                }else{
+                    failureList.add(rEqForSh)
+                }
+            }
+            if (successList.size>0){
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "13")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rEqForShList.shaftId)
+                jsonObject.put("obj_type", "Eq2Sh")
+                jsonObject.put("linkId",successList.toJson())
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+//                kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "Eq2Sh", "13", IdUtils.uuidCreate(), rEqForShList.shaftId!!,null),false)
+                if (failureList.size>0){
+                    val sCreateResponse = SCreateResponse<REqForSh>(SResponseType.success)
+                    sCreateResponse.message ="失败对象:"+failureList.toJson()
+                    sCreateResponse
+                }else{
+                    val sCreateResponse = SCreateResponse<REqForSh>(SResponseType.success)
+                    sCreateResponse
+                }
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e:Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createsSh()
+
+} // Object REqForShService

+ 246 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/REqInShService.kt

@@ -0,0 +1,246 @@
+package com.persagy.server.services.rel
+
+import com.persagy.server.services.base.RService
+import com.persagy.server.datacenter.models.entities.rel.REqInSh
+import com.persagy.server.datacenter.models.entities.rel.REqInShList
+import com.persagy.server.datacenter.models.entities.rel.RShInEqList
+import com.sybotan.base.extensions.toJson
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import org.json.JSONObject
+
+/**
+ * 设备所在竖井关系服务
+ *
+ * @author 付国宝
+ */
+object REqInShService: RService<REqInSh>(SMybatisDao(REqInSh::class.java)) {
+
+    /**
+     * 创建设备所在竖井关系
+     *
+     * @param    rEqInSh     设备所在竖井关系对象
+     */
+    fun create(rEqInSh: REqInSh): SCreateResponse<REqInSh>{
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            rEqInSh.projectId = projectId
+            val isInsert = insert(rEqInSh)
+            if (isInsert){
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "11")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rEqInSh.equipId)
+                jsonObject.put("obj_type", "EquipinShaft")
+                jsonObject.put("linkId",rEqInSh.shaftId)
+
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+//                kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "EquipinShaft", "11", IdUtils.uuidCreate(),  rEqInSh.equipId!!,
+//                        rEqInSh.shaftId!!),false)
+
+
+                SCreateResponse(SResponseType.success)
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e: Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function create()
+
+    /**
+     * 根据对象删除
+     *
+     * @param     rEqInSh      关系对象实例
+     * @return
+     */
+    fun deletes(rEqInSh: REqInSh): SBaseResponse{
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val isDelete = delete(rEqInSh)
+            /** 删除成功 */
+            if (isDelete) {
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "12")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rEqInSh.equipId)
+                jsonObject.put("obj_type", "EquipinShaft")
+                jsonObject.put("linkId",rEqInSh.shaftId)
+
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+//                kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "EquipinShaft", "12", IdUtils.uuidCreate(),  rEqInSh.equipId!!,
+//                        rEqInSh.shaftId!!),false)
+
+                val sBaseResponse = SBaseResponse(SResponseType.success)
+                sBaseResponse.message = rEqInSh.toJson()
+                sBaseResponse
+            } else {
+                SBaseResponse(SResponseType.failure)
+            }
+        }catch (e: Exception){
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function deletes()
+
+    /**
+     * 创建设备所在竖井关系
+     *
+     * @param    rEqInShList     设备和竖井关系的对象列表
+     */
+    fun createEq(rEqInShList: REqInShList): SCreateResponse<REqInSh>{
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            delete("equipID = '${rEqInShList.equipId}'")
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (shaftId in rEqInShList.shaftIdList!!){
+                val rEqInSh = REqInSh()
+                rEqInSh.equipId = rEqInShList.equipId
+                rEqInSh.shaftId = shaftId
+                rEqInSh.projectId = projectId
+                val replace = replace(rEqInSh)
+                if (replace){
+                    successList.add(rEqInSh)
+                }else{
+                    failureList.add(rEqInSh)
+                }
+            }
+            if (successList.size>0){
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "13")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rEqInShList.equipId)
+                jsonObject.put("obj_type", "EquipinShaft")
+                jsonObject.put("linkId",successList.toJson())
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+//                kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "EquipinShaft", "13", IdUtils.uuidCreate(),  rEqInShList.equipId!!,null),false)
+                val sCreateResponse = SCreateResponse<REqInSh>(SResponseType.success)
+                if (failureList.size>0){
+                    sCreateResponse.message ="失败对象:"+failureList.toJson()
+                }
+                sCreateResponse
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createEq()
+
+    /**
+     * 创建所在竖井的设备关系
+     *
+     * @param    rShInEqList     设备和竖井关系的对象列表
+     */
+    fun createsSh(rShInEqList: RShInEqList): SCreateResponse<REqInSh>{
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            delete("shaftID = '${rShInEqList.shaftId}'")
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (equipId in rShInEqList.equipIdList!!){
+                val rEqInSh = REqInSh()
+                rEqInSh.shaftId = rShInEqList.shaftId
+                rEqInSh.equipId = equipId
+                rEqInSh.projectId = projectId
+                val replace = replace(rEqInSh)
+                if (replace){
+                    successList.add(rEqInSh)
+                }else{
+                    failureList.add(rEqInSh)
+                }
+            }
+            if (successList.size>0){
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "13")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rShInEqList.shaftId)
+                jsonObject.put("obj_type", "EquipinShaft")
+                jsonObject.put("linkId",successList.toJson())
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+//                kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "EquipinShaft", "13", IdUtils.uuidCreate(),  rShInEqList.shaftId!!,null),false)
+                if (failureList.size>0){
+                    val sCreateResponse = SCreateResponse<REqInSh>(SResponseType.success)
+                    sCreateResponse.message ="失败对象:"+failureList.toJson()
+                    sCreateResponse
+                }else{
+                    val sCreateResponse = SCreateResponse<REqInSh>(SResponseType.success)
+                    sCreateResponse
+                }
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e:Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createsSh()
+
+    /**
+     * 创建所在竖井的设备关系
+     *
+     * @param    rShInEqList     设备和竖井关系的对象列表
+     */
+    fun createsShEq(rShInEqList: RShInEqList): SCreateResponse<REqInSh>{
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+//            delete("shaftID = '${rShInEqList.shaftId}'")
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (equipId in rShInEqList.equipIdList!!){
+                val rEqInSh = REqInSh()
+                rEqInSh.shaftId = rShInEqList.shaftId
+                rEqInSh.equipId = equipId
+                rEqInSh.projectId = projectId
+                val replace = replace(rEqInSh)
+                if (replace){
+                    successList.add(rEqInSh)
+                }else{
+                    failureList.add(rEqInSh)
+                }
+            }
+            if (successList.size>0){
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "14")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rShInEqList.shaftId)
+                jsonObject.put("obj_type", "EquipinShaft")
+                jsonObject.put("linkId",successList.toJson())
+
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+//                kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "EquipinShaft", "14", IdUtils.uuidCreate(),  rShInEqList.shaftId!!,null),false)
+                if (failureList.size>0){
+                    val sCreateResponse = SCreateResponse<REqInSh>(SResponseType.success)
+                    sCreateResponse.message ="失败对象:"+failureList.toJson()
+                    sCreateResponse
+                }else{
+                    val sCreateResponse = SCreateResponse<REqInSh>(SResponseType.success)
+                    sCreateResponse
+                }
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e:Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createsSh()
+
+} // Object REqInShService

+ 490 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/REqInSpBaseService.kt

@@ -0,0 +1,490 @@
+package com.persagy.server.services.rel
+
+import com.persagy.server.services.base.RService
+import com.persagy.server.datacenter.models.entities.rel.REq2Sp
+import com.persagy.server.datacenter.models.entities.rel.REqInSpBase
+import com.persagy.server.datacenter.models.entities.rel.REqInSpBaseList
+import com.persagy.server.datacenter.models.entities.rel.RSpInEqBaseList
+import com.sybotan.base.extensions.toJson
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import org.json.JSONObject
+
+/**
+ * 设备所在业务空间关系服务
+ *
+ * @author 付国宝
+ */
+object REqInSpBaseService: RService<REqInSpBase>(SMybatisDao(REqInSpBase::class.java)) {
+
+    /**
+     * 设备所在业务空间
+     */
+    var rEq2SpService = SObjectService(SMybatisDao( REq2Sp::class.java))
+
+    /**
+     * 创建设备所在业务空间关系
+     *
+     * @param    rEqInSpBase    设备所在业务空间关系对象
+     */
+    fun create(type: String, rEqInSpBaseList: SCreateRequest<REqInSpBase>): SCreateResponse<REqInSpBase> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (rEqInSpBase in rEqInSpBaseList.content){
+                try {
+                    val rEq2Sp = REq2Sp()
+                    rEq2Sp.zoneType = type
+                    rEq2Sp.type = "eq2sp_in"
+                    rEq2Sp.sign = 1
+                    rEq2Sp.id1 = rEqInSpBase.equipId
+                    rEq2Sp.id2 = rEqInSpBase.spaceId
+                    rEq2Sp.projectId = projectId
+                    val replace = rEq2SpService.replace(rEq2Sp)
+                    if (replace){
+                        val jsonObject = JSONObject()
+                        jsonObject.put("type", "11")
+                        jsonObject.put("projectId", projectId)
+                        jsonObject.put("id", rEqInSpBase.spaceId)
+                        jsonObject.put("obj_type", "EquipinSpace")
+                        jsonObject.put("linkId",rEqInSpBase.equipId)
+
+                        /** 发送消息 */
+                        messageHandler.sendMessage(jsonObject.toString())
+                    }
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+            }
+            SCreateResponse(SResponseType.success)
+//            if (type == "HeatingZone"){
+//                REqInSpZoneHeatingService.create(rEqInSpBaseList.content)
+//            }else if (type == "CleanZone"){
+//                val list = ArrayList<REqInSpZoneClean>()
+//                for (rEqInSpBase in rEqInSpBaseList.content){
+//                    val rEqInSpZoneClean = REqInSpZoneClean()
+//                    rEqInSpZoneClean.equipId = rEqInSpBase.equipId
+//                    rEqInSpZoneClean.spaceId = rEqInSpBase.spaceId
+//                    list.add(rEqInSpZoneClean)
+//                }
+//                REqInSpZoneCleanService.create(list)
+//            }else if (type == "DomesticWaterSupplyZone"){
+//                val list = ArrayList<REqInSpZoneDomesticWaterSupply>()
+//                for (rEqInSpBase in rEqInSpBaseList.content){
+//                    val rEqInSpZoneDomesticWaterSupply = REqInSpZoneDomesticWaterSupply()
+//                    rEqInSpZoneDomesticWaterSupply.spaceId = rEqInSpBase.spaceId
+//                    rEqInSpZoneDomesticWaterSupply.equipId = rEqInSpBase.equipId
+//                    list.add(rEqInSpZoneDomesticWaterSupply)
+//                }
+//
+//                REqInSpZoneDomesticWaterSupplyService.create(list)
+//            }else if (type == "NetworkZone" ){
+//                val list= ArrayList<REqInSpZoneNetwork>()
+//                for (rEqInSpBase in rEqInSpBaseList.content){
+//                    val rEqInSpZoneNetwork = REqInSpZoneNetwork()
+//                    rEqInSpZoneNetwork.equipId = rEqInSpBase.equipId
+//                    rEqInSpZoneNetwork.spaceId = rEqInSpBase.spaceId
+//                    list.add(rEqInSpZoneNetwork)
+//                }
+//
+//                REqInSpZoneNetworkService.create(list)
+//            }else if (type == "TenantZone"){
+//                val list = ArrayList<REqInSpZoneTenant>()
+//                for (rEqInSpBase in rEqInSpBaseList.content){
+//                    val rEqInSpZoneTenant = REqInSpZoneTenant()
+//                    rEqInSpZoneTenant.spaceId = rEqInSpBase.spaceId
+//                    rEqInSpZoneTenant.equipId = rEqInSpBase.equipId
+//                    list.add(rEqInSpZoneTenant)
+//                }
+//                REqInSpZoneTenantService.create(list)
+//            }else if (type == "AirConditioningZone"){
+//                val list = ArrayList<REqInSpZoneAirConditioning>()
+//                for (rEqInSpBase in rEqInSpBaseList.content){
+//                    val rEqInSpZoneAirConditioning = REqInSpZoneAirConditioning()
+//                    rEqInSpZoneAirConditioning.equipId = rEqInSpBase.equipId
+//                    rEqInSpZoneAirConditioning.spaceId = rEqInSpBase.spaceId
+//                    list.add(rEqInSpZoneAirConditioning)
+//                }
+//                REqInSpZoneAirConditioningService.create(list)
+//            }else if (type == "FunctionZone"){
+//                val list = ArrayList<REqInSpZoneFunction>()
+//                for (rEqInSpBase in rEqInSpBaseList.content){
+//                    val rEqInSpZoneFunction = REqInSpZoneFunction()
+//                    rEqInSpZoneFunction.spaceId = rEqInSpBase.spaceId
+//                    rEqInSpZoneFunction.equipId = rEqInSpBase.equipId
+//                    list.add(rEqInSpZoneFunction)
+//                }
+//                REqInSpZoneFunctionService.create(list)
+//            }else if (type == "FireZone"){
+//                val list = ArrayList<REqInSpZoneFire>()
+//                for (rEqInSpBase in rEqInSpBaseList.content){
+//                    val rEqInSpZoneFire = REqInSpZoneFire()
+//                    rEqInSpZoneFire.equipId = rEqInSpBase.equipId
+//                    rEqInSpZoneFire.spaceId = rEqInSpBase.spaceId
+//                    list.add(rEqInSpZoneFire)
+//                }
+//                REqInSpZoneFireService.create(list)
+//            }else if (type == "SecurityZone"){
+//                val list = ArrayList<REqInSpZoneSecurity>()
+//                for (rEqInSpBase in rEqInSpBaseList.content){
+//                    val rEqInSpZoneSecurity = REqInSpZoneSecurity()
+//                    rEqInSpZoneSecurity.spaceId = rEqInSpBase.spaceId
+//                    rEqInSpZoneSecurity.equipId = rEqInSpBase.equipId
+//                    list.add(rEqInSpZoneSecurity)
+//                }
+//                REqInSpZoneSecurityService.create(list)
+//            }else if (type == "GeneralZone"){
+//                val list = ArrayList<REqInSpZoneGeneral>()
+//                for (rEqInSpBase in rEqInSpBaseList.content){
+//                    val rEqInSpZoneGeneral = REqInSpZoneGeneral()
+//                    rEqInSpZoneGeneral.equipId = rEqInSpBase.equipId
+//                    rEqInSpZoneGeneral.spaceId = rEqInSpBase.spaceId
+//                    list.add(rEqInSpZoneGeneral)
+//                }
+//                REqInSpZoneGeneralService.create(list)
+//            }else if (type == "PowerSupplyZone"){
+//                val list =ArrayList<REqInSpZonePowerSupply>()
+//                for (rEqInSpBase in rEqInSpBaseList.content){
+//                    val rEqInSpZonePowerSupply = REqInSpZonePowerSupply()
+//                    rEqInSpZonePowerSupply.spaceId = rEqInSpBase.spaceId
+//                    rEqInSpZonePowerSupply.equipId = rEqInSpBase.equipId
+//                    list.add(rEqInSpZonePowerSupply)
+//                }
+//                REqInSpZonePowerSupplyService.create(list)
+//            }else if (type == "LightingZone"){
+//                val list = ArrayList<REqInSpZoneLighting>()
+//                for (rEqInSpBase in rEqInSpBaseList.content){
+//                    val rEqInSpZoneLighting = REqInSpZoneLighting()
+//                    rEqInSpZoneLighting.equipId = rEqInSpBase.equipId
+//                    rEqInSpZoneLighting.spaceId = rEqInSpBase.spaceId
+//                    list.add(rEqInSpZoneLighting)
+//                }
+//                REqInSpZoneLightingService.create(list)
+//            }else{
+//                val sCreateResponse = SCreateResponse<REqInSpBase>(SResponseType.failure)
+//                sCreateResponse.message = "空间分区类型不存在:$type"
+//                sCreateResponse
+//            }
+        } catch (e: Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function create()
+
+    /**
+     * 根据对象删除
+     *
+     * @param    rEqInSpBaseList    关系对象实例
+     */
+    fun deletes(type: String, rEqInSpBaseList: ArrayList<REqInSpBase>): SBaseResponse {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val list= ArrayList<REq2Sp>()
+            for (rEqInSpBase in rEqInSpBaseList){
+                val rEq2Sp = REq2Sp()
+                rEq2Sp.projectId = projectId
+                rEq2Sp.id1 = rEqInSpBase.equipId
+                rEq2Sp.id2 = rEqInSpBase.spaceId
+                rEq2Sp.zoneType = type
+                rEq2Sp.type = "eq2sp_in"
+                list.add(rEq2Sp)
+            }
+            REq2SpService.deleteByKeysList(list)
+
+//            if (type == "HeatingZone"){
+//                val list= ArrayList<REqInSpZoneHeating>()
+//                for (rEqInSpBase in rEqInSpBaseList){
+//                    val rEqInSpZoneHeating = REqInSpZoneHeating()
+//                    rEqInSpZoneHeating.spaceId = rEqInSpBase.spaceId
+//                    rEqInSpZoneHeating.equipId = rEqInSpBase.equipId
+//                    list.add(rEqInSpZoneHeating)
+//                }
+//                REqInSpZoneHeatingService.deleteByKeysList(list)
+//            }else if (type == "CleanZone"){
+//                val list = ArrayList<REqInSpZoneClean>()
+//                for (rEqInSpBase in rEqInSpBaseList){
+//                    val rEqInSpZoneClean = REqInSpZoneClean()
+//                    rEqInSpZoneClean.equipId = rEqInSpBase.equipId
+//                    rEqInSpZoneClean.spaceId = rEqInSpBase.spaceId
+//                    list.add(rEqInSpZoneClean)
+//                }
+//                REqInSpZoneCleanService.deleteByKeysList(list)
+//            }else if (type == "DomesticWaterSupplyZone"){
+//                val list = ArrayList<REqInSpZoneDomesticWaterSupply>()
+//                for (rEqInSpBase in rEqInSpBaseList){
+//                    val rEqInSpZoneDomesticWaterSupply = REqInSpZoneDomesticWaterSupply()
+//                    rEqInSpZoneDomesticWaterSupply.spaceId = rEqInSpBase.spaceId
+//                    rEqInSpZoneDomesticWaterSupply.equipId = rEqInSpBase.equipId
+//                    list.add(rEqInSpZoneDomesticWaterSupply)
+//                }
+//                REqInSpZoneDomesticWaterSupplyService.deleteByKeysList(list)
+//            }else if (type == "NetworkZone" ){
+//                val list= ArrayList<REqInSpZoneNetwork>()
+//                for (rEqInSpBase in rEqInSpBaseList){
+//                    val rEqInSpZoneNetwork = REqInSpZoneNetwork()
+//                    rEqInSpZoneNetwork.equipId = rEqInSpBase.equipId
+//                    rEqInSpZoneNetwork.spaceId = rEqInSpBase.spaceId
+//                    list.add(rEqInSpZoneNetwork)
+//                }
+//                REqInSpZoneNetworkService.deleteByKeysList(list)
+//            }else if (type == "TenantZone"){
+//                val list = ArrayList<REqInSpZoneTenant>()
+//                for (rEqInSpBase in rEqInSpBaseList){
+//                    val rEqInSpZoneTenant = REqInSpZoneTenant()
+//                    rEqInSpZoneTenant.spaceId = rEqInSpBase.spaceId
+//                    rEqInSpZoneTenant.equipId = rEqInSpBase.equipId
+//                    list.add(rEqInSpZoneTenant)
+//                }
+//                REqInSpZoneTenantService.deleteByKeysList(list)
+//            }else if (type == "AirConditioningZone"){
+//                val list = ArrayList<REqInSpZoneAirConditioning>()
+//                for (rEqInSpBase in rEqInSpBaseList){
+//                    val rEqInSpZoneAirConditioning = REqInSpZoneAirConditioning()
+//                    rEqInSpZoneAirConditioning.equipId = rEqInSpBase.equipId
+//                    rEqInSpZoneAirConditioning.spaceId = rEqInSpBase.spaceId
+//                    list.add(rEqInSpZoneAirConditioning)
+//                }
+//                REqInSpZoneAirConditioningService.deleteByKeysList(list)
+//            }else if (type == "FunctionZone"){
+//                val list = ArrayList<REqInSpZoneFunction>()
+//                for (rEqInSpBase in rEqInSpBaseList){
+//                    val rEqInSpZoneFunction = REqInSpZoneFunction()
+//                    rEqInSpZoneFunction.spaceId = rEqInSpBase.spaceId
+//                    rEqInSpZoneFunction.equipId = rEqInSpBase.equipId
+//                    list.add(rEqInSpZoneFunction)
+//                }
+//                REqInSpZoneFunctionService.deleteByKeysList(list)
+//            }else if (type == "FireZone"){
+//                val list = ArrayList<REqInSpZoneFire>()
+//                for (rEqInSpBase in rEqInSpBaseList){
+//                    val rEqInSpZoneFire = REqInSpZoneFire()
+//                    rEqInSpZoneFire.equipId = rEqInSpBase.equipId
+//                    rEqInSpZoneFire.spaceId = rEqInSpBase.spaceId
+//                    list.add(rEqInSpZoneFire)
+//                }
+//                REqInSpZoneFireService.deleteByKeysList(list)
+//            }else if (type == "SecurityZone"){
+//                val list = ArrayList<REqInSpZoneSecurity>()
+//                for (rEqInSpBase in rEqInSpBaseList){
+//                    val rEqInSpZoneSecurity = REqInSpZoneSecurity()
+//                    rEqInSpZoneSecurity.spaceId = rEqInSpBase.spaceId
+//                    rEqInSpZoneSecurity.equipId = rEqInSpBase.equipId
+//                    list.add(rEqInSpZoneSecurity)
+//                }
+//                REqInSpZoneSecurityService.deleteByKeysList(list)
+//            }else if (type == "GeneralZone"){
+//                val list = ArrayList<REqInSpZoneGeneral>()
+//                for (rEqInSpBase in rEqInSpBaseList){
+//                    val rEqInSpZoneGeneral = REqInSpZoneGeneral()
+//                    rEqInSpZoneGeneral.equipId = rEqInSpBase.equipId
+//                    rEqInSpZoneGeneral.spaceId = rEqInSpBase.spaceId
+//                    list.add(rEqInSpZoneGeneral)
+//                }
+//
+//                REqInSpZoneGeneralService.deleteByKeysList(list)
+//            }else if (type == "PowerSupplyZone"){
+//                val list =ArrayList<REqInSpZonePowerSupply>()
+//                for (rEqInSpBase in rEqInSpBaseList){
+//                    val rEqInSpZonePowerSupply = REqInSpZonePowerSupply()
+//                    rEqInSpZonePowerSupply.spaceId = rEqInSpBase.spaceId
+//                    rEqInSpZonePowerSupply.equipId = rEqInSpBase.equipId
+//                    list.add(rEqInSpZonePowerSupply)
+//                }
+//                REqInSpZonePowerSupplyService.deleteByKeysList(list)
+//            }else if (type == "LightingZone"){
+//                val list = ArrayList<REqInSpZoneLighting>()
+//                for (rEqInSpBase in rEqInSpBaseList){
+//                    val rEqInSpZoneLighting = REqInSpZoneLighting()
+//                    rEqInSpZoneLighting.equipId = rEqInSpBase.equipId
+//                    rEqInSpZoneLighting.spaceId = rEqInSpBase.spaceId
+//                    list.add(rEqInSpZoneLighting)
+//                }
+//                REqInSpZoneLightingService.deleteByKeysList(list)
+//            }else{
+//                val sCreateResponse = SCreateResponse<REqInSpBase>(SResponseType.failure)
+//                sCreateResponse.message = "空间分区类型不存在:$type"
+//                sCreateResponse
+//            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function deletes()
+
+    /**
+     * 创建设备所在业务空间关系
+     *
+     * @param    rEqInSpBaseList    设备和业务空间关系的对象列表
+     */
+    fun createEq(rEqInSpBaseList: REqInSpBaseList): SCreateResponse<REqInSpBase> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            delete("equipId = '${rEqInSpBaseList.equipId}'")
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (spaceId in rEqInSpBaseList.spaceIdList!!){
+                val rEqInSpBase = REqInSpBase()
+                rEqInSpBase.equipId = rEqInSpBaseList.equipId
+                rEqInSpBase.spaceId = spaceId
+                rEqInSpBase.projectId = projectId
+                val replace = replace(rEqInSpBase)
+                if (replace){
+                    successList.add(rEqInSpBase)
+                }else{
+                    failureList.add(rEqInSpBase)
+                }
+            }
+            if (successList.size>0){
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "13")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rEqInSpBaseList.equipId)
+                jsonObject.put("obj_type", "EquipinSpace")
+                jsonObject.put("linkId",successList.toJson())
+
+                /** 发送消息 */
+                RService.messageHandler.sendMessage(jsonObject.toString())
+
+                val sCreateResponse = SCreateResponse<REqInSpBase>(SResponseType.success)
+                if (failureList.size>0){
+                    sCreateResponse.message ="失败对象:"+failureList.toJson()
+                }
+                sCreateResponse
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createEq()
+
+    /**
+     * 创建所在业务空间的设备关系
+     *
+     * @param    rEqInSpBaseList    设备和业务空间关系的对象列表
+     */
+    fun createsSp(rEqInSpBaseList: RSpInEqBaseList): SCreateResponse<REqInSpBase> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            delete("spaceID = '${rEqInSpBaseList.spaceId}'")
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (equipId in rEqInSpBaseList.equipIdList!!){
+                val rEqInSpBase = REqInSpBase()
+                rEqInSpBase.spaceId = rEqInSpBaseList.spaceId
+                rEqInSpBase.equipId = equipId
+                rEqInSpBase.projectId = projectId
+                val replace = replace(rEqInSpBase)
+                if (replace){
+                    successList.add(rEqInSpBase)
+                }else{
+                    failureList.add(rEqInSpBase)
+                }
+            }
+            if (successList.size>0){
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "13")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rEqInSpBaseList.spaceId)
+                jsonObject.put("obj_type", "EquipinSpace")
+                jsonObject.put("linkId",successList.toJson())
+
+                /** 发送消息 */
+                RService.messageHandler.sendMessage(jsonObject.toString())
+
+                if (failureList.size>0){
+                    val sCreateResponse = SCreateResponse<REqInSpBase>(SResponseType.success)
+                    sCreateResponse.message ="失败对象:"+failureList.toJson()
+                    sCreateResponse
+                }else{
+                    val sCreateResponse = SCreateResponse<REqInSpBase>(SResponseType.success)
+                    sCreateResponse
+                }
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e:Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createsSp()
+
+    /**
+     * 创建所在业务空间的设备关系
+     *
+     * @param    rEqInSpBaseList    设备和业务空间关系的对象列表
+     */
+    fun createsSpEq(type: String,rEqInSpBaseList: RSpInEqBaseList): SCreateResponse<RSpInEqBaseList> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            /** 业务空间类型服务 */
+
+            if (!type.isNullOrEmpty()){
+                try {
+                    /** 成功集合 */
+                    val successList = ArrayList<Any>()
+                    /** 失败集合 */
+                    val failureList = ArrayList<Any>()
+                    for (rEqInSpBase in rEqInSpBaseList.equipIdList!!){
+                        val rEq2Sp = REq2Sp()
+                        rEq2Sp.id1 = rEqInSpBase
+                        rEq2Sp.id2 = rEqInSpBaseList.spaceId
+                        rEq2Sp.projectId = projectId
+                        rEq2Sp.sign = 1
+                        rEq2Sp.type ="eq2sp_in"
+                        rEq2Sp.zoneType =  type
+                        val replace = rEq2SpService.replace(rEq2Sp)
+                        if (replace){
+                            successList.add(rEq2Sp)
+                        }else{
+                            failureList.add(rEq2Sp)
+                        }
+                    }
+
+                    if (successList.size>0){
+                        val jsonObject = JSONObject()
+                        jsonObject.put("type", "14")
+                        jsonObject.put("projectId", projectId)
+                        jsonObject.put("id", rEqInSpBaseList.spaceId)
+                        jsonObject.put("obj_type", "EquipinSpace")
+                        jsonObject.put("linkId",successList.toJson())
+                        /** 发送消息 */
+                        messageHandler.sendMessage(jsonObject.toString())
+                        if (failureList.size>0){
+                            val sCreateResponse = SCreateResponse<RSpInEqBaseList>(SResponseType.success)
+                            sCreateResponse.message ="失败对象:"+failureList.toJson()
+                            sCreateResponse
+                        }else{
+                            val sCreateResponse = SCreateResponse<RSpInEqBaseList>(SResponseType.success)
+                            sCreateResponse
+                        }
+                    }else{
+                        SCreateResponse(SResponseType.failure)
+                    }
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+                val sCreateResponse = SCreateResponse<RSpInEqBaseList>(SResponseType.success)
+                sCreateResponse
+            }else{
+                val sCreateResponse = SCreateResponse<RSpInEqBaseList>(SResponseType.failure)
+                sCreateResponse.message = "空间分区类型不存在:$type"
+                sCreateResponse
+            }
+
+        } catch (e:Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createsSp()
+
+} // Object REqInSpBaseService

+ 210 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/RFlThroughFlService.kt

@@ -0,0 +1,210 @@
+package com.persagy.server.services.rel
+
+import com.persagy.server.services.base.RService
+
+import com.persagy.server.datacenter.models.entities.rel.RFlThroughFl
+import com.persagy.server.datacenter.models.entities.rel.RFloorOtherThroughFloorList
+import com.persagy.server.datacenter.models.entities.rel.RFloorThroughFloorOtherList
+import com.sybotan.base.extensions.toJson
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import org.json.JSONObject
+
+/**
+ * 楼层的贯通关系服务
+ *
+ * @author 付国宝
+ */
+object RFlThroughFlService : RService<RFlThroughFl>(SMybatisDao(RFlThroughFl::class.java)) {
+
+    /**
+     * 创建楼层的贯通关系
+     *
+     * @param   rFlThroughFl    楼层的贯通关系对象
+     */
+    fun create(rFlThroughFl: RFlThroughFl): SCreateResponse<RFlThroughFl> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            rFlThroughFl.projectId = projectId
+            val isInsert = insert(rFlThroughFl)
+            if (isInsert){
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "11")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rFlThroughFl.floorId)
+                jsonObject.put("obj_type", "Fl2Fl")
+                jsonObject.put("linkId",rFlThroughFl.floorOtherId)
+
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+//                kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "Fl2Fl", "11", IdUtils.uuidCreate(),  rFlThroughFl.floorId!!, rFlThroughFl.floorOtherId!!),false)
+                SCreateResponse(SResponseType.success)
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e: Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Tenant create()
+
+    /**
+     * 根据对象删除
+     *
+     * @param   rFlThroughFl    关系对象实例
+     */
+    fun deletes(rFlThroughFl: RFlThroughFl): SBaseResponse {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val isDelete = delete(rFlThroughFl)
+            /** 删除成功 */
+            if (isDelete) {
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "12")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rFlThroughFl.floorId)
+                jsonObject.put("obj_type", "Fl2Fl")
+                jsonObject.put("linkId",rFlThroughFl.floorOtherId)
+
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+//                kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "Fl2Fl", "12", IdUtils.uuidCreate(),  rFlThroughFl.floorId!!, rFlThroughFl.floorOtherId!!),false)
+                val sBaseResponse = SBaseResponse(SResponseType.success)
+                sBaseResponse.message = rFlThroughFl.toJson()
+                sBaseResponse
+            } else {
+                SBaseResponse(SResponseType.failure)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure, e.message!!)
+        }
+    } // Tenant deletes()
+
+    /**
+     * 创建楼层的贯通关系
+     *
+     * @param   rFloorThroughFloorOtherList    楼层和楼层列表关系对象
+     */
+    fun createFl(rFloorThroughFloorOtherList: RFloorThroughFloorOtherList): SCreateResponse<RFlThroughFl> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+
+            try {
+                delete("floorId = '${rFloorThroughFloorOtherList.floorId}'")
+                delete("floorOtherId = '${rFloorThroughFloorOtherList.floorId}'")
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            val projectId = SPageContext.getHeader("ProjectId")
+            if (rFloorThroughFloorOtherList.floorOtherIdList!=null&&rFloorThroughFloorOtherList.floorOtherIdList!!.isNotEmpty()){
+                for (floorOtherId in rFloorThroughFloorOtherList.floorOtherIdList!!){
+                    val rFlThroughFl = RFlThroughFl()
+                    rFlThroughFl.floorId = rFloorThroughFloorOtherList.floorId
+                    rFlThroughFl.floorOtherId = floorOtherId
+                    rFlThroughFl.projectId = projectId
+                    val replace = replace(rFlThroughFl)
+                    if (replace){
+                        successList.add(rFlThroughFl)
+                    }else{
+                        failureList.add(rFlThroughFl)
+                    }
+                }
+                if (successList.size>0){
+                    val jsonObject = JSONObject()
+                    jsonObject.put("type", "13")
+                    jsonObject.put("projectId", projectId)
+                    jsonObject.put("id", rFloorThroughFloorOtherList.floorId)
+                    jsonObject.put("obj_type", "Fl2Fl")
+                    jsonObject.put("linkId",successList.toJson())
+                    /** 发送消息 */
+                    messageHandler.sendMessage(jsonObject.toString())
+//                    kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "Fl2Fl", "13", IdUtils.uuidCreate(),  rFloorThroughFloorOtherList.floorId!!, null),false)
+                    val sCreateResponse = SCreateResponse<RFlThroughFl>(SResponseType.success)
+                    if (failureList.size>0){
+                        sCreateResponse.message ="失败对象:"+failureList.toJson()
+                    }
+                    sCreateResponse
+                }else{
+                    SCreateResponse(SResponseType.failure)
+                }
+            }else{
+                SCreateResponse(SResponseType.success)
+            }
+
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Tenant createFl()
+
+    /**
+     * 创建楼层的贯通关系
+     *
+     * @param   rFollrOtherThroughFloorList    楼层列表和楼层关系对象
+     */
+    fun createsFl(rFollrOtherThroughFloorList: RFloorOtherThroughFloorList): SCreateResponse<RFlThroughFl> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+
+            try {
+                delete("floorId = '${rFollrOtherThroughFloorList.floorOtherId}'")
+                delete("floorOtherId = '${rFollrOtherThroughFloorList.floorOtherId}'")
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            val projectId = SPageContext.getHeader("ProjectId")
+            if (rFollrOtherThroughFloorList.floorIdList!=null&&rFollrOtherThroughFloorList.floorIdList!!.isNotEmpty()){
+                for (floorId in rFollrOtherThroughFloorList.floorIdList!!){
+                    val rFlThroughFl = RFlThroughFl()
+                    rFlThroughFl.floorOtherId = rFollrOtherThroughFloorList.floorOtherId
+                    rFlThroughFl.floorId = floorId
+                    rFlThroughFl.projectId = projectId
+                    val replace = replace(rFlThroughFl)
+                    if (replace){
+                        successList.add(rFlThroughFl)
+                    }else{
+                        failureList.add(rFlThroughFl)
+                    }
+                }
+                if (successList.size>0){
+                    val jsonObject = JSONObject()
+                    jsonObject.put("type", "13")
+                    jsonObject.put("projectId", projectId)
+                    jsonObject.put("id", rFollrOtherThroughFloorList.floorOtherId)
+                    jsonObject.put("obj_type", "Fl2Fl")
+                    jsonObject.put("linkId",successList.toJson())
+                    /** 发送消息 */
+                    messageHandler.sendMessage(jsonObject.toString())
+//                    kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "Fl2Fl", "13", IdUtils.uuidCreate(),  rFollrOtherThroughFloorList.floorOtherId!!, null),false)
+                    if (failureList.size>0){
+                        val sCreateResponse = SCreateResponse<RFlThroughFl>(SResponseType.success)
+                        sCreateResponse.message ="失败对象:"+failureList.toJson()
+                        sCreateResponse
+                    }else{
+                        val sCreateResponse = SCreateResponse<RFlThroughFl>(SResponseType.success)
+                        sCreateResponse
+                    }
+                }else{
+                    SCreateResponse(SResponseType.failure)
+                }
+            }else{
+                SCreateResponse(SResponseType.success)
+            }
+
+        } catch (e:Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Tenant createsFL()
+
+} // Object RFlThroughFlService()

+ 80 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/RIspaceAdjacentIspaceService.kt

@@ -0,0 +1,80 @@
+package com.persagy.server.services.rel
+
+import com.persagy.server.services.base.RService
+import com.persagy.server.datacenter.models.entities.rel.RIspaceAdjacentIspace
+import com.persagy.server.services.objects.SpaceService
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import java.util.*
+
+/**
+ * 元空间邻接关系
+ *
+ * @author 张维新
+ */
+object RIspaceAdjacentIspaceService : RService<RIspaceAdjacentIspace>(SMybatisDao(RIspaceAdjacentIspace::class.java)) {
+
+
+    /**
+     * 元空间邻接关系
+     */
+    fun createLists(rIspaceAdjacentIspace: SCreateRequest<RIspaceAdjacentIspace>): SCreateResponse<RIspaceAdjacentIspace> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            rIspaceAdjacentIspace.content
+            for (rIspaceIspace in rIspaceAdjacentIspace.content) {
+                rIspaceIspace.projectId = projectId
+                try {
+                    val insert = insert(rIspaceIspace)
+//                    if (insert){
+//                        kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "Fl2Fl", "11", IdUtils.uuidCreate(),  rIspaceIspace.ispace!!,
+//                                rIspaceIspace.otherIspaceId),false)
+//                    }
+
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+
+            }
+            SCreateResponse(SResponseType.success)
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure, e.message.toString())
+        }
+
+    } // Function createLists()
+
+    /**
+     * 删除元空间邻接关系
+     */
+    fun delectId(floorId: String): SBaseResponse {
+
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val ispaceList = SpaceService.select(SFilter.eq("floorId", floorId)).exec()
+
+            val list = ArrayList<String>()
+            ispaceList.stream().forEach {
+                list.add(it.id!!)
+            }
+            val delete = delete(SFilter.or(SFilter.inList("ispace", list), SFilter.inList("otherIspaceId", list)))
+//            if (delete){
+//                kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "Fl2Fl", "11", IdUtils.uuidCreate(),  rIspaceIspace.ispace!!,
+//                        rIspaceIspace.otherIspaceId),false)
+//            }
+
+
+            SBaseResponse(SResponseType.success)
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SBaseResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function delectId()
+
+
+} // Object RIspaceAdjacentIspaceService

+ 561 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/RShContainSpBaseService.kt

@@ -0,0 +1,561 @@
+package com.persagy.server.services.rel
+
+import com.persagy.server.services.base.RService
+import com.persagy.server.datacenter.models.entities.dict.SpaceInfoDic
+import com.persagy.server.datacenter.models.entities.objects.ZoneSpace
+import com.persagy.server.datacenter.models.entities.rel.RSh2Sp
+import com.persagy.server.datacenter.models.entities.rel.RShContainSpBase
+import com.persagy.server.datacenter.models.entities.rel.RShContainSpBaseList
+import com.persagy.server.services.objects.EquipmentService
+import com.sybotan.base.extensions.toJson
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.requests.SQueryRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import com.sybotan.service.models.responses.SQueryResponse
+
+/**
+ * 竖井下的业务空间关系服务 目前只支持 默认空间同步
+ *
+ * @author 付国宝
+ */
+object RShContainSpBaseService: SBaseService<RShContainSpBase>(SMybatisDao(RShContainSpBase::class.java)) {
+
+    val rSh2SpService = RService(SMybatisDao(RSh2Sp::class.java))
+
+    /**
+     * 创建竖井下业务空间关系
+     *
+     * @param    rShContainSpBaseList    竖井和业务空间的关系对象
+     */
+    fun create(rShContainSpBaseList: SCreateRequest<RShContainSpBase>): SCreateResponse<RShContainSpBase> {
+        return try {
+
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (rShContainSpBase in rShContainSpBaseList.content){
+                val rSh2Sp = RSh2Sp()
+                rSh2Sp.id2 = rShContainSpBase.spaceId
+                rSh2Sp.id1 = rShContainSpBase.shaftId
+                rSh2Sp.projectId = projectId
+                rSh2Sp.sign = 1
+                rSh2Sp.zoneType = rShContainSpBase.objectType
+                rSh2Sp.type = "sh2sp"
+                val isInsert = rSh2SpService.insert(rSh2Sp)
+//                if (isInsert){
+//                    SCreateResponse(SResponseType.success)
+//                }else{
+//                    SCreateResponse(SResponseType.failure)
+//                }
+            }
+
+//            for (rShContainSpBase in rShContainSpBaseList.content){
+//                if (rShContainSpBase.objectType == "HeatingZone"){
+//                    RShContainSpZoneHeatingService.create(rShContainSpBase)
+//                }else if (rShContainSpBase.objectType == "CleanZone"){
+//                    RShContainSpZoneCleanService.create(rShContainSpBase)
+//                }else if (rShContainSpBase.objectType == "DomesticWaterSupplyZone"){
+//                    RShContainSpZoneDomesticWaterSupplyService.create(rShContainSpBase)
+//                }else if (rShContainSpBase.objectType == "NetworkZone" ){
+//                    RShContainSpZoneNetworkService.create(rShContainSpBase)
+//                }else if (rShContainSpBase.objectType == "TenantZone"){
+//                    RShContainSpZoneTenantService.create(rShContainSpBase)
+//                }else if (rShContainSpBase.objectType == "AirConditioningZone"){
+//                    RShContainSpZoneAirConditioningService.create(rShContainSpBase)
+//                }else if (rShContainSpBase.objectType == "FunctionZone"){
+//                    RShContainSpZoneFunctionService.create(rShContainSpBase)
+//                }else if (rShContainSpBase.objectType == "FireZone"){
+//                    RShContainSpZoneFireService.create(rShContainSpBase)
+//                }else if (rShContainSpBase.objectType == "SecurityZone"){
+//                    RShContainSpZoneSecurityService.create(rShContainSpBase)
+//                }else if (rShContainSpBase.objectType == "GeneralZone"){
+//                    RShContainSpZoneGeneralService.create(rShContainSpBase)
+//                }else if (rShContainSpBase.objectType == "PowerSupplyZone"){
+//                    RShContainSpZonePowerSupplyService.create(rShContainSpBase)
+//                }else if (rShContainSpBase.objectType == "LightingZone"){
+//                    RShContainSpZoneLightingService.create(rShContainSpBase)
+//                }else{
+//                    val sCreateResponse = SCreateResponse<RShContainSpBase>(SResponseType.failure)
+//                    sCreateResponse.message = "空间分区类型不存在:" + rShContainSpBase.objectType
+//                    sCreateResponse
+//                }
+//            }
+            val sCreateResponse = SCreateResponse<RShContainSpBase>(SResponseType.success)
+            sCreateResponse
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function create()
+
+    /**
+     * 根据对象删除
+     *
+     * @param    rShContainSpBase    关系对象实例
+     * @return
+     */
+    fun deletes(type: String, rShContainSpBaseList: ArrayList<RShContainSpBase>): SBaseResponse {
+        return try {
+
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (rShContainSpBase in rShContainSpBaseList){
+                val rSh2Sp = RSh2Sp()
+                rSh2Sp.id2 = rShContainSpBase.spaceId
+                rSh2Sp.id1 = rShContainSpBase.shaftId
+                rSh2Sp.projectId = projectId
+                rSh2Sp.zoneType = type
+                rSh2Sp.type = "sh2sp"
+                val isDelete = rSh2SpService.delete(rSh2Sp)
+                if (isDelete) {
+
+                } else {
+
+                }
+            }
+            val sBaseResponse = SBaseResponse(SResponseType.success)
+            sBaseResponse
+
+
+//            if (type == "HeatingZone"){
+//                RShContainSpZoneHeatingService.deletes(rShContainSpBaseList)
+//            }else if (type == "CleanZone"){
+//                RShContainSpZoneCleanService.deletes(rShContainSpBaseList)
+//            }else if (type == "DomesticWaterSupplyZone"){
+//                RShContainSpZoneDomesticWaterSupplyService.deletes(rShContainSpBaseList)
+//            }else if (type == "NetworkZone" ){
+//                RShContainSpZoneNetworkService.deletes(rShContainSpBaseList)
+//            }else if (type == "TenantZone"){
+//                RShContainSpZoneTenantService.deletes(rShContainSpBaseList)
+//            }else if (type == "AirConditioningZone"){
+//                RShContainSpZoneAirConditioningService.deletes(rShContainSpBaseList)
+//            }else if (type == "FunctionZone"){
+//                RShContainSpZoneFunctionService.deletes(rShContainSpBaseList)
+//            }else if (type == "FireZone"){
+//                RShContainSpZoneFireService.deletes(rShContainSpBaseList)
+//            }else if (type == "SecurityZone"){
+//                RShContainSpZoneSecurityService.deletes(rShContainSpBaseList)
+//            }else if (type == "GeneralZone"){
+//                RShContainSpZoneGeneralService.deletes(rShContainSpBaseList)
+//            }else if (type == "PowerSupplyZone"){
+//                RShContainSpZonePowerSupplyService.deletes(rShContainSpBaseList)
+//            }else if (type == "LightingZone"){
+//                RShContainSpZoneLightingService.deletes(rShContainSpBaseList)
+//            }else{
+//                val sCreateResponse = SCreateResponse<RShContainSpBase>(SResponseType.failure)
+//                sCreateResponse.message = "空间分区类型不存在:$type"
+//                sCreateResponse
+//            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function deletes()
+
+    /**
+     * 创建竖井下业务空间关系
+     *
+     * @param    rShContainSpBaseList    竖井和业务空间的关系对象列表
+     */
+    fun createSh(rShContainSpBaseList: RShContainSpBaseList): SCreateResponse<RShContainSpBase> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            rSh2SpService.delete("Id1 = '${rShContainSpBaseList.shaftId}'")
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (spaceId in rShContainSpBaseList.spaceIdList!!){
+                val rSh2Sp = RSh2Sp()
+                rSh2Sp.id1 = rShContainSpBaseList.shaftId
+                rSh2Sp.id2 = spaceId
+                rSh2Sp.projectId = projectId
+                rSh2Sp.zoneType = rShContainSpBaseList.zoneType
+                rSh2Sp.sign = 1
+                rSh2Sp.type = "sh2sp"
+                val replace = rSh2SpService.replace(rSh2Sp)
+                if (replace){
+                    successList.add(rSh2Sp)
+                }else{
+                    failureList.add(rSh2Sp)
+                }
+            }
+            if (successList.size>0){
+                val sCreateResponse = SCreateResponse<RShContainSpBase>(SResponseType.success)
+                if (failureList.size>0){
+                    sCreateResponse.message ="失败对象:"+failureList.toJson()
+                }
+                sCreateResponse
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createSh()
+
+    /**
+     * 创建竖井下业务空间关系
+     *
+     * @param    rShContainSpBaseList    竖井和业务空间的关系对象列表
+     */
+    fun createsSp(rShContainSpBaseList: RSpContainShBaseList): SCreateResponse<RShContainSpBase> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            rSh2SpService.delete("id2 = '${rShContainSpBaseList.spaceId}'")
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (shaftId in rShContainSpBaseList.shaftIdList!!){
+                val rSh2Sp = RSh2Sp()
+                rSh2Sp.id2 = rShContainSpBaseList.spaceId
+                rSh2Sp.id1 = shaftId
+                rSh2Sp.projectId = projectId
+                rSh2Sp.zoneType = rShContainSpBaseList.zoneType
+                rSh2Sp.sign = 1
+                rSh2Sp.type = "sh2sp"
+                val replace = rSh2SpService.replace(rSh2Sp)
+                if (replace){
+                    successList.add(rSh2Sp)
+                }else{
+                    failureList.add(rSh2Sp)
+                }
+            }
+            if (successList.size>0){
+                if (failureList.size>0){
+                    val sCreateResponse = SCreateResponse<RShContainSpBase>(SResponseType.success)
+                    sCreateResponse.message ="失败对象:"+failureList.toJson()
+                    sCreateResponse
+                }else{
+                    val sCreateResponse = SCreateResponse<RShContainSpBase>(SResponseType.success)
+                    sCreateResponse
+                }
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e:Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createsSp()
+
+    /**
+     * 创建竖井下业务空间关系
+     *
+     * @param    rShContainSpBaseList    竖井和业务空间的关系对象列表
+     */
+    fun createShSps(type: String?,rShContainSpBaseList: RShContainSpBaseList): SCreateResponse<RShContainSpBaseList> {
+        return try {
+
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            val projectId = SPageContext.getHeader("ProjectId")
+            if (!rShContainSpBaseList.spaceIdList.isNullOrEmpty()&&!type.isNullOrEmpty()){
+                for (spaceId in rShContainSpBaseList.spaceIdList!!){
+                    val rSh2Sp = RSh2Sp()
+                    rSh2Sp.id1 = rShContainSpBaseList.shaftId
+                    rSh2Sp.id2 = spaceId
+                    rSh2Sp.projectId = projectId
+                    rSh2Sp.zoneType = type
+                    rSh2Sp.sign = 1
+                    rSh2Sp.type = "sh2sp"
+                    val replace = rSh2SpService.replace(rSh2Sp)
+                    if (replace){
+                        successList.add(rSh2Sp)
+                    }else{
+                        failureList.add(rSh2Sp)
+                    }
+                }
+                if (successList.size>0){
+                    try {
+                        /** 处理关系标记 */
+                        val listType = ArrayList<String>()
+                        listType.add("sh2bd")
+                        listType.add("eq2sh")
+                        for (type in listType){
+                            val entity = EquipmentService.relationTypeProjectservice.select(SFilter.eq("projectId", projectId!!), SFilter.eq("relationType", type)).entity()
+                            if (entity!=null){
+                                entity.computationalState = 2
+                                EquipmentService.relationTypeProjectservice.update(entity)
+                            }
+                        }
+                    } catch (e: Exception) {
+                        e.printStackTrace()
+                    }
+                    val sCreateResponse = SCreateResponse<RShContainSpBaseList>(SResponseType.success)
+                    if (failureList.size>0){
+                        sCreateResponse.message ="失败对象:"+failureList.toJson()
+                    }
+                    sCreateResponse
+                }else{
+                    SCreateResponse(SResponseType.failure)
+                }
+            }else{
+                val sCreateResponse = SCreateResponse<RShContainSpBaseList>(SResponseType.success)
+                sCreateResponse.message = "空间类型和空间列表不能为空"
+                sCreateResponse
+            }
+
+
+//            if (type == "HeatingZone"){
+//                RShContainSpZoneHeatingService.createShSps(rShContainSpBaseList)
+//            }else if (type == "CleanZone"){
+//                RShContainSpZoneCleanService.createShSps(rShContainSpBaseList)
+//            }else if (type == "DomesticWaterSupplyZone"){
+//                RShContainSpZoneDomesticWaterSupplyService.createShSps(rShContainSpBaseList)
+//            }else if (type == "NetworkZone" ){
+//                RShContainSpZoneNetworkService.createShSps(rShContainSpBaseList)
+//            }else if (type == "TenantZone"){
+//                RShContainSpZoneTenantService.createShSps(rShContainSpBaseList)
+//            }else if (type == "AirConditioningZone"){
+//                RShContainSpZoneAirConditioningService.createShSps(rShContainSpBaseList)
+//            }else if (type == "FunctionZone"){
+//                RShContainSpZoneFunctionService.createShSps(rShContainSpBaseList)
+//            }else if (type == "FireZone"){
+//                RShContainSpZoneFireService.createShSps(rShContainSpBaseList)
+//            }else if (type == "SecurityZone"){
+//                RShContainSpZoneSecurityService.createShSps(rShContainSpBaseList)
+//            }else if (type == "GeneralZone"){
+//                RShContainSpZoneGeneralService.createShSps(rShContainSpBaseList)
+//            }else if (type == "PowerSupplyZone"){
+//                RShContainSpZonePowerSupplyService.createShSps(rShContainSpBaseList)
+//            }else if (type == "LightingZone"){
+//                RShContainSpZoneLightingService.createShSps(rShContainSpBaseList)
+//            }else{
+//                val sCreateResponse = SCreateResponse<RShContainSpBaseList>(SResponseType.failure)
+//                sCreateResponse.message = "空间分区类型不存在:$type"
+//                sCreateResponse
+//            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    }
+
+
+    /**
+     * 创建竖井下业务空间关系
+     *
+     * @param    rSpContainShBaseList    竖井和业务空间的关系对象列表
+     */
+    fun createSpShs(type: String,rSpContainShBaseList: RSpContainShBaseList): SCreateResponse<RSpContainShBaseList> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            val projectId = SPageContext.getHeader("ProjectId")
+
+            if (!rSpContainShBaseList.shaftIdList.isNullOrEmpty()){
+                for (shaftId in rSpContainShBaseList.shaftIdList!!){
+                    val rSh2Sp = RSh2Sp()
+                    rSh2Sp.id2 = rSpContainShBaseList.spaceId
+                    rSh2Sp.id1 = shaftId
+                    rSh2Sp.projectId = projectId
+                    rSh2Sp.zoneType = type
+                    rSh2Sp.sign = 1
+                    rSh2Sp.type = "sh2sp"
+                    val replace = rSh2SpService.replace(rSh2Sp)
+                    if (replace){
+                        successList.add(rSh2Sp)
+                    }else{
+                        failureList.add(rSh2Sp)
+                    }
+                }
+                if (successList.size>0){
+                    if (failureList.size>0){
+                        val sCreateResponse = SCreateResponse<RSpContainShBaseList>(SResponseType.success)
+                        sCreateResponse.message ="失败对象:"+failureList.toJson()
+                        sCreateResponse
+                    }else{
+                        val sCreateResponse = SCreateResponse<RSpContainShBaseList>(SResponseType.success)
+                        sCreateResponse
+                    }
+                }else{
+                    SCreateResponse(SResponseType.failure)
+                }
+            }else{
+                SCreateResponse(SResponseType.success)
+            }
+
+//            if (type == "HeatingZone"){
+//                RShContainSpZoneHeatingService.createSpShs(rSpContainShBaseList)
+//            }else if (type == "CleanZone"){
+//                RShContainSpZoneCleanService.createSpShs(rSpContainShBaseList)
+//            }else if (type == "DomesticWaterSupplyZone"){
+//                RShContainSpZoneDomesticWaterSupplyService.createSpShs(rSpContainShBaseList)
+//            }else if (type == "NetworkZone" ){
+//                RShContainSpZoneNetworkService.createSpShs(rSpContainShBaseList)
+//            }else if (type == "TenantZone"){
+//                RShContainSpZoneTenantService.createSpShs(rSpContainShBaseList)
+//            }else if (type == "AirConditioningZone"){
+//                RShContainSpZoneAirConditioningService.createSpShs(rSpContainShBaseList)
+//            }else if (type == "FunctionZone"){
+//                RShContainSpZoneFunctionService.createSpShs(rSpContainShBaseList)
+//            }else if (type == "FireZone"){
+//                RShContainSpZoneFireService.createSpShs(rSpContainShBaseList)
+//            }else if (type == "SecurityZone"){
+//                RShContainSpZoneSecurityService.createSpShs(rSpContainShBaseList)
+//            }else if (type == "GeneralZone"){
+//                RShContainSpZoneGeneralService.createSpShs(rSpContainShBaseList)
+//            }else if (type == "PowerSupplyZone"){
+//                RShContainSpZonePowerSupplyService.createSpShs(rSpContainShBaseList)
+//            }else if (type == "LightingZone"){
+//                RShContainSpZoneLightingService.createSpShs(rSpContainShBaseList)
+//            }else{
+//                val sCreateResponse = SCreateResponse<RSpContainShBaseList>(SResponseType.failure)
+//                sCreateResponse.message = "空间分区类型不存在:$type"
+//                sCreateResponse
+//            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    }
+
+    /**
+     * 创建竖井下业务空间关系
+     *
+     * @param    rShContainSpBaseList    竖井和业务空间的关系对象列表
+     */
+    fun createShSpsReplace(type: String,buildingId: String,floorId: String,rShContainSpBaseList: RShContainSpBaseList): SCreateResponse<RShContainSpBaseList> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val allSpaceIdList = ArrayList<String>()//和竖井关联的并且为当前空间类型的业务空间id列表
+            val spaceIdList = ArrayList<String>()//和竖井关联且为当前空间类型、所在建筑楼层为当前建筑楼层的的业务空间id列表
+            val allSpaceIdFilterList = ArrayList<SFilter>()
+            val zoneSpaceBaseTableService = SBaseService(SMybatisDao(ZoneSpace::class.java))
+
+
+            //查出和当前竖井关联并为当前空间类型的的业务空间id
+            val list1 =  rSh2SpService.select(SFilter.eq("projectId",projectId!!),SFilter.eq("Id1",rShContainSpBaseList.shaftId!!),SFilter.eq("zoneType",type)).projection("id2").distinct().exec()
+            for(rShContainSpBase in list1){
+                allSpaceIdList.add(rShContainSpBase.id2!!)
+            }
+            allSpaceIdFilterList.add(SFilter.eq("projectId",projectId!!))
+            allSpaceIdFilterList.add(SFilter.eq("objectType",type))
+            allSpaceIdFilterList.add(SFilter.eq("buildingId",buildingId))
+            allSpaceIdFilterList.add(SFilter.eq("floorId",floorId))
+            if (allSpaceIdList.size>0){
+                allSpaceIdFilterList.add(SFilter.inList("id",allSpaceIdList))
+            }
+            var spaceList = zoneSpaceBaseTableService.select(allSpaceIdFilterList).projection("id").exec()
+            for(zoneSpaceBaseTable in spaceList){
+                spaceIdList.add(zoneSpaceBaseTable.id!!)
+            }
+
+
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            if (spaceIdList.size>0){
+                for(oldSpaceId in spaceIdList){
+                    rSh2SpService.delete("Id1 = '${rShContainSpBaseList.shaftId}' and Id2 = '${oldSpaceId}' and type = 'sh2sp'")
+                }
+            }
+            if (!rShContainSpBaseList.spaceIdList.isNullOrEmpty()){
+                for (spaceId in rShContainSpBaseList.spaceIdList!!){
+                    val rSh2Sp = RSh2Sp()
+                    rSh2Sp.id1 = rShContainSpBaseList.shaftId
+                    rSh2Sp.id2 = spaceId
+                    rSh2Sp.projectId = projectId
+                    rSh2Sp.sign = 1
+                    rSh2Sp.zoneType = type
+                    rSh2Sp.type = "sh2sp"
+                    val replace = rSh2SpService.replace(rSh2Sp)
+                    if (replace){
+                        successList.add(rSh2Sp)
+                    }else{
+                        failureList.add(rSh2Sp)
+                    }
+                }
+                if (successList.size>0){
+                    try {
+                        /** 处理关系标记 */
+                        val listType = ArrayList<String>()
+                        listType.add("sh2bd")
+                        listType.add("eq2sh")
+                        for (type in listType){
+                            val entity = EquipmentService.relationTypeProjectservice.select(SFilter.eq("projectId", projectId!!), SFilter.eq("relationType", type)).entity()
+                            if (entity!=null){
+                                entity.computationalState = 2
+                                EquipmentService.relationTypeProjectservice.update(entity)
+                            }
+                        }
+                    } catch (e: Exception) {
+                        e.printStackTrace()
+                    }
+                    val sCreateResponse = SCreateResponse<RShContainSpBaseList>(SResponseType.success)
+                    if (failureList.size>0){
+                        sCreateResponse.message ="失败对象:"+failureList.toJson()
+                    }
+                    sCreateResponse
+                }else{
+                    SCreateResponse(SResponseType.failure)
+                }
+            }else{
+                SCreateResponse(SResponseType.success)
+            }
+
+//            if (type == "HeatingZone"){
+//                RShContainSpZoneHeatingService.createShSpsReplace(spaceIdList,rShContainSpBaseList)
+//            }else if (type == "CleanZone"){
+//                RShContainSpZoneCleanService.createShSpsReplace(spaceIdList,rShContainSpBaseList)
+//            }else if (type == "DomesticWaterSupplyZone"){
+//                RShContainSpZoneDomesticWaterSupplyService.createShSpsReplace(spaceIdList,rShContainSpBaseList)
+//            }else if (type == "NetworkZone" ){
+//                RShContainSpZoneNetworkService.createShSpsReplace(spaceIdList,rShContainSpBaseList)
+//            }else if (type == "TenantZone"){
+//                RShContainSpZoneTenantService.createShSpsReplace(spaceIdList,rShContainSpBaseList)
+//            }else if (type == "AirConditioningZone"){
+//                RShContainSpZoneAirConditioningService.createShSpsReplace(spaceIdList,rShContainSpBaseList)
+//            }else if (type == "FunctionZone"){
+//                RShContainSpZoneFunctionService.createShSpsReplace(spaceIdList,rShContainSpBaseList)
+//            }else if (type == "FireZone"){
+//                RShContainSpZoneFireService.createShSpsReplace(spaceIdList,rShContainSpBaseList)
+//            }else if (type == "SecurityZone"){
+//                RShContainSpZoneSecurityService.createShSpsReplace(spaceIdList,rShContainSpBaseList)
+//            }else if (type == "GeneralZone"){
+//                RShContainSpZoneGeneralService.createShSpsReplace(spaceIdList,rShContainSpBaseList)
+//            }else if (type == "PowerSupplyZone"){
+//                RShContainSpZonePowerSupplyService.createShSpsReplace(spaceIdList,rShContainSpBaseList)
+//            }else if (type == "LightingZone"){
+//                RShContainSpZoneLightingService.createShSpsReplace(spaceIdList,rShContainSpBaseList)
+//            }else{
+//                val sCreateResponse = SCreateResponse<RShContainSpBaseList>(SResponseType.failure)
+//                sCreateResponse.message = "空间分区类型不存在:$type"
+//                sCreateResponse
+//            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    }
+
+    /**
+     * 查询空间类型和名称
+     */
+    fun spaceTypeQuery(projectId: String, shaftId: String): SQueryResponse<SpaceInfoDic> {
+        return try {
+            var request = SQueryRequest()
+            val service = SBaseService(SMybatisDao(SpaceInfoDic::class.java))
+            val queryBuilder = service.select(request.filters)
+            queryBuilder.tableName = "public.f_get_sh_space_type('$projectId','$shaftId')"
+            val pageQuery = queryBuilder.pageQuery(1, 1000)
+            SQueryResponse(pageQuery)
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure, e.message!!)
+        }
+    } //  Fun spaceTypeQuery
+
+
+} // Object RShContainSpBaseService

+ 247 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/RShaftThroughShaftService.kt

@@ -0,0 +1,247 @@
+package com.persagy.server.services.rel
+
+import com.persagy.server.services.base.RService
+import com.persagy.server.datacenter.models.entities.rel.RShaftThroughShaft
+import com.persagy.server.datacenter.models.entities.rel.RShaftThroughShaftOtherList
+import com.persagy.server.services.objects.EquipmentService
+import com.sybotan.base.extensions.toJson
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import org.json.JSONObject
+
+/**
+ * 竖井的贯通关系服务
+ *
+ * @author 付国宝
+ */
+object RShaftThroughShaftService : RService<RShaftThroughShaft>(SMybatisDao(RShaftThroughShaft::class.java)) {
+
+    /**
+     * 创建竖井的贯通关系
+     *
+     * @param   rFlThroughFl    竖井的贯通关系对象
+     */
+    fun create(rFlThroughFl: RShaftThroughShaft): SCreateResponse<RShaftThroughShaft> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            rFlThroughFl.projectId = projectId
+            val isInsert = insert(rFlThroughFl)
+            if (isInsert){
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "11")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rFlThroughFl.shaftId)
+                jsonObject.put("obj_type", "Sh2Sh")
+                jsonObject.put("linkId",rFlThroughFl.shaftOtherId)
+
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+//                kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "Sh2Sh", "11", IdUtils.uuidCreate(),  rFlThroughFl.shaftId!!,
+//                        rFlThroughFl.shaftOtherId!!),false)
+                SCreateResponse(SResponseType.success)
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e: Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Tenant create()
+
+    /**
+     * 根据对象删除
+     *
+     * @param   rFlThroughFl    关系对象实例
+     */
+    fun deletes(rFlThroughFl: RShaftThroughShaft): SBaseResponse {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val isDelete = delete(rFlThroughFl)
+
+            val rShaftThroughShaft = RShaftThroughShaft()
+            rShaftThroughShaft.shaftId = rFlThroughFl.shaftOtherId
+            rShaftThroughShaft.shaftOtherId = rFlThroughFl.shaftId
+            val isDeletes = delete(rShaftThroughShaft)
+            /** 删除成功 */
+            if (isDelete||isDeletes) {
+
+                try {
+                    /** 处理关系标记 */
+                    val listType = ArrayList<String>()
+                    listType.add("sh2sh")
+                    for (type in listType){
+                        val entity = EquipmentService.relationTypeProjectservice.select(SFilter.eq("projectId", projectId!!), SFilter.eq("relationType", type)).entity()
+                        if (entity!=null){
+                            entity.computationalState = 2
+                            EquipmentService.relationTypeProjectservice.update(entity)
+                        }
+                    }
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+                val jsonObject = JSONObject()
+                jsonObject.put("type", "12")
+                jsonObject.put("projectId", projectId)
+                jsonObject.put("id", rFlThroughFl.shaftId)
+                jsonObject.put("obj_type", "Sh2Sh")
+                jsonObject.put("linkId",rFlThroughFl.shaftOtherId)
+
+                /** 发送消息 */
+                messageHandler.sendMessage(jsonObject.toString())
+//                kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "Sh2Sh", "12", IdUtils.uuidCreate(),  rFlThroughFl.shaftId!!,
+//                        rFlThroughFl.shaftOtherId!!),false)
+                val sBaseResponse = SBaseResponse(SResponseType.success)
+                sBaseResponse.message = rFlThroughFl.toJson()
+                sBaseResponse
+            } else {
+                SBaseResponse(SResponseType.failure)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure, e.message!!)
+        }
+    } // Tenant deletes()
+
+    /**
+     * 创建竖井的贯通关系
+     *
+     * @param   rFloorThroughFloorOtherList    竖井和竖井列表关系对象
+     */
+    fun createShaft(rFloorThroughFloorOtherList: RShaftThroughShaftOtherList): SCreateResponse<RShaftThroughShaft> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+
+            try {
+                delete("floorId = '${rFloorThroughFloorOtherList.shaftId}'")
+                delete("floorOtherId = '${rFloorThroughFloorOtherList.shaftId}'")
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            val projectId = SPageContext.getHeader("ProjectId")
+            if (rFloorThroughFloorOtherList.shaftOtherIdList!=null&&rFloorThroughFloorOtherList.shaftOtherIdList!!.isNotEmpty()){
+                for (floorOtherId in rFloorThroughFloorOtherList.shaftOtherIdList!!){
+                    val rFlThroughFl = RShaftThroughShaft()
+                    rFlThroughFl.shaftId = rFloorThroughFloorOtherList.shaftId
+                    rFlThroughFl.shaftOtherId = floorOtherId
+                    rFlThroughFl.projectId = projectId
+                    val replace = replace(rFlThroughFl)
+                    if (replace){
+                        successList.add(rFlThroughFl)
+                    }else{
+                        failureList.add(rFlThroughFl)
+                    }
+                }
+                if (successList.size>0){
+                    val jsonObject = JSONObject()
+                    jsonObject.put("type", "13")
+                    jsonObject.put("projectId", projectId)
+                    jsonObject.put("id", rFloorThroughFloorOtherList.shaftId)
+                    jsonObject.put("obj_type", "Sh2Sh")
+                    jsonObject.put("linkId",successList.toJson())
+                    /** 发送消息 */
+                    messageHandler.sendMessage(jsonObject.toString())
+//                    kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "Sh2Sh", "13", IdUtils.uuidCreate(),  rFloorThroughFloorOtherList.shaftId!!, null),false)
+                    val sCreateResponse = SCreateResponse<RShaftThroughShaft>(SResponseType.success)
+                    if (failureList.size>0){
+                        sCreateResponse.message ="失败对象:"+failureList.toJson()
+                    }
+                    sCreateResponse
+                }else{
+                    SCreateResponse(SResponseType.failure)
+                }
+            }else{
+                SCreateResponse(SResponseType.success)
+            }
+
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Tenant createShaft()
+
+
+    /**
+     * 创建竖井的贯通关系
+     *
+     * @param   rFloorThroughFloorOtherList    竖井和竖井列表关系对象
+     */
+    fun createShaftAll(rFloorThroughFloorOtherList: RShaftThroughShaftOtherList): SCreateResponse<RShaftThroughShaft> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+
+            try {
+//                delete("floorId = '${rFloorThroughFloorOtherList.shaftId}'")
+//                delete("floorOtherId = '${rFloorThroughFloorOtherList.shaftId}'")
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+            val projectId = SPageContext.getHeader("ProjectId")
+            if (rFloorThroughFloorOtherList.shaftOtherIdList!=null&&rFloorThroughFloorOtherList.shaftOtherIdList!!.isNotEmpty()){
+                for (floorOtherId in rFloorThroughFloorOtherList.shaftOtherIdList!!){
+                    val rFlThroughFl = RShaftThroughShaft()
+                    rFlThroughFl.shaftId = rFloorThroughFloorOtherList.shaftId
+                    rFlThroughFl.shaftOtherId = floorOtherId
+                    rFlThroughFl.projectId = projectId
+                    val replace = replace(rFlThroughFl)
+                    if (replace){
+                        successList.add(rFlThroughFl)
+                    }else{
+                        failureList.add(rFlThroughFl)
+                    }
+                }
+                if (successList.size>0){
+
+                    try {
+                        /** 处理关系标记 */
+                        val listType = ArrayList<String>()
+                        listType.add("sh2sh")
+                        for (type in listType){
+                            val entity = EquipmentService.relationTypeProjectservice.select(SFilter.eq("projectId", projectId!!), SFilter.eq("relationType", type)).entity()
+                            if (entity!=null){
+                                entity.computationalState = 2
+                                EquipmentService.relationTypeProjectservice.update(entity)
+                            }
+                        }
+                    } catch (e: Exception) {
+                        e.printStackTrace()
+                    }
+
+                    val jsonObject = JSONObject()
+                    jsonObject.put("type", "14")
+                    jsonObject.put("projectId", projectId)
+                    jsonObject.put("id", rFloorThroughFloorOtherList.shaftId)
+                    jsonObject.put("obj_type", "Sh2Sh")
+                    jsonObject.put("linkId",successList.toJson())
+                    /** 发送消息 */
+                    messageHandler.sendMessage(jsonObject.toString())
+//                    kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "Sh2Sh", "14", IdUtils.uuidCreate(),  rFloorThroughFloorOtherList.shaftId!!, null),false)
+                    val sCreateResponse = SCreateResponse<RShaftThroughShaft>(SResponseType.success)
+                    if (failureList.size>0){
+                        sCreateResponse.message ="失败对象:"+failureList.toJson()
+                    }
+                    sCreateResponse
+                }else{
+                    SCreateResponse(SResponseType.failure)
+                }
+            }else{
+                SCreateResponse(SResponseType.success)
+            }
+
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Tenant createShaftAll()
+
+
+} // Object RShaftThroughShaftService()

+ 37 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/RSp2SiService.kt

@@ -0,0 +1,37 @@
+package com.persagy.server.services.rel
+
+import cn.sagacloud.server.synchronize.MessageHandler
+import com.persagy.server.datacenter.models.entities.rel.RSp2Si
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.utils.SSpringContextUtil
+import org.json.JSONObject
+
+/**
+ * 业务空间和元空间的关系
+ */
+object RSp2SiService: SObjectService<RSp2Si>(SMybatisDao(RSp2Si::class.java)) {
+
+    /** MQ消息对象 */
+    val messageHandler by lazy {
+        SSpringContextUtil.getBean(MessageHandler::class.java) as MessageHandler
+    }
+
+    override fun onDeleteSuccess(rEqInSpZoneLightingList: ArrayList<RSp2Si>) {
+        val projectId = SPageContext.getHeader("ProjectId")
+        for(rEqInSpZoneLighting in rEqInSpZoneLightingList){
+            val jsonObject = JSONObject()
+            jsonObject.put("type", "12")
+            jsonObject.put("projectId", projectId)
+            jsonObject.put("id", rEqInSpZoneLighting.id1)
+            jsonObject.put("obj_type", "ElementSptoSpace")
+            jsonObject.put("linkId",rEqInSpZoneLighting.id2)
+
+            /** 发送消息 */
+            messageHandler.sendMessage(jsonObject.toString())
+//            kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "EquipinSpace", "12", IdUtils.uuidCreate(), rEqInSpZoneLighting.spaceId!!, rEqInSpZoneLighting.equipId),false)
+        }
+    } // Fun onDeleteSuccess
+
+} //  Object REq2SpService

+ 31 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/RSpContainShBaseList.kt

@@ -0,0 +1,31 @@
+package com.persagy.server.services.rel
+
+import com.alibaba.fastjson.annotation.JSONField
+import com.sybotan.service.models.SBaseEntity
+import io.swagger.annotations.ApiModel
+import io.swagger.annotations.ApiModelProperty
+
+/**
+ * 竖井下的业务空间  一对多  一个业务空间对应多个竖井
+ *
+ * @author 付国宝
+ */
+@ApiModel(description = "竖井下的业务空间")
+open class RSpContainShBaseList : SBaseEntity() {
+
+    /** 业务空间id */
+    @ApiModelProperty(value = "业务空间id")
+    @JSONField(name = "SpaceId")
+    var spaceId: String? = null
+
+    /** 竖井id列表 */
+    @ApiModelProperty(value = "竖井id列表")
+    @JSONField(name = "ShaftIdList")
+    var shaftIdList: ArrayList<String>? = null
+
+    /** 业务空间类型 */
+    @ApiModelProperty(value = "业务空间类型")
+    @JSONField(name = "ZoneType")
+    var zoneType: String? = null
+
+} // Class RSpContainShBaseList

+ 139 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/RSpInBdService.kt

@@ -0,0 +1,139 @@
+package com.persagy.server.services.rel
+
+import com.persagy.server.datacenter.models.entities.rel.RSpinBd
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.requests.SUpdateRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+
+/**
+ * 业务空间所在的建筑
+ *
+ * @author 张维新
+ */
+object RSpInBdService: SObjectService<RSpinBd>(SMybatisDao(RSpinBd::class.java)) {
+
+    /**
+     * 创建业务空间和建筑的关系
+     */
+    fun  spInBdCreates(rSiInSpBase: SCreateRequest<RSpinBd>): SCreateResponse<RSpinBd> {
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val contentList = rSiInSpBase.content
+            if (contentList.isNotEmpty()){
+                for (rSpinBd in contentList){
+
+                    if (!rSpinBd.objectType.isNullOrEmpty()){
+                        rSpinBd.projectId = projectId
+                        val insert = insert(rSpinBd)
+                        if (insert){
+                            /** 关系创建成功 */
+
+                        }
+                    }else{
+                        val sCreateResponse = SCreateResponse<RSpinBd>(SResponseType.failure)
+                        sCreateResponse.message = "空间类型不能为空"
+                        return  sCreateResponse
+                    }
+
+                }
+                val sCreateResponse = SCreateResponse<RSpinBd>(SResponseType.success)
+                return sCreateResponse
+            }else{
+                val sCreateResponse = SCreateResponse<RSpinBd>(SResponseType.failure)
+                sCreateResponse.message = "列表不可以为空"
+                return sCreateResponse
+            }
+
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function spInBdCreates()
+
+
+    /**
+     * 删除业务空间也建筑的关系
+     */
+    fun spInBdDeLs(rSpinBdList: ArrayList<RSpinBd>): SBaseResponse {
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            if (!rSpinBdList.isNullOrEmpty()){
+                for (rSpinBd in rSpinBdList){
+                    if (!rSpinBd.spaceId.isNullOrEmpty()&&!rSpinBd.buildingId.isNullOrEmpty()){
+                        rSpinBd.projectId = projectId
+                        val delete = delete(rSpinBd)
+                        if (delete){
+                            /** 删除成功 */
+                        }
+                    }else{
+                        val sBaseResponse = SBaseResponse(SResponseType.failure)
+                        sBaseResponse.message = "spaceId和buildingId 不可以为空"
+                        return sBaseResponse
+                    }
+                }
+                return SBaseResponse(SResponseType.success)
+            }else{
+                val sBaseResponse = SBaseResponse(SResponseType.failure)
+                sBaseResponse.message = "列表不能为空"
+                return sBaseResponse
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function spInBdDeLs()
+
+    /**
+     * 修改业务空间所在的建筑
+     */
+    fun spInBdUpdates(request: SUpdateRequest<RSpinBd>): SBaseResponse{
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val contentList = request.content
+            if (!contentList.isNullOrEmpty()){
+
+                for (content in contentList){
+                    if (!content.buildingId.isNullOrEmpty()&&!content.spaceId.isNullOrEmpty()&&!content.objectType.isNullOrEmpty()){
+
+                        try {
+                            val delete = delete(SFilter.eq("projectId", projectId!!), SFilter.eq("SpaceId", content.spaceId!!))
+                            if (delete){
+                                /** 删除原始的空间和建筑的数据 */
+
+                            }
+                        } catch (e: Exception) {
+                            e.printStackTrace()
+                        }
+
+                        val insert = insert(content)
+                        if (insert){
+                            /** 添加关系 */
+                        }
+
+                    }else{
+                        val sBaseResponse = SBaseResponse(SResponseType.failure)
+                        sBaseResponse.message = "buildingId、spaceId、objectType 不能为空"
+                        return sBaseResponse
+                    }
+                }
+                return SBaseResponse(SResponseType.success)
+            }else{
+                val sBaseResponse = SBaseResponse(SResponseType.failure)
+                sBaseResponse.message = "列表不能为空"
+                return sBaseResponse
+            }
+
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure,e.message.toString())
+        }
+
+    } // Function spInBdUpdates()
+
+} // Object RSpInBdService

+ 155 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/RSpInFlService.kt

@@ -0,0 +1,155 @@
+package com.persagy.server.services.rel
+
+import com.persagy.server.datacenter.models.entities.rel.RSpinBd
+import com.persagy.server.datacenter.models.entities.rel.RSpinFl
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.requests.SUpdateRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+
+/**
+ * 业务空间所在的楼层
+ *
+ * @author 张维新
+ */
+object RSpInFlService: SObjectService<RSpinFl>(SMybatisDao(RSpinFl::class.java)) {
+
+    /**
+     * 创建业务空间和建筑、楼层的关系
+     * 未明确楼层 1 和 未明确建筑 1
+     *
+     */
+    fun  spInBdOrFlCreates(rSiInSpBase: SCreateRequest<RSpinFl>): SCreateResponse<RSpinFl> {
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val contentList = rSiInSpBase.content
+            if (contentList.isNotEmpty()){
+                for (rSpinFl in contentList){
+
+                    if (rSpinFl.objectType.isNullOrEmpty()){
+                        val sCreateResponse = SCreateResponse<RSpinFl>(SResponseType.failure)
+                        sCreateResponse.message = "空间类型不能为空"
+                        return  sCreateResponse
+                    }
+                    /** 建筑关系  */
+                    if (!rSpinFl.objectType.isNullOrEmpty()&&!rSpinFl.buildingId.isNullOrEmpty()&&!rSpinFl.spaceId.isNullOrEmpty()&&rSpinFl.buildingId!="1"){
+                        try {
+                            val rSpinBd = RSpinBd()
+                            rSpinBd.projectId = projectId
+                            rSpinBd.spaceId = rSpinFl.spaceId
+                            rSpinBd.buildingId = rSpinFl.buildingId
+                            rSpinBd.objectType = rSpinFl.objectType
+                            RSpInBdService.insert(rSpinBd)
+                        } catch (e: Exception) {
+                            e.printStackTrace()
+                        }
+                    }
+                    /** 楼层关系 */
+                    if (!rSpinFl.objectType.isNullOrEmpty()&&!rSpinFl.floorId.isNullOrEmpty()&&!rSpinFl.spaceId.isNullOrEmpty()&&rSpinFl.floorId!="1"){
+                        rSpinFl.projectId = projectId
+                        try {
+                            val insert = insert(rSpinFl)
+                            if (insert){
+                                /** 关系创建成功 */
+                            }
+                        } catch (e: Exception) {
+                            e.printStackTrace()
+                        }
+                    }
+                }
+                val sCreateResponse = SCreateResponse<RSpinFl>(SResponseType.success)
+                return sCreateResponse
+            }else{
+                val sCreateResponse = SCreateResponse<RSpinFl>(SResponseType.failure)
+                sCreateResponse.message = "列表不可以为空"
+                return sCreateResponse
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function spInBdOrFlCreates()
+
+    /**
+     * 删除业务空间也楼层的关系
+     */
+    fun spInBdDeLs(rSpinBdList: ArrayList<RSpinFl>): SBaseResponse {
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            if (!rSpinBdList.isNullOrEmpty()){
+                for (rSpinBd in rSpinBdList){
+                    if (!rSpinBd.spaceId.isNullOrEmpty()&&!rSpinBd.floorId.isNullOrEmpty()){
+                        rSpinBd.projectId = projectId
+                        val delete = delete(rSpinBd)
+                        if (delete){
+                            /** 删除成功 */
+                        }
+                    }else{
+                        val sBaseResponse = SBaseResponse(SResponseType.failure)
+                        sBaseResponse.message = "spaceId和buildingId 不可以为空"
+                        return sBaseResponse
+                    }
+                }
+                return SBaseResponse(SResponseType.success)
+            }else{
+                val sBaseResponse = SBaseResponse(SResponseType.failure)
+                sBaseResponse.message = "列表不能为空"
+                return sBaseResponse
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function spInBdDeLs()
+
+    /**
+     * 修改业务空间所在的楼层
+     */
+    fun spInBdUpdates(request: SUpdateRequest<RSpinFl>): SBaseResponse{
+        try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val contentList = request.content
+            if (!contentList.isNullOrEmpty()){
+
+                for (content in contentList){
+                    if (!content.floorId.isNullOrEmpty()&&!content.spaceId.isNullOrEmpty()&&!content.objectType.isNullOrEmpty()){
+
+                        try {
+                            val delete = delete(SFilter.eq("projectId", projectId!!), SFilter.eq("SpaceId", content.spaceId!!))
+                            if (delete){
+                                /** 删除原始的空间和建筑的数据 */
+
+                            }
+                        } catch (e: Exception) {
+                            e.printStackTrace()
+                        }
+
+                        val insert = insert(content)
+                        if (insert){
+                            /** 添加关系 */
+                        }
+
+                    }else{
+                        val sBaseResponse = SBaseResponse(SResponseType.failure)
+                        sBaseResponse.message = "buildingId、spaceId、objectType 不能为空"
+                        return sBaseResponse
+                    }
+                }
+                return SBaseResponse(SResponseType.success)
+            }else{
+                val sBaseResponse = SBaseResponse(SResponseType.failure)
+                sBaseResponse.message = "列表不能为空"
+                return sBaseResponse
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function spInBdUpdates()
+
+} // Object RSpInBdService

+ 481 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/RSpInSiBaseService.kt

@@ -0,0 +1,481 @@
+package com.persagy.server.services.rel
+
+import cn.sagacloud.server.synchronize.MessageHandler
+import com.persagy.server.datacenter.models.entities.rel.RSiInSpBase
+import com.persagy.server.datacenter.models.entities.rel.RSiInSpBaseList
+import com.persagy.server.datacenter.models.entities.rel.RSp2Si
+import com.persagy.server.datacenter.models.entities.rel.RSpInSiBaseList
+import com.sybotan.base.extensions.toJson
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import com.sybotan.service.utils.SSpringContextUtil
+import org.json.JSONObject
+
+/**
+ * 业务空间内的元空间关系服务
+ *
+ * @author 付国宝
+ */
+object RSpInSiBaseService: SObjectService<RSiInSpBase>(SMybatisDao(RSiInSpBase::class.java)) {
+
+    /** MQ消息对象 */
+    val messageHandler by lazy {
+        SSpringContextUtil.getBean(MessageHandler::class.java) as MessageHandler
+    }
+
+    /**
+     * 创建业务空间内的元空间关系
+     *
+     * @param   rSiInSpBase    业务空间内的元空间关系对象
+     */
+    fun createLists(type: String, rSiInSpBaseList: SCreateRequest<RSiInSpBase>): SCreateResponse<RSiInSpBase> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+
+            for (rSpInSiBase in rSiInSpBaseList.content){
+                val rSp2Si = RSp2Si()
+
+                rSp2Si.projectId = projectId
+                rSp2Si.id1 = rSpInSiBase.spaceId
+                rSp2Si.id2 = rSpInSiBase.ispaceId
+                rSp2Si.zoneType = type
+                rSp2Si.sign = 1
+                rSp2Si.type = "si2sp"
+                val isInsert = RSp2SiService.insert(rSp2Si)
+                if (isInsert){
+                    val jsonObject = JSONObject()
+                    jsonObject.put("type", "11")
+                    jsonObject.put("projectId", projectId)
+                    jsonObject.put("id", rSpInSiBase.spaceId)
+                    jsonObject.put("obj_type", "ElementSptoSpace")
+                    jsonObject.put("linkId",rSpInSiBase.ispaceId)
+
+                    /** 发送消息 */
+                    messageHandler.sendMessage(jsonObject.toString())
+
+//                    kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "ElementSptoSpace", "11", IdUtils.uuidCreate(),  rSpInSiZoneHeating.spaceId!!, rSpInSiZoneHeating.ispaceId!!),false)
+
+//                    val rDataCenterLog = RDataCenterLog()
+//                    rDataCenterLog.projectId = projectId
+//                    rDataCenterLog.fromId = rSpInSiZoneHeating.spaceId
+//                    rDataCenterLog.toId = rSpInSiZoneHeating.ispaceId
+//                    rDataCenterLog.objectType = "ElementSptoSpace"
+//                    rDataCenterLogService.insert(rDataCenterLog)
+
+                }else{
+
+                }
+            }
+            SCreateResponse(SResponseType.success)
+
+//            if (type == "HeatingZone"){
+//                RSpInSiZoneHeatingService.create(rSiInSpBaseList.content)
+//            }else if (type == "CleanZone"){
+//                RSpInSiZoneCleanService.create(rSiInSpBaseList.content)
+//            }else if (type == "DomesticWaterSupplyZone"){
+//                RSpInSiZoneDomesticWaterSupplyService.create(rSiInSpBaseList.content)
+//            }else if (type == "NetworkZone" ){
+//                RSpInSiZoneNetworkService.create(rSiInSpBaseList.content)
+//            }else if (type == "TenantZone"){
+//                RSpInSiZoneTenantService.create(rSiInSpBaseList.content)
+//            }else if (type == "AirConditioningZone"){
+//                RSpInSiZoneAirConditioningService.create(rSiInSpBaseList.content)
+//            }else if (type == "FunctionZone"){
+//                RSpInSiZoneFunctionService.create(rSiInSpBaseList.content)
+//            }else if (type == "FireZone"){
+//                RSpInSiZoneFireService.create(rSiInSpBaseList.content)
+//            }else if (type == "SecurityZone"){
+//                RSpInSiZoneSecurityService.create(rSiInSpBaseList.content)
+//            }else if (type == "GeneralZone"){
+//                RSpInSiZoneGeneralService.create(rSiInSpBaseList.content)
+//            }else if (type == "PowerSupplyZone"){
+//                RSpInSiZonePowerSupplyService.create(rSiInSpBaseList.content)
+//            }else if (type == "LightingZone"){
+//                RSpInSiZoneLightingService.create(rSiInSpBaseList.content)
+//            }else{
+//                val sCreateResponse = SCreateResponse<RSiInSpBase>(SResponseType.failure)
+//                sCreateResponse.message = "空间分区类型不存在:$type"
+//                sCreateResponse
+//            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function create()
+
+    /**
+     * 根据对象删除
+     *
+     * @param   RSp2Si    关系对象实例
+     * @return
+     */
+    fun deletes(type: String, rSiInSpBaseList: ArrayList<RSiInSpBase>): SBaseResponse {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (rSpInSiBase in rSiInSpBaseList){
+                val rSp2Si = RSp2Si()
+                rSp2Si.id1 = rSpInSiBase.spaceId
+                rSp2Si.id2 = rSpInSiBase.ispaceId
+                rSp2Si.projectId = projectId
+                rSp2Si.type = type
+                rSp2Si.type = "si2sp"
+                val isDelete = RSp2SiService.delete(rSp2Si)
+                if (isDelete) {
+                    val jsonObject = JSONObject()
+                    jsonObject.put("type", "12")
+                    jsonObject.put("projectId", projectId)
+                    jsonObject.put("id", rSpInSiBase.spaceId)
+                    jsonObject.put("obj_type", "ElementSptoSpace")
+                    jsonObject.put("linkId",rSpInSiBase.ispaceId)
+
+                    /** 发送消息 */
+                    messageHandler.sendMessage(jsonObject.toString())
+//                    kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "ElementSptoSpace", "12", IdUtils.uuidCreate(),  rSpInSiZoneHeating.spaceId!!, rSpInSiZoneHeating.ispaceId),false)
+                } else {
+
+                }
+            }
+            val sBaseResponse = SBaseResponse(SResponseType.success)
+            sBaseResponse
+//            if (type == "HeatingZone"){
+//                RSpInSiZoneHeatingService.deletes(rSiInSpBaseList)
+//            }else if (type == "CleanZone"){
+//                RSpInSiZoneCleanService.deletes(rSiInSpBaseList)
+//            }else if (type == "DomesticWaterSupplyZone"){
+//                RSpInSiZoneDomesticWaterSupplyService.deletes(rSiInSpBaseList)
+//            }else if (type == "NetworkZone" ){
+//                RSpInSiZoneNetworkService.deletes(rSiInSpBaseList)
+//            }else if (type == "TenantZone"){
+//                RSpInSiZoneTenantService.deletes(rSiInSpBaseList)
+//            }else if (type == "AirConditioningZone"){
+//                RSpInSiZoneAirConditioningService.deletes(rSiInSpBaseList)
+//            }else if (type == "FunctionZone"){
+//                RSpInSiZoneFunctionService.deletes(rSiInSpBaseList)
+//            }else if (type == "FireZone"){
+//                RSpInSiZoneFireService.deletes(rSiInSpBaseList)
+//            }else if (type == "SecurityZone"){
+//                RSpInSiZoneSecurityService.deletes(rSiInSpBaseList)
+//            }else if (type == "GeneralZone"){
+//                RSpInSiZoneGeneralService.deletes(rSiInSpBaseList)
+//            }else if (type == "PowerSupplyZone"){
+//                RSpInSiZonePowerSupplyService.deletes(rSiInSpBaseList)
+//            }else if (type == "LightingZone"){
+//                RSpInSiZoneLightingService.deletes(rSiInSpBaseList)
+//            }else{
+//                val sCreateResponse = SCreateResponse<RSiInSpBase>(SResponseType.failure)
+//                sCreateResponse.message = "空间分区类型不存在:$type"
+//                sCreateResponse
+//            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function deletes()
+
+    /**
+     * 创建元空间关联业务空间
+     *
+     * @param    rSpInSiBaseList    业务空间内的元空间关系对象列表
+     */
+    fun createSp(type: String,rSpInSiBaseList: RSpInSiBaseList): SCreateResponse<RSiInSpBase> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+//            delete("ispaceId = '${rSpInSiBaseList.ispaceId}'")
+            RSp2SiService.delete("id2 ='${rSpInSiBaseList.ispaceId} ")
+            val projectId = SPageContext.getHeader("ProjectId")
+            if(!rSpInSiBaseList.spaceIdList.isNullOrEmpty()) {
+                for (spaceId in rSpInSiBaseList.spaceIdList!!) {
+                    val rSp2Si = RSp2Si()
+                    rSp2Si.id2 = rSpInSiBaseList.ispaceId
+                    rSp2Si.id1 = spaceId
+                    rSp2Si.projectId = projectId
+                    rSp2Si.sign = 1
+                    rSp2Si.zoneType = type
+                    rSp2Si.type = "si2sp"
+                    val replace = RSp2SiService.replace(rSp2Si)
+                    if (replace) {
+                        successList.add(rSp2Si)
+                    } else {
+                        failureList.add(rSp2Si)
+                    }
+                }
+                if (successList.size > 0) {
+                    val jsonObject = JSONObject()
+                    jsonObject.put("type", "13")
+                    jsonObject.put("projectId", projectId)
+                    jsonObject.put("id", rSpInSiBaseList.ispaceId)
+                    jsonObject.put("obj_type", "ElementSptoSpace")
+                    jsonObject.put("linkId",successList.toJson())
+
+                    /** 发送消息 */
+                    messageHandler.sendMessage(jsonObject.toString())
+
+                    val sCreateResponse = SCreateResponse<RSiInSpBase>(SResponseType.success)
+                    if (failureList.size > 0) {
+                        sCreateResponse.message = "失败对象:" + failureList.toJson()
+                    }
+                    sCreateResponse
+                } else {
+                    SCreateResponse(SResponseType.failure)
+                }
+            }else{
+                SCreateResponse(SResponseType.success)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createSp()
+
+    /**
+     * 创建业务空间内的元空间关系
+     *
+     * @param    rSiInSpBaseList    业务空间内的元空间关系对象列表
+     */
+    fun createsSi(rSiInSpBaseList: RSiInSpBaseList): SCreateResponse<RSiInSpBase> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+//            delete("spaceID = '${rSiInSpBaseList.spaceId}'")
+            RSp2SiService.delete("Id1 = '${rSiInSpBaseList.spaceId}'")
+
+            val projectId = SPageContext.getHeader("ProjectId")
+            if(!rSiInSpBaseList.ispaceIdList.isNullOrEmpty()) {
+                for (ispaceId in rSiInSpBaseList.ispaceIdList!!) {
+                    val rSp2Si = RSp2Si()
+                    rSp2Si.id1 = rSiInSpBaseList.spaceId
+                    rSp2Si.id2 = ispaceId
+                    rSp2Si.projectId = projectId
+                    rSp2Si.zoneType = rSiInSpBaseList.zoneType
+                    rSp2Si.sign = 1
+                    rSp2Si.type = "si2sp"
+                    val replace = RSp2SiService.replace(rSp2Si)
+                    if (replace) {
+                        successList.add(rSp2Si)
+                    } else {
+                        failureList.add(rSp2Si)
+                    }
+                }
+                if (successList.size > 0) {
+                    val jsonObject = JSONObject()
+                    jsonObject.put("type", "13")
+                    jsonObject.put("projectId", projectId)
+                    jsonObject.put("id", rSiInSpBaseList.spaceId)
+                    jsonObject.put("obj_type", "ElementSptoSpace")
+                    jsonObject.put("linkId",successList.toJson())
+
+                    /** 发送消息 */
+                    messageHandler.sendMessage(jsonObject.toString())
+                    if (failureList.size > 0) {
+                        val sCreateResponse = SCreateResponse<RSiInSpBase>(SResponseType.success)
+                        sCreateResponse.message = "失败对象:" + failureList.toJson()
+                        sCreateResponse
+                    } else {
+                        val sCreateResponse = SCreateResponse<RSiInSpBase>(SResponseType.success)
+                        sCreateResponse
+                    }
+                } else {
+                    SCreateResponse(SResponseType.failure)
+                }
+            }else{
+                SCreateResponse(SResponseType.success)
+            }
+        } catch (e:Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createsSi()
+
+    /**
+     * 创建业务空间内的元空间关系
+     *
+     * @param    rSiInSpBaseList    元空间和业务空间关系的对象列表
+     */
+    fun createsSpSi(type: String,rSiInSpBaseList: RSiInSpBaseList): SCreateResponse<RSiInSpBaseList> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            val projectId = SPageContext.getHeader("ProjectId")
+            if(!rSiInSpBaseList.ispaceIdList.isNullOrEmpty()) {
+                for (ispaceId in rSiInSpBaseList.ispaceIdList!!) {
+                    val rSp2Si = RSp2Si()
+                    rSp2Si.id1 = rSiInSpBaseList.spaceId
+                    rSp2Si.id2 = ispaceId
+                    rSp2Si.projectId = projectId
+                    rSp2Si.zoneType = type
+                    rSp2Si.sign = 1
+                    rSp2Si.type = "si2sp"
+                    val replace = RSp2SiService.insert(rSp2Si)
+                    if (replace) {
+                        successList.add(rSp2Si)
+                    } else {
+                        failureList.add(rSp2Si)
+                    }
+                }
+                if (successList.size > 0) {
+                    val jsonObject = JSONObject()
+                    jsonObject.put("type", "14")
+                    jsonObject.put("projectId", projectId)
+                    jsonObject.put("id", rSiInSpBaseList.spaceId)
+                    jsonObject.put("obj_type", "ElementSptoSpace")
+                    jsonObject.put("linkId",successList.toJson())
+
+                    /** 发送消息 */
+                    messageHandler.sendMessage(jsonObject.toString())
+//                    kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "ElementSptoSpace", "14", IdUtils.uuidCreate(),  rSiInSpZoneHeatingList.spaceId!!, null),false)
+                    if (failureList.size > 0) {
+                        val sCreateResponse = SCreateResponse<RSiInSpBaseList>(SResponseType.success)
+                        sCreateResponse.message = "失败对象:" + failureList.toJson()
+                        sCreateResponse
+                    } else {
+                        val sCreateResponse = SCreateResponse<RSiInSpBaseList>(SResponseType.success)
+                        sCreateResponse
+                    }
+                } else {
+                    SCreateResponse(SResponseType.failure)
+                }
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+
+//            if (type == "HeatingZone"){
+//                RSpInSiZoneHeatingService.createsSiSp(rSiInSpBaseList)
+//            }else if (type == "CleanZone"){
+//                RSpInSiZoneCleanService.createsSiSp(rSiInSpBaseList)
+//            }else if (type == "DomesticWaterSupplyZone"){
+//                RSpInSiZoneDomesticWaterSupplyService.createsSiSp(rSiInSpBaseList)
+//            }else if (type == "NetworkZone" ){
+//                RSpInSiZoneNetworkService.createsSiSp(rSiInSpBaseList)
+//            }else if (type == "TenantZone"){
+//                RSpInSiZoneTenantService.createsSiSp(rSiInSpBaseList)
+//            }else if (type == "AirConditioningZone"){
+//                RSpInSiZoneAirConditioningService.createsSiSp(rSiInSpBaseList)
+//            }else if (type == "FunctionZone"){
+//                RSpInSiZoneFunctionService.createsSiSp(rSiInSpBaseList)
+//            }else if (type == "FireZone"){
+//                RSpInSiZoneFireService.createsSiSp(rSiInSpBaseList)
+//            }else if (type == "SecurityZone"){
+//                RSpInSiZoneSecurityService.createsSiSp(rSiInSpBaseList)
+//            }else if (type == "GeneralZone"){
+//                RSpInSiZoneGeneralService.createsSiSp(rSiInSpBaseList)
+//            }else if (type == "PowerSupplyZone"){
+//                RSpInSiZonePowerSupplyService.createsSiSp(rSiInSpBaseList)
+//            }else if (type == "LightingZone"){
+//                RSpInSiZoneLightingService.createsSiSp(rSiInSpBaseList)
+//            }else{
+//                val sCreateResponse = SCreateResponse<RSiInSpBaseList>(SResponseType.failure)
+//                sCreateResponse.message = "空间分区类型不存在:$type"
+//                sCreateResponse
+//            }
+        } catch (e:Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createsSpSi()
+
+    /**
+     * 创建业务空间内的元空间关系
+     *
+     * @param    rSiInSpBaseList    元空间和业务空间关系的对象列表
+     */
+    fun createsSp(type: String,rSiInSpBaseList: RSiInSpBaseList): SCreateResponse<RSiInSpBaseList> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            RSp2SiService.delete(SFilter.eq("projectId",projectId!!),SFilter.eq("id1",rSiInSpBaseList.spaceId!!),SFilter.eq("type","si2sp"))
+//            RSp2SiService.delete("id1 = '${rSiInSpBaseList.spaceId}'")
+
+            if(!rSiInSpBaseList.ispaceIdList.isNullOrEmpty()) {
+                for (ispaceId in rSiInSpBaseList.ispaceIdList!!) {
+                    val rSp2Si = RSp2Si()
+                    rSp2Si.id1 = rSiInSpBaseList.spaceId
+                    rSp2Si.id2 = ispaceId
+                    rSp2Si.projectId = projectId
+                    rSp2Si.sign = 1
+                    rSp2Si.zoneType = type
+                    rSp2Si.type = "si2sp"
+                    val replace = RSp2SiService.replace(rSp2Si)
+                    if (replace) {
+                        successList.add(rSp2Si)
+                    } else {
+                        failureList.add(rSp2Si)
+                    }
+                }
+                if (successList.size > 0) {
+                    val jsonObject = JSONObject()
+                    jsonObject.put("type", "13")
+                    jsonObject.put("projectId", projectId)
+                    jsonObject.put("id", rSiInSpBaseList.spaceId)
+                    jsonObject.put("obj_type", "ElementSptoSpace")
+                    jsonObject.put("linkId",successList.toJson())
+
+                    /** 发送消息 */
+                    messageHandler.sendMessage(jsonObject.toString())
+//                    kafkaService.sendNotice("datacenterrel", RelationNotice(projectId!!, "ElementSptoSpace", "13", IdUtils.uuidCreate(),  rSiInSpZoneHeatingList.spaceId!!, null),false)
+                    if (failureList.size > 0) {
+                        val sCreateResponse = SCreateResponse<RSiInSpBaseList>(SResponseType.success)
+                        sCreateResponse.message = "失败对象:" + failureList.toJson()
+                        sCreateResponse
+                    } else {
+                        val sCreateResponse = SCreateResponse<RSiInSpBaseList>(SResponseType.success)
+                        sCreateResponse
+                    }
+                } else {
+                    SCreateResponse(SResponseType.failure)
+                }
+            }else{
+                SCreateResponse(SResponseType.success)
+            }
+
+//            if (type == "HeatingZone"){
+//                RSpInSiZoneHeatingService.createsSi(rSiInSpBaseList)
+//            }else if (type == "CleanZone"){
+//                RSpInSiZoneCleanService.createsSi(rSiInSpBaseList)
+//            }else if (type == "DomesticWaterSupplyZone"){
+//                RSpInSiZoneDomesticWaterSupplyService.createsSi(rSiInSpBaseList)
+//            }else if (type == "NetworkZone" ){
+//                RSpInSiZoneNetworkService.createsSi(rSiInSpBaseList)
+//            }else if (type == "TenantZone"){
+//                RSpInSiZoneTenantService.createsSi(rSiInSpBaseList)
+//            }else if (type == "AirConditioningZone"){
+//                RSpInSiZoneAirConditioningService.createsSi(rSiInSpBaseList)
+//            }else if (type == "FunctionZone"){
+//                RSpInSiZoneFunctionService.createsSi(rSiInSpBaseList)
+//            }else if (type == "FireZone"){
+//                RSpInSiZoneFireService.createsSi(rSiInSpBaseList)
+//            }else if (type == "SecurityZone"){
+//                RSpInSiZoneSecurityService.createsSi(rSiInSpBaseList)
+//            }else if (type == "GeneralZone"){
+//                RSpInSiZoneGeneralService.createsSi(rSiInSpBaseList)
+//            }else if (type == "PowerSupplyZone"){
+//                RSpInSiZonePowerSupplyService.createsSi(rSiInSpBaseList)
+//            }else if (type == "LightingZone"){
+//                RSpInSiZoneLightingService.createsSi(rSiInSpBaseList)
+//            }else{
+//                val sCreateResponse = SCreateResponse<RSiInSpBaseList>(SResponseType.failure)
+//                sCreateResponse.message = "空间分区类型不存在:$type"
+//                sCreateResponse
+//            }
+        } catch (e:Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createsSpSi()
+
+} // Object RSpInSiBaseService

+ 135 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/RSpatialConnectionService.kt

@@ -0,0 +1,135 @@
+package com.persagy.server.services.rel
+
+import com.persagy.server.datacenter.models.entities.rel.RSpatialConnection
+import com.persagy.server.services.objects.ZoneSpaceBaseService
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.requests.SCreateRequest
+import com.sybotan.service.models.requests.SQueryRequest
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+import com.sybotan.service.models.responses.SQueryResponse
+import org.slf4j.LoggerFactory
+
+/**
+ * 空间关系
+ *
+ * @author 张维新
+ */
+object RSpatialConnectionService : SObjectService<RSpatialConnection>(SMybatisDao(RSpatialConnection::class.java)) {
+
+    private val logger = LoggerFactory.getLogger(RSpatialConnectionService::class.java)
+
+    /**
+     * 创建
+     */
+    fun create(rSiInSpBase: SCreateRequest<RSpatialConnection>): SCreateResponse<RSpatialConnection> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val contentList = rSiInSpBase.content
+            if (contentList.size > 0) {
+                for (content in contentList) {
+                    content.projectId = projectId!!
+                        logger.debug("项目id =${content.projectId}")
+                    if (content.graphType.isNullOrEmpty() || content.floorId.isNullOrEmpty()) {
+                        val sCreateResponse = SCreateResponse<RSpatialConnection>(SResponseType.failure)
+                        sCreateResponse.message = "请检查数据的完整性"
+                        return sCreateResponse
+                    }
+
+                    if (content.zoneType.isNullOrEmpty()) {
+                        val zoneSpace = ZoneSpaceBaseService.select(SFilter.eq("id", content.spaceIdOne!!)).entity()
+                        if (zoneSpace != null) {
+                            content.zoneType = zoneSpace.objectType
+                        }
+                    }
+                    val insert = replace(content)
+                    if (insert) {
+                    }
+                }
+                val sCreateResponse = SCreateResponse<RSpatialConnection>(SResponseType.success)
+                sCreateResponse.entityList = contentList
+                return sCreateResponse
+            } else {
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure, e.message.toString())
+        }
+
+
+    } // Fun onCreateBefore()
+
+    /**
+     * 查询
+     */
+    fun pageQuerys(request: SQueryRequest): SQueryResponse<RSpatialConnection> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val filter = select(request.filters).filter(SFilter.eq("projectId", projectId!!)).exec()
+            val sQueryResponse = SQueryResponse<RSpatialConnection>(SResponseType.success)
+            sQueryResponse.total = filter.size.toLong()
+            sQueryResponse.content = filter
+            sQueryResponse
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SQueryResponse(SResponseType.failure)
+        }
+    } //
+
+    /**
+     * 删除
+     */
+    fun  delete(idList: ArrayList<RSpatialConnection>): SBaseResponse {
+        return try {
+            if (idList.size>0){
+                val projectId = SPageContext.getHeader("ProjectId")
+                for (rSpatialConnection in idList){
+                    try {
+                        delete(SFilter.eq("zoneType",rSpatialConnection.zoneType!!),SFilter.eq("graphType",rSpatialConnection.graphType!!),SFilter.eq("projectId",projectId!!),SFilter.eq("spaceIdOne",rSpatialConnection.spaceIdOne!!),SFilter.eq("spaceIdTwo",rSpatialConnection.spaceIdTwo!!))
+                    } catch (e: Exception) {
+                        e.printStackTrace()
+                    }
+
+                    try {
+                        delete(SFilter.eq("zoneType",rSpatialConnection.zoneType!!),SFilter.eq("graphType",rSpatialConnection.graphType!!),SFilter.eq("projectId",projectId!!),SFilter.eq("spaceIdOne",rSpatialConnection.spaceIdTwo!!),SFilter.eq("spaceIdTwo",rSpatialConnection.spaceIdOne!!))
+                    } catch (e: Exception) {
+                        e.printStackTrace()
+                    }
+                }
+                SBaseResponse(SResponseType.success)
+            }else{
+                SBaseResponse(SResponseType.failure)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SBaseResponse(SResponseType.failure)
+        }
+
+    } //
+
+
+    /**
+     * 删除某个楼层下的数据
+     */
+    fun  deleteFloor(rSpatialConnection: RSpatialConnection): SBaseResponse {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            delete(SFilter.eq("graphType",rSpatialConnection.graphType!!),SFilter.eq("projectId",projectId!!),SFilter.eq("floorId",rSpatialConnection.floorId!!),SFilter.eq("zoneType",rSpatialConnection.zoneType!!))
+
+            SBaseResponse(SResponseType.success)
+
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SBaseResponse(SResponseType.failure)
+        }
+
+    } //
+
+
+
+} // Object RSpatialConnectionService

+ 148 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/RSyForBdService.kt

@@ -0,0 +1,148 @@
+package com.persagy.server.services.rel
+
+import com.persagy.server.datacenter.models.entities.rel.RBdForSyList
+import com.persagy.server.datacenter.models.entities.rel.RSyForBd
+import com.persagy.server.datacenter.models.entities.rel.RSyForBdList
+import com.persagy.server.services.base.RService
+import com.sybotan.base.extensions.toJson
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+
+/**
+ * 系统服务于建筑关系服务
+ *
+ * @author 付国宝
+ */
+object RSyForBdService: RService<RSyForBd>(SMybatisDao(RSyForBd::class.java)){
+
+    /**
+     * 创建系统服务于建筑关系
+     *
+     * @param   rSyForBd    系统服务于建筑关系对象
+     */
+    fun create(rSyForBd: RSyForBd): SCreateResponse<RSyForBd> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            rSyForBd.projectId = projectId
+            val isInsert = insert(rSyForBd)
+            if (isInsert){
+                SCreateResponse(SResponseType.success)
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e: Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } //Function create()
+
+    /**
+     * 根据对象删除
+     *
+     * @param    rSyForBd     关系对象实例
+     * @return
+     */
+    fun deletes(rSyForBd: RSyForBd): SBaseResponse {
+        return try {
+            val isDelete = delete(rSyForBd)
+            /** 删除成功 */
+            if (isDelete) {
+                val sBaseResponse = SBaseResponse(SResponseType.success)
+                sBaseResponse.message = rSyForBd.toJson()
+                sBaseResponse
+            } else {
+                SBaseResponse(SResponseType.failure)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function deletes()
+
+    /**
+     * 创建系统服务于建筑关系
+     *
+     * @param    rSyForBdList     系统和建筑关系的对象列表
+     */
+    fun createSy(rSyForBdList: RSyForBdList): SCreateResponse<RSyForBd> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            delete("sysID = '${rSyForBdList.sysId}'")
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (buildingId in rSyForBdList.buildingIdList!!){
+                val rSyForBd = RSyForBd()
+                rSyForBd.sysId = rSyForBdList.sysId
+                rSyForBd.buildingId = buildingId
+                rSyForBd.projectId = projectId
+                val replace = replace(rSyForBd)
+                if (replace){
+                    successList.add(rSyForBd)
+                }else{
+                    failureList.add(rSyForBd)
+                }
+            }
+            if (successList.size>0){
+                val sCreateResponse = SCreateResponse<RSyForBd>(SResponseType.success)
+                if (failureList.size>0){
+                    sCreateResponse.message ="失败对象:"+failureList.toJson()
+                }
+                sCreateResponse
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createSy()
+
+    /**
+     * 创建服务于建筑的系统关系
+     *
+     * @param    rBdForSyList    系统和建筑关系的对象列表
+     */
+    fun createsBd(rBdForSyList: RBdForSyList): SCreateResponse<RSyForBd> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            delete("buildingID = '${rBdForSyList.buildingId}'")
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (sysId in rBdForSyList.sysIdList!!){
+                val rSyForBd = RSyForBd()
+                rSyForBd.buildingId = rBdForSyList.buildingId
+                rSyForBd.sysId = sysId
+                rSyForBd.projectId = projectId
+                val replace = replace(rSyForBd)
+                if (replace){
+                    successList.add(rSyForBd)
+                }else{
+                    failureList.add(rSyForBd)
+                }
+            }
+            if (successList.size>0){
+                if (failureList.size>0){
+                    val sCreateResponse = SCreateResponse<RSyForBd>(SResponseType.success)
+                    sCreateResponse.message ="失败对象:"+failureList.toJson()
+                    sCreateResponse
+                }else{
+                    val sCreateResponse = SCreateResponse<RSyForBd>(SResponseType.success)
+                    sCreateResponse
+                }
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e:Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createsBd()
+
+} // Object RSyForBdService

+ 148 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/RSyForFlService.kt

@@ -0,0 +1,148 @@
+package com.persagy.server.services.rel
+
+import com.persagy.server.datacenter.models.entities.rel.RFlForSyList
+import com.persagy.server.datacenter.models.entities.rel.RSyForFl
+import com.persagy.server.datacenter.models.entities.rel.RSyForFlList
+import com.persagy.server.services.base.RService
+import com.sybotan.base.extensions.toJson
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+
+/**
+ * 系统服务于楼层关系服务
+ *
+ * @author 付国宝
+ */
+object RSyForFlService: RService<RSyForFl>(SMybatisDao(RSyForFl::class.java)){
+
+    /**
+     * 创建系统服务于楼层关系
+     *
+     * @param   rSyForFl    系统服务于楼层关系对象
+     */
+    fun create(rSyForFl: RSyForFl):SCreateResponse<RSyForFl> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            rSyForFl.projectId = projectId
+            val isInsert = insert(rSyForFl)
+            if(isInsert){
+                SCreateResponse(SResponseType.success)
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e: Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure, e.message.toString())
+        }
+    } // Function create()
+
+    /**
+     * 根据对象删除
+     *
+     * @param    rSyForFl    关系对象实例
+     * @return
+     */
+    fun deletes(rSyForFl: RSyForFl): SBaseResponse {
+        return try {
+            val isDelete = delete(rSyForFl)
+            /** 删除成功 */
+            if (isDelete){
+                val sBaseResponse = SBaseResponse(SResponseType.success)
+                sBaseResponse.message = rSyForFl.toJson()
+                sBaseResponse
+            }else{
+                SBaseResponse(SResponseType.failure)
+            }
+        } catch (e: Exception){
+            e.printStackTrace()
+            SBaseResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function deletes()
+
+    /**
+     * 创建系统服务于楼层关系
+     *
+     * @param    rSyForFlList    系统和楼层关系的对象列表
+     */
+    fun createSy(rSyForFlList: RSyForFlList): SCreateResponse<RSyForFl> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            delete("sysID = '${rSyForFlList.sysId}'")
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (floorId in rSyForFlList.floorIdList!!){
+                val rSyForFl = RSyForFl()
+                rSyForFl.sysId = rSyForFlList.sysId
+                rSyForFl.floorId = floorId
+                rSyForFl.projectId = projectId
+                val replace = replace(rSyForFl)
+                if (replace){
+                    successList.add(rSyForFl)
+                }else{
+                    failureList.add(rSyForFl)
+                }
+            }
+            if(successList.size > 0){
+                val sCreateResponse = SCreateResponse<RSyForFl>(SResponseType.success)
+                if (failureList.size > 0){
+                    sCreateResponse.message = "失败对象:" + failureList.toJson()
+                }
+                sCreateResponse
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        }catch (e: Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure, e.message.toString())
+        }
+    } // Function createSy()
+
+    /**
+     * 创建服务于楼层的系统关系
+     *
+     * @param   rSyForFlList    系统和楼层对应关系列表
+     */
+    fun createsFl(rSyForFlList: RFlForSyList): SCreateResponse<RSyForFl> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            delete("floorID = '${rSyForFlList.floorId}'")
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (sysId in rSyForFlList.sysIdList!!){
+                val rSyForFl = RSyForFl()
+                rSyForFl.floorId = rSyForFlList.floorId
+                rSyForFl.sysId = sysId
+                rSyForFl.projectId = projectId
+                val replace = replace(rSyForFl)
+                if (replace){
+                    successList.add(rSyForFl)
+                }else{
+                    failureList.add(rSyForFl)
+                }
+            }
+            if (successList.size > 0 ){
+                if (failureList.size > 0){
+                    val sCreateResponse = SCreateResponse<RSyForFl>(SResponseType.success)
+                    sCreateResponse.message = "失败对象" + failureList.toJson()
+                    sCreateResponse
+                }else{
+                    val sCreateResponse = SCreateResponse<RSyForFl>(SResponseType.failure)
+                    sCreateResponse
+                }
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        }catch (e:Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure, e.message.toString())
+        }
+    } // Function createsFl()
+
+} // Object RSyForFlService

+ 147 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/RSyForShService.kt

@@ -0,0 +1,147 @@
+package com.persagy.server.services.rel
+
+import com.persagy.server.datacenter.models.entities.rel.RShForSyList
+import com.persagy.server.datacenter.models.entities.rel.RSyForSh
+import com.persagy.server.datacenter.models.entities.rel.RSyForShList
+import com.persagy.server.services.base.RService
+import com.sybotan.base.extensions.toJson
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+
+/**
+ * 系统服务于竖井关系服务
+ *
+ * @author 付国宝
+ */
+object RSyForShService: RService<RSyForSh>(SMybatisDao(RSyForSh::class.java)) {
+    /**
+     * 创建系统服务于竖井关系
+     *
+     * @param   rSyForSh    系统服务于竖井关系对象
+     */
+    fun create(rSyForSh: RSyForSh): SCreateResponse<RSyForSh> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            rSyForSh.projectId = projectId
+            val isInsert = insert(rSyForSh)
+            if(isInsert){
+                SCreateResponse(SResponseType.success)
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e: Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure, e.message.toString())
+        }
+    } // Function create()
+
+    /**
+     * 根据对象删除
+     *
+     * @param    rSyForSh    关系对象实例
+     * @return
+     */
+    fun deletes(rSyForSh: RSyForSh): SBaseResponse {
+        return try {
+            val isDelete = delete(rSyForSh)
+            /** 删除成功 */
+            if (isDelete){
+                val sBaseResponse = SBaseResponse(SResponseType.success)
+                sBaseResponse.message = rSyForSh.toJson()
+                sBaseResponse
+            }else{
+                SBaseResponse(SResponseType.failure)
+            }
+        } catch (e: Exception){
+            e.printStackTrace()
+            SBaseResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function deletes()
+
+    /**
+     * 创建系统服务于竖井关系
+     *
+     * @param    rSyForShList    系统和竖井关系的对象列表
+     */
+    fun createSy(rSyForShList: RSyForShList): SCreateResponse<RSyForSh> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            delete("sysID = '${rSyForShList.sysId}'")
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (shaftId in rSyForShList.shaftIdList!!){
+                val rSyForSh = RSyForSh()
+                rSyForSh.sysId = rSyForShList.sysId
+                rSyForSh.shaftId = shaftId
+                rSyForSh.projectId = projectId
+                val replace = replace(rSyForSh)
+                if (replace){
+                    successList.add(rSyForSh)
+                }else{
+                    failureList.add(rSyForSh)
+                }
+            }
+            if(successList.size > 0){
+                val sCreateResponse = SCreateResponse<RSyForSh>(SResponseType.success)
+                if (failureList.size > 0){
+                    sCreateResponse.message = "失败对象:" + failureList.toJson()
+                }
+                sCreateResponse
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        }catch (e: Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure, e.message.toString())
+        }
+    } // Function createSy()
+
+    /**
+     * 创建服务于竖井的系统关系
+     *
+     * @param   rSyForShList    系统和竖井对应关系列表
+     */
+    fun createsSh(rSyForShList: RShForSyList): SCreateResponse<RSyForSh> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            delete("shaftID = '${rSyForShList.shaftId}'")
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (sysId in rSyForShList.sysIdList!!){
+                val rSyForSh = RSyForSh()
+                rSyForSh.shaftId = rSyForShList.shaftId
+                rSyForSh.sysId = sysId
+                rSyForSh.projectId = projectId
+                val replace = replace(rSyForSh)
+                if (replace){
+                    successList.add(rSyForSh)
+                }else{
+                    failureList.add(rSyForSh)
+                }
+            }
+            if (successList.size > 0 ){
+                if (failureList.size > 0){
+                    val sCreateResponse = SCreateResponse<RSyForSh>(SResponseType.success)
+                    sCreateResponse.message = "失败对象" + failureList.toJson()
+                    sCreateResponse
+                }else{
+                    val sCreateResponse = SCreateResponse<RSyForSh>(SResponseType.failure)
+                    sCreateResponse
+                }
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        }catch (e:Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure, e.message.toString())
+        }
+    } // Function createsFl()
+
+} // Object RSyForShService

+ 177 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/RSyForSpBaseService.kt

@@ -0,0 +1,177 @@
+package com.persagy.server.services.rel
+
+import com.persagy.server.datacenter.models.entities.rel.RSpForSyBaseList
+import com.persagy.server.datacenter.models.entities.rel.RSy2Sp
+import com.persagy.server.datacenter.models.entities.rel.RSyForSpBase
+import com.persagy.server.datacenter.models.entities.rel.RSyForSpBaseList
+import com.persagy.server.services.objects.ZoneSpaceBaseService
+import com.sybotan.base.extensions.toJson
+import com.sybotan.database.SFilter
+import com.sybotan.mybatis.SMybatisDao
+import com.sybotan.service.SBaseService
+import com.sybotan.service.SObjectService
+import com.sybotan.service.SPageContext
+import com.sybotan.service.models.enums.SResponseType
+import com.sybotan.service.models.responses.SBaseResponse
+import com.sybotan.service.models.responses.SCreateResponse
+
+/**
+ * 系统服务于业务空间关系服务
+ *
+ * @author 付国宝
+ */
+object RSyForSpBaseService: SBaseService<RSyForSpBase>(SMybatisDao(RSyForSpBase::class.java)) {
+
+    var rSy2SpService = SObjectService(SMybatisDao( RSy2Sp::class.java))
+    /**
+     * 创建系统服务于业务空间关系
+     *
+     * @param   rSyForSpBase    系统服务于业务空间关系对象
+     */
+    fun create(rSyForSpBase: RSyForSpBase): SCreateResponse<RSyForSpBase> {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            rSyForSpBase.projectId = projectId
+            val rSy2Sp = RSy2Sp()
+            rSy2Sp.id1 = rSyForSpBase.sysId
+            rSy2Sp.id2 = rSyForSpBase.spaceId
+            rSy2Sp.zoneType = rSyForSpBase.objectType
+            rSy2Sp.sign = 1
+            rSy2Sp.projectId = projectId
+            rSy2Sp.type = "sy2sp_for"
+            val isInsert = rSy2SpService.insert(rSy2Sp)
+            if (isInsert){
+                SCreateResponse(SResponseType.success)
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function create()
+
+    /**
+     * 根据对象删除
+     *
+     * @param   rSyForSpBase    关系对象实例
+     * @return
+     */
+    fun deletes(rSyForSpBase: RSyForSpBase): SBaseResponse {
+        return try {
+            val projectId = SPageContext.getHeader("ProjectId")
+            val entity = ZoneSpaceBaseService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("id", rSyForSpBase.spaceId!!)).entity()
+            val rSy2Sp = RSy2Sp()
+            rSy2Sp.id1 = rSyForSpBase.sysId
+            rSy2Sp.id2 = rSyForSpBase.spaceId
+            rSy2Sp.projectId = projectId
+            rSy2Sp.type = "sy2sp_for"
+            rSy2Sp.zoneType = entity!!.objectType
+            val isDelete =rSy2SpService.delete(rSy2Sp)
+            /** 删除成功 */
+            if (isDelete) {
+                val sBaseResponse = SBaseResponse(SResponseType.success)
+                sBaseResponse.message = rSyForSpBase.toJson()
+                sBaseResponse
+            } else {
+                SBaseResponse(SResponseType.failure)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return SBaseResponse(SResponseType.failure, e.message!!)
+        }
+    } // Function deletes()
+
+    /**
+     * 创建系统服务于业务空间关系
+     *
+     * @param   rSyForSpBaseList    系统服务于业务空间关系对象列表
+     */
+    fun createSy(rSyForSpBaseList: RSyForSpBaseList): SCreateResponse<RSyForSpBase> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            rSy2SpService.delete("id1 = '${rSyForSpBaseList.sysId}'")
+            val projectId = SPageContext.getHeader("ProjectId")
+            for (spaceId in rSyForSpBaseList.spaceIdList!!){
+                val entity = ZoneSpaceBaseService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("id", spaceId!!)).entity()
+                val rSy2Sp = RSy2Sp()
+                rSy2Sp.id1 = rSyForSpBaseList.sysId
+                rSy2Sp.id2 = spaceId
+                rSy2Sp.zoneType = entity!!.objectType
+                rSy2Sp.sign = 1
+                rSy2Sp.projectId = projectId
+                rSy2Sp.type = "sy2sp_for"
+                val replace = rSy2SpService.replace(rSy2Sp)
+                if (replace){
+                    successList.add(rSy2Sp)
+                }else{
+                    failureList.add(rSy2Sp)
+                }
+            }
+            if (successList.size>0){
+                val sCreateResponse = SCreateResponse<RSyForSpBase>(SResponseType.success)
+                if (failureList.size>0){
+                    sCreateResponse.message ="失败对象:"+failureList.toJson()
+                }
+                sCreateResponse
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createSy()
+
+    /**
+     * 创建服务于业务空间的系统关系
+     *
+     * @param   rSyForSpBaseList    服务于业务空间的系统关系对象列表
+     */
+    fun createsSp(rSyForSpBaseList: RSpForSyBaseList): SCreateResponse<RSyForSpBase> {
+        return try {
+            /** 成功集合 */
+            val successList = ArrayList<Any>()
+            /** 失败集合 */
+            val failureList = ArrayList<Any>()
+            val projectId = SPageContext.getHeader("ProjectId")
+            rSy2SpService.delete("id2 = '${rSyForSpBaseList.spaceId}'")
+            val entity = ZoneSpaceBaseService.select(SFilter.eq("projectId", projectId!!), SFilter.eq("id", rSyForSpBaseList.spaceId!!)).entity()
+
+            for (sysId in rSyForSpBaseList.sysIdList!!){
+                val rSy2Sp = RSy2Sp()
+                rSy2Sp.id2 = rSyForSpBaseList.spaceId
+                rSy2Sp.id1 = sysId
+                rSy2Sp.projectId = projectId
+                rSy2Sp.zoneType = entity!!.objectType
+                rSy2Sp.sign = 1
+                rSy2Sp.type = "sy2sp_for"
+                val replace = rSy2SpService.replace(rSy2Sp)
+                if (replace){
+                    successList.add(rSy2Sp)
+                }else{
+                    failureList.add(rSy2Sp)
+                }
+            }
+            if (successList.size>0){
+                if (failureList.size>0){
+                    val sCreateResponse = SCreateResponse<RSyForSpBase>(SResponseType.success)
+                    sCreateResponse.message ="失败对象:"+failureList.toJson()
+                    sCreateResponse
+                }else{
+                    val sCreateResponse = SCreateResponse<RSyForSpBase>(SResponseType.success)
+                    sCreateResponse
+                }
+            }else{
+                SCreateResponse(SResponseType.failure)
+            }
+        } catch (e:Exception){
+            e.printStackTrace()
+            SCreateResponse(SResponseType.failure,e.message.toString())
+        }
+    } // Function createsSp()
+
+} // Object RSyForSpBaseService

+ 0 - 0
data-center/src/main/kotlin/com/persagy/server/services/rel/RSyInBdService.kt


Vissa filer visades inte eftersom för många filer har ändrats