slowslo 3 лет назад
Сommit
90ccb85968
100 измененных файлов с 7032 добавлено и 0 удалено
  1. 36 0
      .gitignore
  2. 12 0
      README.md
  3. 36 0
      env_files/properties/dev.properties
  4. 35 0
      env_files/properties/prod.properties
  5. 35 0
      env_files/properties/test.properties
  6. 300 0
      pom.xml
  7. 21 0
      sptg-ad/pom.xml
  8. 35 0
      sptg-ad/sptg-ad-api/pom.xml
  9. 77 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/constant/AdSecurityToken.java
  10. 29 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/dto/AdAdsenseDto.java
  11. 34 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/dto/AdContentDto.java
  12. 27 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/dto/AdMaterialDto.java
  13. 41 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/dto/AdOfflinePushRecordDto.java
  14. 46 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/dto/AdPushAppDto.java
  15. 25 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/dto/AdPushDeviceDetailsDto.java
  16. 40 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/dto/AdPushTaskDto.java
  17. 55 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/dto/AdTypeDto.java
  18. 141 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdAdsense.java
  19. 176 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdContent.java
  20. 49 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdContentImg.java
  21. 121 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdMaterial.java
  22. 172 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdOfflinePushRecord.java
  23. 147 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdPushApp.java
  24. 94 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdPushContent.java
  25. 49 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdPushContentImg.java
  26. 21 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdPushDeviceDetails.java
  27. 177 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdPushTask.java
  28. 42 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdPushTaskDetails.java
  29. 51 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdPushThresholdValue.java
  30. 71 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdType.java
  31. 114 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/DeviceAdvert.java
  32. 142 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/DeviceAdvertStatistics.java
  33. 120 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/EarlyWarning.java
  34. 51 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/ThresholdConfig.java
  35. 89 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/AdAdsenseFeign.java
  36. 80 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/AdContentFeign.java
  37. 63 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/AdMaterialFeign.java
  38. 70 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/AdOfflinePushRecordFeign.java
  39. 86 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/AdPushAppFeign.java
  40. 47 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/AdPushDeviceDetailsFeign.java
  41. 147 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/AdPushTaskFeign.java
  42. 89 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/AdTypeFeign.java
  43. 43 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/DeviceAdvertFeign.java
  44. 35 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/EarlyWarningFeign.java
  45. 61 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/ThresholdConfigFeign.java
  46. 72 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/fallback/AdAdsenseFeignFallbackFactory.java
  47. 64 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/fallback/AdContentFeignFallbackFactory.java
  48. 61 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/fallback/AdMaterialFeignFallbackFactory.java
  49. 65 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/fallback/AdOfflinePushRecordFeignFallbackFactory.java
  50. 72 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/fallback/AdPushAppFeignFallbackFactory.java
  51. 40 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/fallback/AdPushDeviceDetailsFallbackFactory.java
  52. 105 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/fallback/AdPushTaskFeignFallbackFactory.java
  53. 72 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/fallback/AdTypeFeignFallbackFactory.java
  54. 19 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/stream/AdvertTaskCallbackProduceInterface.java
  55. 22 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/stream/SyncFaceAdvertDataProduceInterface.java
  56. 22 0
      sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/stream/SyncLeisureAdvertDataProduceInterface.java
  57. 86 0
      sptg-ad/sptg-ad-biz/pom.xml
  58. 46 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/AdApplication.java
  59. 31 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/cfgbeans/MyBatisPlusConfigBean.java
  60. 73 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/AdAdsenseController.java
  61. 105 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/AdContentController.java
  62. 64 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/AdMaterialController.java
  63. 65 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/AdOfflinePushRecordController.java
  64. 76 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/AdPushAppController.java
  65. 109 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/AdPushDeviceDetailsController.java
  66. 128 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/AdPushTaskController.java
  67. 82 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/AdTypeController.java
  68. 62 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/DeviceAdvertController.java
  69. 94 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/EarlyWarningController.java
  70. 77 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/ThresholdConfigController.java
  71. 32 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdAdsenseMapper.java
  72. 15 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdContentImgMapper.java
  73. 42 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdContentMapper.java
  74. 25 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdMaterialMapper.java
  75. 35 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdOfflinePushRecordMapper.java
  76. 15 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdPushAppMapper.java
  77. 15 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdPushContentImgMapper.java
  78. 38 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdPushContentMapper.java
  79. 16 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdPushDeviceDetailsMapper.java
  80. 15 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdPushTaskDetailsMapper.java
  81. 54 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdPushTaskMapper.java
  82. 15 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdPushThresholdValueMapper.java
  83. 15 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdTypeMapper.java
  84. 15 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/DeviceAdvertMapper.java
  85. 14 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/DeviceAdvertStatisticsMapper.java
  86. 15 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/EarlyWarningMapper.java
  87. 13 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/ThresholdConfigMapper.java
  88. 225 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/quartz/AdvertQuartzTask.java
  89. 207 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/quartz/DeviceAdvertStatisticsQuartzTask.java
  90. 153 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/quartz/EarlyWarningQuartzTask.java
  91. 111 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/receiver/AdvertTaskCallbackReceiver.java
  92. 65 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/receiver/DeviceAddReceiver.java
  93. 55 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/receiver/OrgDeleteReceiver.java
  94. 34 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/receiver/OrgModifyNameReceiver.java
  95. 50 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/receiver/OrgTransferReceiver.java
  96. 204 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/receiver/SyncFaceAdvertDataDeviceReceiver.java
  97. 202 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/receiver/SyncLeisureAdvertDataDeviceReceiver.java
  98. 74 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/service/AdAdsenseServiceInterface.java
  99. 42 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/service/AdContentImgServiceInterface.java
  100. 77 0
      sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/service/AdContentServiceInterface.java

+ 36 - 0
.gitignore

@@ -0,0 +1,36 @@
+
+# Eclipse
+.project
+.classpath
+.settings/
+
+#maven
+target/
+dependency-reduced-pom.xml
+pom.xml.versionsBackup
+.factorypath
+
+out/
+
+# Gradel
+.gradle/
+build/
+
+# IDEA
+.idea/
+*.ipr
+*.iml
+*.iws
+*.yml
+*.jar
+
+# temp ignore
+*.log
+*.cache
+*.diff
+*.patch
+*.tmp
+sql
+.txlcn
+
+*.mv.db

+ 12 - 0
README.md

@@ -0,0 +1,12 @@
+# 配置本地hosts
+~~~
+127.0.0.1  smart-house-eureka
+127.0.0.1  smart-house-mysql
+127.0.0.1  smart-house-redis
+127.0.0.1  smart-house-rabbitmq
+127.0.0.1  smart-house-config
+127.0.0.1  smart-house-lcn
+127.0.0.1  fast-dfs-server
+~~~
+
+

+ 36 - 0
env_files/properties/dev.properties

@@ -0,0 +1,36 @@
+#jdbc
+mvn.spring.datasource.host=smart-house-mysql
+mvn.spring.datasource.port=3306
+mvn.spring.datasource.username=root
+mvn.spring.datasource.password=root@123456
+
+#redis
+mvn.spring.redis.host=smart-house-redis
+mvn.spring.redis.port=6379
+mvn.spring.redis.password=
+mvn.spring.redis.database=12
+
+# RabbitMq
+mvn.spring.rabbitmq.host=smart-house-rabbitmq
+mvn.spring.rabbitmq.port=5672
+mvn.spring.rabbitmq.username=guest
+mvn.spring.rabbitmq.password=guest
+mvn.spring.rabbitmq.virtual-host=smart-house-dev
+
+#亲邻接口
+mvn.qinlin.api.host=https://test-gateway.qinlinkeji.com
+mvn.qinlin.version=v1
+mvn.qinlin.appid=QCxTKDxQf4WH8Wmk
+mvn.qinlin.app.secret=DiReTxz4SWhmiKX3wrEiAmDaRb3sjsN0
+
+#数据库
+mysql.database.ad=cyzh_ad
+mysql.database.estate=cyzh_estate
+mysql.database.device=cyzh_device
+mysql.database.permissions=cyzh_permissions
+mysql.database.statistics=cyzh_statistics
+mysql.database.pay=cyzh_pay
+mysql.database.iot=cyzh_iot
+mysql.database.lcn=cyzh_lcn
+mysql.database.third=cyzh_third
+mysql.database.video-cloud=cyzh_video_cloud

+ 35 - 0
env_files/properties/prod.properties

@@ -0,0 +1,35 @@
+#jdbc
+mvn.spring.datasource.host=szsq-boot-mysql
+mvn.spring.datasource.port=3306
+mvn.spring.datasource.username=root
+mvn.spring.datasource.password=szsq_db@Szsq123
+
+#redis
+mvn.spring.redis.host=szsq-boot-redis
+mvn.spring.redis.port=6379
+mvn.spring.redis.password=
+
+# RabbitMq
+mvn.spring.rabbitmq.host=szsq-boot-rabbitmq
+mvn.spring.rabbitmq.port=5672
+mvn.spring.rabbitmq.username=guest
+mvn.spring.rabbitmq.password=2e564ee5-d9ed-11e9-bab6-0242ac170005
+mvn.spring.rabbitmq.virtual-host=szsq-boot
+
+#亲邻接口
+mvn.qinlin.api.host=https://gateway.qinlinkeji.com
+mvn.qinlin.version=v1
+mvn.qinlin.appid=QCxTKDxQf4WH8Wmk
+mvn.qinlin.app.secret=DiReTxz4SWhmiKX3wrEiAmDaRb3sjsN0
+
+#数据库
+mysql.database.ad=sptg_ad
+mysql.database.estate=sptg_estate
+mysql.database.device=sptg_device
+mysql.database.permissions=sptg_permissions
+mysql.database.statistics=sptg_statistics
+mysql.database.pay=sptg_pay
+mysql.database.iot=sptg_iot
+mysql.database.lcn=lcn_tx_manager
+mysql.database.third=sptg_third
+mysql.database.video-cloud=sptg_video_cloud

+ 35 - 0
env_files/properties/test.properties

@@ -0,0 +1,35 @@
+#jdbc
+mvn.spring.datasource.host=192.168.0.197
+mvn.spring.datasource.port=3306
+mvn.spring.datasource.username=root
+mvn.spring.datasource.password=szsq_test_db2@Szsq123
+
+#redis
+mvn.spring.redis.host=192.168.0.185
+mvn.spring.redis.port=6379
+mvn.spring.redis.password=
+
+# RabbitMq
+mvn.spring.rabbitmq.host=192.168.0.185
+mvn.spring.rabbitmq.port=5672
+mvn.spring.rabbitmq.username=guest
+mvn.spring.rabbitmq.password=guest
+mvn.spring.rabbitmq.virtual-host=szsq-test
+
+#亲邻接口
+mvn.qinlin.api.host=https://test-gateway.qinlinkeji.com
+mvn.qinlin.version=v1
+mvn.qinlin.appid=QCxTKDxQf4WH8Wmk
+mvn.qinlin.app.secret=DiReTxz4SWhmiKX3wrEiAmDaRb3sjsN0
+
+#数据库
+mysql.database.ad=sptg-ad
+mysql.database.estate=sptg-estate
+mysql.database.device=sptg-device
+mysql.database.permissions=sptg-permissions
+mysql.database.statistics=sptg-statistics
+mysql.database.pay=sptg-pay
+mysql.database.iot=sptg-iot
+mysql.database.lcn=lcn_tx_manager
+mysql.database.third=sptg-third
+mysql.database.video-cloud=sptg_video_cloud

+ 300 - 0
pom.xml

@@ -0,0 +1,300 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.sptg</groupId>
+    <artifactId>smart-house</artifactId>
+    <packaging>pom</packaging>
+    <version>1.0</version>
+    <modules>
+        <module>sptg-eureka</module>
+        <module>sptg-api-gateway</module>
+        <module>sptg-config</module>
+        <module>sptg-common</module>
+        <module>sptg-gateway</module>
+        <module>sptg-pay</module>
+        <module>sptg-permissions</module>
+        <module>sptg-device</module>
+        <module>sptg-estate</module>
+        <module>sptg-ad</module>
+        <module>sptg-statistics</module>
+        <module>sptg-tx-manager</module>
+        <module>sptg-iot</module>
+        <module>sptg-video-cloud</module>
+        <module>sptg-third</module>
+    </modules>
+
+    <properties>
+        <!-- 编码 -->
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <!-- Maven 编译版本 -->
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
+
+        <!-- Mysql -->
+        <mysql.version>8.0.11</mysql.version>
+        <!-- Spring Boot -->
+        <spring-boot-dependencies.version>2.0.7.RELEASE</spring-boot-dependencies.version>
+        <!-- Spring Cloud -->
+        <spring-cloud-dependencies.version>Finchley.SR2</spring-cloud-dependencies.version>
+
+        <!-- lombok -->
+        <lombok.version>1.18.2</lombok.version>
+        <!-- mybatis-plus -->
+        <mbp.boot.version>2.3</mbp.boot.version>
+        <!-- druid 数据源 -->
+        <druid.version>1.1.9</druid.version>
+        <!-- Apache工具组件  -->
+        <commons-io.version>2.6</commons-io.version>
+        <commons-fileupload.version>1.3.1</commons-fileupload.version>
+        <commons-codec.version>1.11</commons-codec.version>
+        <poi.version>3.17</poi.version>
+        <poi-ooxml.version>3.17</poi-ooxml.version>
+        <easyexcel.version>1.1.2-beta5</easyexcel.version>
+        <!-- FastDfs 客户端 -->
+        <fastdfs-client.version>1.26.3</fastdfs-client.version>
+        <!-- Lcn 分布式事务框架 -->
+        <lcn-tx.version>5.0.2.RELEASE</lcn-tx.version>
+    </properties>
+	<distributionManagement>
+        <repository>
+            <id>nexus-releases</id>
+            <name>ReleasesProxy</name>
+            <url>http://800pharm.7766.org:9081/repository/maven-releases/</url>
+        </repository>
+        <snapshotRepository>
+	        <id>nexus-snapshots</id>
+	        <url>http://800pharm.7766.org:9081/repository/maven-snapshots/</url>
+        </snapshotRepository>
+    </distributionManagement>
+    <!-- 依赖管理 -->
+    <dependencyManagement>
+        <dependencies>
+            <!-- https://mvnrepository.com/artifact/net.sf.json-lib/json-lib -->
+            <dependency>
+                <groupId>net.sf.json-lib</groupId>
+                <artifactId>json-lib</artifactId>
+                <version>2.4</version>
+            </dependency>
+
+            <!-- LCN 分布式事务服务端 -->
+            <dependency>
+                <groupId>com.codingapi.txlcn</groupId>
+                <artifactId>txlcn-tm</artifactId>
+                <version>${lcn-tx.version}</version>
+            </dependency>
+            <!-- LCN 分布式事务客户端 -->
+            <dependency>
+                <groupId>com.codingapi.txlcn</groupId>
+                <artifactId>txlcn-tc</artifactId>
+                <version>${lcn-tx.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.codingapi.txlcn</groupId>
+                <artifactId>txlcn-txmsg-netty</artifactId>
+                <version>${lcn-tx.version}</version>
+            </dependency>
+            <!-- FastDfs 客户端 -->
+            <dependency>
+                <groupId>com.github.tobato</groupId>
+                <artifactId>fastdfs-client</artifactId>
+                <version>${fastdfs-client.version}</version>
+            </dependency>
+            <!-- Mysql -->
+            <dependency>
+                <groupId>mysql</groupId>
+                <artifactId>mysql-connector-java</artifactId>
+                <version>${mysql.version}</version>
+            </dependency>
+            <!-- Spring Boot -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot-dependencies.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <!-- Spring Cloud -->
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring-cloud-dependencies.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <!-- Lombok -->
+            <dependency>
+                <groupId>org.projectlombok</groupId>
+                <artifactId>lombok</artifactId>
+                <version>${lombok.version}</version>
+                <scope>provided</scope>
+            </dependency>
+
+            <!-- mybatis-plus -->
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-core</artifactId>
+                <version>${mbp.boot.version}</version>
+                <scope>compile</scope>
+            </dependency>
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-boot-starter</artifactId>
+                <version>${mbp.boot.version}</version>
+            </dependency>
+
+            <!-- 连接池druid 数据源 -->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>druid</artifactId>
+                <version>${druid.version}</version>
+            </dependency>
+
+            <!-- Apache工具组件  -->
+            <dependency>
+                <groupId>commons-codec</groupId>
+                <artifactId>commons-codec</artifactId>
+                <version>${commons-codec.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>commons-io</groupId>
+                <artifactId>commons-io</artifactId>
+                <version>${commons-io.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>commons-fileupload</groupId>
+                <artifactId>commons-fileupload</artifactId>
+                <version>${commons-fileupload.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi</artifactId>
+                <version>${poi.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi-ooxml</artifactId>
+                <version>${poi.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>easyexcel</artifactId>
+                <version>${easyexcel.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+    <dependencies>
+        <!-- 模板引擎 -->
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-engine-core</artifactId>
+            <version>2.0</version>
+        </dependency>
+    </dependencies>
+    <repositories>
+        <!-- 使用阿里云镜像 -->
+        <repository>
+            <id>aliyun</id>
+            <name>aliyun</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+        <repository>
+            <id>spring-milestones</id>
+            <name>Spring Milestones</name>
+            <url>https://repo.spring.io/milestone</url>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+    <profiles>
+	    <!-- 开发环境,默认激活 -->
+	    <profile>
+	        <id>dev</id>
+	        <properties>
+	            <env>dev</env>
+                <config-url>http://smart-house-config:4001</config-url>
+	        </properties>
+	        <activation>
+	            <activeByDefault>true</activeByDefault>
+	        </activation>
+	    </profile>
+        <profile>
+            <id>test</id>
+            <properties>
+                <env>test</env>
+                <config-url>http://smart-house-config:4001</config-url>
+            </properties>
+        </profile>
+        <profile>
+            <id>prod</id>
+            <properties>
+                <env>prod</env>
+                <config-url>http://smart-house-config:4001</config-url>
+            </properties>
+        </profile>
+    </profiles>
+    <build>
+        <finalName>${project.artifactId}</finalName>
+		<resources>
+			<resource>
+				<directory>src/main/resources</directory>
+			</resource>
+			<resource>
+			   <directory>src/main/resources</directory>
+			   <filtering>true</filtering>
+			   <includes>
+				 <include>conf/*.yml</include>
+				 <include>*.yml</include>
+				 <include>*.properties</include>
+			   </includes>
+		   </resource>
+		</resources>
+        <pluginManagement>
+            <plugins>
+                <!-- Spring Boot 打包插件( 非“Web模块”请勿引入) -->
+                <plugin>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-maven-plugin</artifactId>
+                    <version>${spring-boot-dependencies.version}</version>
+                    <configuration>
+                        <!-- 没有该配置,devtools 不生效 -->
+                        <fork>true</fork>
+                        <addResources>true</addResources>
+                    </configuration>
+                    <executions>
+                        <execution>
+                            <goals>
+                                <goal>repackage</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+        <!-- 公共插件 -->
+        <plugins>
+            <!-- Maven 打包时跳过测试用例 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>3.0.0-M3</version>
+                <configuration>
+                    <!-- <skip>true</skip> -->
+                    <skipTests>true</skipTests>
+                    <systemProperties>
+                        <property>
+                            <name>env</name>
+                            <value>${env}</value>
+                        </property>
+                    </systemProperties>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 21 - 0
sptg-ad/pom.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>smart-house</artifactId>
+        <groupId>com.sptg</groupId>
+        <version>1.0</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>sptg-ad</artifactId>
+    <packaging>pom</packaging>
+    <description>广告聚合模块</description>
+    <modules>
+        <module>sptg-ad-api</module>
+        <module>sptg-ad-biz</module>
+    </modules>
+
+</project>

+ 35 - 0
sptg-ad/sptg-ad-api/pom.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>sptg-ad</artifactId>
+        <groupId>com.sptg</groupId>
+        <version>1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>sptg-ad-api</artifactId>
+    <packaging>jar</packaging>
+    <description>广告接口模块</description>
+
+    <dependencies>
+
+        <!-- ===================================== Modular JAR ===================================== -->
+        <dependency>
+            <groupId>com.sptg</groupId>
+            <artifactId>sptg-common-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <!-- ===================================== Or JAR ===================================== -->
+        <!-- Lombok -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+
+    </dependencies>
+
+</project>

+ 77 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/constant/AdSecurityToken.java

@@ -0,0 +1,77 @@
+package com.sptg.ad.api.constant;
+
+/**
+ * title: AdSecurityToken
+ * package: com.sptg.ad.api.constant
+ * description: 广告权限标识
+ */
+public interface AdSecurityToken {
+
+
+
+
+    /**
+     * 广告管理--》广告分类管理
+     */
+    String AD_TYPE_MANAGE = "ad:type:manage";
+    String AD_TYPE_INSERT = "ad:type:insert";
+    String AD_TYPE_DELETE = "ad:type:delete";
+
+    /**
+     * 广告管理--》广告内容管理
+     */
+    String AD_CONTENT_MANAGE = "ad:content:manage";
+    String AD_CONTENT_INSERT = "ad:content:insert";
+    String AD_CONTENT_DELETE = "ad:content:delete";
+
+    /**
+     * 广告管理--》广告位管理
+     */
+    String AD_ADSENSE_MANAGE = "ad:adsense:manage";
+    String AD_ADSENSE_INSERT = "ad:adsense:insert";
+    String AD_ADSENSE_DELETE = "ad:adsense:delete";
+
+
+    /**
+     * 广告管理--》广告素材管理
+     */
+    String AD_MATERIAL_MANAGE = "ad:material:manage";
+    String AD_MATERIAL_INSERT = "ad:material:insert";
+    String AD_MATERIAL_DELETE = "ad:material:delete";
+
+    /**
+     * 广告管理--》广告状态监控
+     */
+    String AD_PUSH_MONITORING = "ad:push:monitoring";
+    String AD_PUSH_MONITORING_DETAIL = "ad:push:monitoring:detail";
+    String AD_PUSH_MANUALLY_ISSUED = "ad:push:manually:issued";
+
+    /**
+     * 广告管理--》广告发布记录
+     */
+    String AD_PUSH_RECORD = "ad:push:record";
+
+    String AD_PUSH_RECORD_DETAIL = "ad:push:record:detail";
+
+    /**
+     * 设备人脸广告
+     */
+    String DEVICE_ADVERT_FACE = "device.advert.face";
+
+    /**
+     * 人脸广告预警记录
+     */
+    String DEVICE_ADVERT_FACE_EARLYWARNING = "device.advert.face.early_warning";
+
+    /**
+     * 设备闲时广告
+     */
+    String DEVICE_ADVERT_LEISURE = "device.advert.leisure";
+
+    /**
+     * 闲时广告预警记录
+     */
+    String DEVICE_ADVERT_LEISURE_EARLYWARNING = "device.advert.leisure.early_warning";
+
+}
+

+ 29 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/dto/AdAdsenseDto.java

@@ -0,0 +1,29 @@
+package com.sptg.ad.api.dto;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.entity.AdAdsense;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class AdAdsenseDto extends AdAdsense {
+
+    /**
+     * 分页条件
+     */
+    @TableField(exist = false)
+    private Page<AdAdsense> page;
+
+    /**
+     * 批量删除所选id集合
+     */
+    @TableField(exist = false)
+    private List<String> ids;
+    @TableField(exist = false)
+    private Integer isOfflinePushSearch;
+}

+ 34 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/dto/AdContentDto.java

@@ -0,0 +1,34 @@
+package com.sptg.ad.api.dto;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.entity.AdContent;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * title: AdContentDto
+ * package: com.sptg.ad.api.dto
+ * description: 广告类容数据传输对象
+ *
+ *
+ *
+ */
+@Getter
+@Setter
+public class AdContentDto extends AdContent{
+    /**
+     * 分页条件
+     */
+    @TableField(exist = false)
+    private Page<AdContent> page;
+
+    /**
+     * 批量删除所选id集合
+     */
+    @TableField(exist = false)
+    private List<String> ids;
+}

+ 27 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/dto/AdMaterialDto.java

@@ -0,0 +1,27 @@
+package com.sptg.ad.api.dto;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.entity.AdAdsense;
+import com.sptg.ad.api.entity.AdMaterial;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class AdMaterialDto extends AdMaterial {
+
+    /**
+     * 分页条件
+     */
+    @TableField(exist = false)
+    private Page<AdMaterial> page;
+
+    /**
+     * 批量删除所选id集合
+     */
+    @TableField(exist = false)
+    private List<String> ids;
+}

+ 41 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/dto/AdOfflinePushRecordDto.java

@@ -0,0 +1,41 @@
+package com.sptg.ad.api.dto;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.entity.AdOfflinePushRecord;
+import com.sptg.ad.api.entity.AdPushTask;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * title: AdOfflinePushRecordDto
+ * package: com.sptg.ad.api.dto
+ * description: 线下广告发布记录传输对象
+ *
+ *
+ *
+ */
+@Getter
+@Setter
+public class AdOfflinePushRecordDto extends AdOfflinePushRecord {
+    /**
+     * 分页条件
+     */
+    @TableField(exist = false)
+    private Page<AdOfflinePushRecord> page;
+    /**
+     * 搜索条件--广告标题
+     */
+    @TableField(exist = false)
+    private String adTitle;
+    /**
+     * 搜索条件--广告编号
+     */
+    @TableField(exist = false)
+    private String adCode;
+    /**
+     * 搜索条件--广告类型id
+     */
+    @TableField(exist = false)
+    private Long adTypeId;
+}

+ 46 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/dto/AdPushAppDto.java

@@ -0,0 +1,46 @@
+package com.sptg.ad.api.dto;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.sptg.ad.api.entity.AdPushApp;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * title: AdPushAppDto
+ * package: com.sptg.estate.biz.service
+ * description: 移动端广告
+ *
+ *               
+ *                     
+ */
+@Getter
+@Setter
+public class AdPushAppDto extends AdPushApp {
+
+    /**
+     * 分页条件
+     */
+    @TableField(exist = false)
+    private Page<AdPushApp> page;
+
+    /**
+     * 过期的开始时间
+     */
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @TableField(exist = false)
+    private Date beginDate;
+
+    /**
+     * 过期结束时间
+     */
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @TableField(exist = false)
+    private Date endDate;
+}

+ 25 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/dto/AdPushDeviceDetailsDto.java

@@ -0,0 +1,25 @@
+package com.sptg.ad.api.dto;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.entity.AdPushDeviceDetails;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * title: AdPushDeviceDetails
+ * package: com.sptg.ad.api.entity
+ * description: 广告发布任务详情表(记录广告下发给哪些设备)
+ *
+ *               
+ *                 
+ */
+@Getter
+@Setter
+public class AdPushDeviceDetailsDto extends AdPushDeviceDetails{
+    /**
+     * 分页条件
+     */
+    @TableField(exist = false)
+    private Page<AdPushDeviceDetails> page;
+}

+ 40 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/dto/AdPushTaskDto.java

@@ -0,0 +1,40 @@
+package com.sptg.ad.api.dto;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.entity.AdPushTask;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * title: AdPushTaskDto
+ * package: com.sptg.ad.api.dto
+ * description: 广告发布任务传输对象
+ *
+ *               
+ *                 
+ */
+@Getter
+@Setter
+public class AdPushTaskDto extends AdPushTask {
+    /**
+     * 分页条件
+     */
+    @TableField(exist = false)
+    private Page<AdPushTask> page;
+    /**
+     * 搜索条件--广告标题
+     */
+    @TableField(exist = false)
+    private String adTitle;
+    /**
+     * 搜索条件--广告编号
+     */
+    @TableField(exist = false)
+    private String adCode;
+    /**
+     * 搜索条件--广告类型id
+     */
+    @TableField(exist = false)
+    private Long adTypeId;
+}

+ 55 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/dto/AdTypeDto.java

@@ -0,0 +1,55 @@
+package com.sptg.ad.api.dto;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.entity.AdType;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * title: AdTypeDto
+ * package: com.sptg.gateway.controller.ad
+ * description: 广告类型数据传输对象
+ *
+ *               
+ *                
+ */
+@Getter
+@Setter
+public class AdTypeDto extends AdType{
+
+
+    /**
+     * 分页条件
+     */
+    @TableField(exist = false)
+    private Page<AdType> page;
+
+    /**
+     * 排序条件
+     */
+    @TableField(exist = false)
+    private String sortField;
+
+    /**
+     * 排序顺序
+     */
+    @TableField(exist = false)
+    private String sortOrder;
+
+    /**
+     * 统计类别数量用到
+     */
+    @TableField(exist = false)
+    private Date selectMonth;
+
+    /**
+     * 批量删除所选id集合
+     */
+    @TableField(exist = false)
+    private List<String> ids;
+
+}

+ 141 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdAdsense.java

@@ -0,0 +1,141 @@
+package com.sptg.ad.api.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * 广告位实体类
+ */
+@Setter
+@Getter
+@TableName(value = "ad_adsense")
+public class AdAdsense {
+
+    /**
+     *主键
+     */
+    @TableId(value = "l_id",type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 门体编号
+     */
+    @TableField(value="s_door_number")
+    private String doorNumber;
+
+    /**
+     * 广告位编号
+     */
+    @TableField(value="s_adsense_number")
+    private String adsenseNumber;
+
+    /**
+     * 广告位类型
+     */
+    @TableField(value="s_adsense_type")
+    private String adsenseType;
+
+    /**
+     * 广告数量,默认1个
+     */
+    @TableField(value="i_ad_count")
+    private Integer adCount;
+
+    /**
+     * 广告类型
+     */
+    @TableField(value="s_ad_type")
+    private String adType;
+
+    /**
+     * 广告位尺寸
+     */
+    @TableField(value="s_adsense_size")
+    private String adsenseSize;
+
+    /**
+     * 广告位地区:小区所在省市
+     */
+    @TableField(value="s_adsense_region")
+    private String adsenseRegion;
+
+    /**
+     * 小区名称
+     */
+    @TableField(value="s_residential_name")
+    private String residentialName;
+
+    /**
+     * 小区地址
+     */
+    @TableField(value="s_residential_area")
+    private String residentialArea;
+
+    /**
+     * 业务状态:1:启用,0:停用
+     */
+    @TableField(value="i_status")
+    private Integer status;
+
+    /**
+     * 广告位状态:1:启用,0:停用
+     */
+    @TableField(value="i_adsense_status")
+    private Integer adsenseStatus;
+
+    /**
+     *创建时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @TableField(value="t_create_date")
+    private Date createDate;
+
+    /**
+     * 广告位名称
+     */
+    @TableField(value="s_adsense_name")
+    private String adsenseName;
+
+    /**
+     * 设备id
+     */
+    @TableField(value="l_device_id")
+    private Long deviceId;
+
+    /**
+     * 小区id
+     */
+    @TableField(value="l_residential_id")
+    private Long residentialId;
+
+
+    /**
+     * 创建人id
+     */
+    @TableField(value = "l_create_account_id")
+    private Long createAccountId;
+    /**
+     * 创建人的账号登录名
+     */
+    @TableField(value = "s_create_account_name")
+    private String createAccountName;
+
+
+    /**
+     *
+     *
+     * 非数据库字段
+     */
+    @TableField(exist = false)
+    private String deviceName;
+
+
+
+}

+ 176 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdContent.java

@@ -0,0 +1,176 @@
+package com.sptg.ad.api.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Getter;
+import lombok.Setter;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * title: AdContent
+ * package: com.sptg.ad.api.entity
+ * description: 广告-内容
+ *
+ *
+ *
+ */
+@Getter
+@Setter
+@TableName(value = "ad_content")
+public class AdContent {
+
+    /**
+     *主键
+     */
+    @TableId(value = "l_id",type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 广告类型id
+     */
+    @TableField(value = "l_ad_type_id")
+    private Long adTypeId;
+    /**
+     * 广告素材id
+     */
+    @TableField(value = "l_ad_material_id")
+    private Long adMaterialId;
+    /**
+     * 扩展属性
+     */
+    @TableField(exist = false)
+    private AdMaterial adMaterial;
+    /**
+     * 广告素材id
+     */
+    @TableField(value = "s_ad_material_file")
+    private String adMaterialFile;
+    /**
+     * 广告位id
+     */
+    @TableField(value = "l_adsense_id")
+    private Long adsenseId;
+
+    /**
+     * 广告标题
+     */
+    @TableField(value = "s_ad_title")
+    private String adTitle;
+    /**
+     * 广告编号的格式用yyMMdd+2位排序号前面补0
+     */
+    @TableField(value = "s_ad_code")
+    private String adCode;
+    /**
+     * 视频文件路径
+     */
+    @TableField(value = "s_video_uri")
+    private String videoUri;
+
+    /**
+     * 视频文件的md5值
+     */
+    @TableField(value = "s_video_md5")
+    private String videoMd5;
+
+    /**
+     * 删除标记:{ -1:已删除,0:正常 }
+     */
+    @TableField(value = "i_status")
+    private Integer status;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @TableField(value = "t_create_date")
+    private Date createDate;
+    /**
+     * 创建人id
+     */
+    @TableField(value = "l_create_account_id")
+    private Long createAccountId;
+    /**
+     * 创建人的账号登录名
+     */
+    @TableField(value = "s_create_account_name")
+    private String createAccountName;
+    /**
+     * 所属机构id
+     */
+    @TableField(value = "l_org_id")
+    private Long orgId;
+    /**
+     * 根机构id
+     */
+    @TableField(value = "l_root_org_id")
+    private Long rootOrgId;
+
+    /**
+     * 存储位置
+     */
+    @TableField(value = "s_org_position")
+    private String orgPosition;
+
+    /**
+     * 是否有图片
+     * 0-没有  1-有
+     */
+    @TableField(value = "i_has_img")
+    private Integer hasImg;
+
+    /**
+     * 是否有素材
+     * 0-没有  1-有
+     */
+    @TableField(value = "i_has_material")
+    private Integer hasMaterial;
+    /**
+     * 广告位属于线上还是线下
+     * 0:线下 1:线上
+     */
+    @TableField(value = "i_online_or_offline")
+    private Integer onlineOrOffline;
+
+    /**
+     * 扩展属性
+     */
+    @TableField(exist = false)
+    private String[] imgUri;
+    /**
+     * 扩展属性
+     */
+    @TableField(exist = false)
+    private List<AdContentImg> adContentImgs;
+    /**
+     * 扩展属性--广告类型名字
+     */
+    @TableField(exist = false)
+    private String adTypeName;
+
+    /**
+     * 扩展属性--广告位
+     */
+    @TableField(exist = false)
+    private AdAdsense adAdsense;
+    /**
+     * 扩展属性--广告位名称
+     */
+    @TableField(exist = false)
+    private String adsenseName;
+
+    /**
+     * 扩展属性--素材名称
+     */
+    @TableField(exist = false)
+    private String materialType;
+
+    /**
+     * 扩展属性--素材名称
+     */
+    @TableField(exist = false)
+    private String materialName;
+}

+ 49 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdContentImg.java

@@ -0,0 +1,49 @@
+package com.sptg.ad.api.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * title: AdContentImg
+ * package: com.sptg.ad.api.entity
+ * description: 广告图片
+ *
+ *               
+ *                 
+ */
+@Getter
+@Setter
+@TableName(value = "ad_content_img")
+public class AdContentImg {
+    /**
+     *主键
+     */
+    @TableId(value = "l_id",type = IdType.AUTO)
+    private Long id;
+    /**
+     * 广告Id
+     */
+    @TableField(value = "l_ad_id")
+    private Long adId;
+    /**
+     * 排序
+     */
+    @TableField(value = "i_sort")
+    private Integer sort;
+    /**
+     * 图片路径
+     */
+    @TableField(value = "s_img_uri")
+    private String imgUri;
+
+    /**
+     * 图片的md5值
+     */
+    @TableField(value = "s_img_md5")
+    private String imgMd5;
+
+}

+ 121 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdMaterial.java

@@ -0,0 +1,121 @@
+package com.sptg.ad.api.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.annotations.FilterJoinTable;
+
+import java.util.Date;
+
+/**
+ * 广告素材实体类
+ */
+@Setter
+@Getter
+@TableName(value = "ad_material")
+public class AdMaterial {
+
+    /**
+     *主键
+     */
+    @TableId(value = "l_id",type = IdType.AUTO)
+    private Long id;
+
+    /**
+     *业务状态
+     */
+    @TableField(value = "i_status")
+    private int status;
+
+    /**
+     *素材编号
+     */
+    @TableField(value = "s_material_number")
+    private String materialNumber;
+
+    /**
+     *素材名称
+     */
+    @TableField(value = "s_material_name")
+    private String materialName;
+
+    /**
+     * 素材类型
+     */
+    @TableField(value = "s_material_type")
+    private String materialType;
+
+    /**
+     * 素材类型
+     */
+    @TableField(value = "s_video_md5")
+    private String videoMd5;
+	/**
+     * 广告商id(机构id)
+     */
+    @TableField(value="l_org_id")
+    private Long orgId;
+
+    /**
+     * 广告商名称(机构名称)
+     */
+    @TableField(exist = false)
+    private String orgName;
+	/**
+     * 素材文件路径
+     */
+    @TableField(value = "s_material_file")
+    private String materialFile;
+
+    /**
+     * 素材时长
+     */
+    @TableField(value = "s_material_time")
+    private String materialTime;
+
+    /**
+     * 素材大小
+     */
+    @TableField(value = "s_material_size")
+    private String materialSize;
+
+    /**
+     * 素材排序
+     */
+    @TableField(value = "s_material_serial")
+    private String materialSerial;
+
+    /**
+     * 素材状态
+     */
+    @TableField(value = "i_material_status")
+    private int materialStatus;
+
+    /**
+     * 素材大小
+     */
+    @TableField(value = "s_material_memory")
+    private String materialMemory;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @TableField(value = "t_create_date")
+    private Date createDate;
+    /**
+     * 创建人id
+     */
+    @TableField(value = "l_create_account_id")
+    private Long createAccountId;
+    /**
+     * 创建人的账号登录名
+     */
+    @TableField(value = "s_create_account_name")
+    private String createAccountName;
+
+}

+ 172 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdOfflinePushRecord.java

@@ -0,0 +1,172 @@
+package com.sptg.ad.api.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * title: AdOfflinePushRecord
+ * package: com.sptg.ad.api.entity
+ * description: 线下广告发布记录表
+ *
+ *
+ *
+ */
+@Getter
+@Setter
+@TableName(value = "ad_offline_push_record")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class AdOfflinePushRecord implements java.io.Serializable {
+    /**
+     * 主键
+     */
+    @TableId(value = "l_id",type = IdType.AUTO)
+    private Long id;
+
+
+
+    /**
+     * 要发布的广告条数
+     */
+    @TableField(value = "i_content_count")
+    private Integer contentCount;
+
+    /**
+    @TableField(value = "province_short_name")
+    private String provinceShortName;
+     * 发布状态{ 0:待上刊,1:已上刊,2:已下刊 }
+     */
+    @TableField(value = "i_push_status")
+    private Integer pushStatus;
+    /**
+     * 广告开始播放时间
+     */
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @TableField(value = "t_begin_date")
+    private Date beginDate;
+    /**
+     * 广告结束播放时间
+     */
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @TableField(value = "t_end_date")
+    private Date endDate;
+    /**
+     * 预计发布时间
+     */
+    @TableField(value = "t_estimate_push_date")
+    private Date estimatePushDate;
+    /**
+     * 发布类型{ 1 :按小区发布 2:按广告位发布,3:按区域发布}
+     */
+    @TableField(value = "i_push_type")
+    private Integer pushType;
+    @TableField(value = "i_push_location_id")
+    private String pushLocationId;
+
+    /**
+     * 发布位置:按小区发布则为小区名称,按广告位发布则为广告位名称,按区域发布则为区域名称
+     */
+    @TableField(value = "i_push_location_name")
+    private String pushLocationName;
+    /**
+     * 发布成功次数
+     */
+    @TableField(value = "l_push_success")
+    private Long pushSuccess;
+    /**
+     * 发布总次数
+     */
+    @TableField(value = "l_push_count")
+    private Long pushCount;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @TableField(value = "t_create_date")
+    private Date createDate;
+    /**
+     * 创建人Id
+     */
+    @TableField(value = "l_create_account_id")
+    private Long createAccountId;
+    /**
+     * 创建人的账号登录名
+     */
+    @TableField(value = "s_create_account_name")
+    private String createAccountName;
+    /**
+     * 机构Id
+     */
+    @TableField(value = "l_org_id")
+    private Long orgId;
+    @TableField(value = "i_status")
+    private Integer status;
+    /**
+     * 跟机构id
+     */
+    @TableField(value = "l_root_org_id")
+    private Long rootOrgId;
+
+    /**
+     * 存储位置
+     */
+    @TableField(value = "s_org_position")
+    private String orgPosition;
+    /**
+     * 备注
+     */
+    @TableField(value = "s_remark")
+    private String remark;
+
+
+
+
+    /**
+     * 数组--要发布的广告id
+     * 扩展字段
+     */
+    @TableField(value = "i_ad_id")
+    private Long adId;
+
+
+    /**
+     * 扩展属性
+     */
+    @TableField(exist = false)
+    private String adTitle;
+
+    /**
+     * 扩展属性
+     */
+    @TableField(exist = false)
+    private String adCode;
+
+    /**
+     * 扩展属性
+     */
+    @TableField(exist = false)
+    private String adTypeName;
+
+    /**
+     * 扩展属性
+     */
+    @TableField(exist = false)
+    private String adMaterialFile;
+    /**
+     * 扩展属性
+     */
+    @TableField(exist = false)
+    private String orgName;
+
+}

+ 147 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdPushApp.java

@@ -0,0 +1,147 @@
+package com.sptg.ad.api.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * title: AdPushApp
+ * package: com.sptg.estate.biz.service
+ * description: 移动端广告发布任务的广告类容
+ *
+ *               
+ *                     
+ */
+@Getter
+@Setter
+@TableName(value = "ad_push_app")
+public class AdPushApp {
+
+    /**
+     *主键
+     */
+    @TableId(value = "l_id",type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 广告id
+     */
+    @TableField(value = "l_ad_id")
+    private Long adId;
+    /**
+     * 广告标题
+     */
+    @TableField(value = "s_ad_title")
+    private String adTitle;
+
+    /**
+     * 广告类型id
+     */
+    @TableField(value = "l_ad_type_id")
+    private Long adTypeId;
+
+    /**
+     * 广告类型名称
+     */
+    @TableField(value = "s_ad_type_name")
+    private String adTypeName;
+
+    /**
+     * 广告编号的格式用yyMMdd+2位排序号前面补0
+     */
+    @TableField(value = "s_ad_code")
+    private String adCode;
+    /**
+     *  广告类型 0-图片 1-视频
+     */
+    @TableField(value = "i_video_type")
+    private Integer videoType;
+    /**
+     * 图片/视频文件路径
+     */
+    @TableField(value = "s_video_uri")
+    private String videoUri;
+
+    /**
+     * 图片/视频文件的md5值
+     */
+    @TableField(value = "s_video_md5")
+    private String videoMd5;
+    /**
+     * 排序
+     */
+    @TableField(value = "i_sort")
+    private Integer sort;
+    /**
+     *  公告在app端显示的位置 0-启动页广告 1-首页轮播图广告 2-授权密码页面广告 3-消息通知广告
+     */
+    @TableField(value = "i_position_type")
+    private Integer positionType;
+
+    /**
+     * 发布类型{ 0 :默认,1 :按小区发布,2:按单元发布,3:按区域发布,4:按用户标签发布}
+     */
+    @TableField(value = "i_push_type")
+    private Integer pushType;
+
+    /**
+     * 发布类型{ 0 :所有,2:小程序,3:安卓,4:苹果}
+     */
+    @TableField(value = "i_app_type")
+    private Integer appType;
+    /**
+     * 是否启用:{ -1:禁用,0:正常 }
+     */
+    @TableField(value = "i_is_enable")
+    private Integer isEnable;
+    /**
+     * 删除标记:{ -1:已删除,0:正常 }
+     */
+    @TableField(value = "i_status")
+    private Integer status;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @TableField(value = "t_create_date")
+    private Date createDate;
+    /**
+     * 创建人id
+     */
+    @TableField(value = "l_create_account_id")
+    private Long createAccountId;
+    /**
+     * 创建人的账号登录名
+     */
+    @TableField(value = "s_create_account_name")
+    private String createAccountName;
+    /**
+     * 所属机构id
+     */
+    @TableField(value = "l_org_id")
+    private Long orgId;
+    /**
+     * 根机构id
+     */
+    @TableField(value = "l_root_org_id")
+    private Long rootOrgId;
+
+    /**
+     * 存储位置
+     */
+    @TableField(value = "s_org_position")
+    private String orgPosition;
+
+    /**
+     * 过期时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @TableField(value = "d_expiration_time")
+    private Date expirationTime;
+}

+ 94 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdPushContent.java

@@ -0,0 +1,94 @@
+package com.sptg.ad.api.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * title: AdPushContent
+ * package: com.sptg.ad.api.entity
+ * description: 广告发布任务的广告类容
+ *
+ *               
+ *                
+ */
+@Getter
+@Setter
+@TableName(value = "ad_push_content")
+public class AdPushContent {
+    /**
+     * 主键
+     */
+    @TableId(value = "l_id",type = IdType.AUTO)
+    private Long id;
+
+    /**
+     *  发布任务id
+     */
+    @TableField(value = "l_task_id")
+    private Long taskId;
+
+    /**
+     * 广告id
+     */
+    @TableField(value = "l_ad_id")
+    private Long adId;
+    /**
+     * 广告标题
+     */
+    @TableField(value = "s_ad_title")
+    private String adTitle;
+
+    /**
+     * 广告类型id
+     */
+    @TableField(value = "l_ad_type_id")
+    private Long adTypeId;
+
+    /**
+     * 广告类型名称
+     */
+    @TableField(value = "s_ad_type_name")
+    private String adTypeName;
+
+    /**
+     * 广告编号的格式用yyMMdd+2位排序号前面补0
+     */
+    @TableField(value = "s_ad_code")
+    private String adCode;
+
+    /**
+     * 视频文件路径
+     */
+    @TableField(value = "s_video_uri")
+    private String videoUri;
+
+    /**
+     * 视频文件的md5值
+     */
+    @TableField(value = "s_video_md5")
+    private String videoMd5;
+
+    /**
+     * 每张图片播放时间(秒)
+     */
+    @TableField(value = "i_img_play_time")
+    private Integer imgPlayTime;
+
+    /**
+     * 存储位置
+     */
+    @TableField(value = "s_org_position")
+    private String orgPosition;
+
+    /**
+     * 扩展属性
+     */
+    @TableField(exist = false)
+    private List<AdPushContentImg> adPushContentImgs;
+}

+ 49 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdPushContentImg.java

@@ -0,0 +1,49 @@
+package com.sptg.ad.api.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * title: AdPushContentImg
+ * package: com.sptg.ad.api.entity
+ * description: 广告发布任务图片--广告内容是可以修改的,所有生成任务的时候要单独保存图片记录
+ *
+ *               
+ *                 
+ */
+@Getter
+@Setter
+@TableName(value = "ad_push_content_img")
+public class AdPushContentImg {
+    /**
+     *主键
+     */
+    @TableId(value = "l_id",type = IdType.AUTO)
+    private Long id;
+    /**
+     * 广告发布任务id
+     */
+    @TableField(value = "l_push_content_id")
+    private Long pushContentId;
+    /**
+     * 排序
+     */
+    @TableField(value = "i_sort")
+    private Integer sort;
+    /**
+     * 图片路径
+     */
+    @TableField(value = "s_img_uri")
+    private String imgUri;
+    /**
+     * 图片的md5值
+     */
+    @TableField(value = "s_img_md5")
+    private String imgMd5;
+
+
+}

+ 21 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdPushDeviceDetails.java

@@ -0,0 +1,21 @@
+package com.sptg.ad.api.entity;
+
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.sptg.common.core.entity.PublishTaskResult;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * title: AdPushDeviceDetails
+ * package: com.sptg.ad.api.entity
+ * description: 广告发布任务详情表(记录广告下发给哪些设备)
+ *
+ *               
+ *                 
+ */
+@Getter
+@Setter
+@TableName(value = "ad_push_device_details")
+public class AdPushDeviceDetails extends PublishTaskResult {
+
+}

+ 177 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdPushTask.java

@@ -0,0 +1,177 @@
+package com.sptg.ad.api.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * title: AdPushTask
+ * package: com.sptg.ad.api.entity
+ * description: 广告发布任务表
+ *
+ *               
+ *                 
+ */
+@Getter
+@Setter
+@TableName(value = "ad_push_task")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class AdPushTask implements java.io.Serializable {
+    /**
+     * 主键
+     */
+    @TableId(value = "l_id",type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 任务类型:{ 1:人脸广告,2:闲时广告 }
+     */
+    @TableField(value = "i_task_type")
+    private Integer taskType;
+
+    /**
+     * 要发布的广告条数
+     */
+    @TableField(value = "i_content_count")
+    private Integer contentCount;
+
+    /**
+     * 发布状态{ -1:发布失败,0:待发布,1:发布成功,2:已撤销 }
+     */
+    @TableField(value = "i_push_status")
+    private Integer pushStatus;
+    /**
+     * 广告开始播放时间
+     */
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @TableField(value = "t_begin_date")
+    private Date beginDate;
+    /**
+     * 广告结束播放时间
+     */
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @TableField(value = "t_end_date")
+    private Date endDate;
+    /**
+     * 预计发布时间
+     */
+    @TableField(value = "t_estimate_push_date")
+    private Date estimatePushDate;
+    /**
+     * 发布类型{ 1 :按小区发布,2:按单元发布,3:按设备发布,4:按区域发布}
+     */
+    @TableField(value = "i_push_type")
+    private Integer pushType;
+    /**
+     * 发布成功次数
+     */
+    @TableField(value = "l_push_success")
+    private Long pushSuccess;
+    /**
+     * 发布总次数
+     */
+    @TableField(value = "l_push_count")
+    private Long pushCount;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @TableField(value = "t_create_date")
+    private Date createDate;
+    /**
+     * 创建人Id
+     */
+    @TableField(value = "l_create_account_id")
+    private Long createAccountId;
+    /**
+     * 创建人的账号登录名
+     */
+    @TableField(value = "s_create_account_name")
+    private String createAccountName;
+    /**
+     * 机构Id
+     */
+    @TableField(value = "l_org_id")
+    private Long orgId;
+    /**
+     * 跟机构id
+     */
+    @TableField(value = "l_root_org_id")
+    private Long rootOrgId;
+
+    /**
+     * 存储位置
+     */
+    @TableField(value = "s_org_position")
+    private String orgPosition;
+    /**
+     * 备注
+     */
+    @TableField(value = "s_remark")
+    private String remark;
+
+    /**
+     * 是否过滤阈值:{ 1:启用阈值配置,2:禁用阈值配置 }
+     */
+    @TableField(value = "i_enable_threshold")
+    private Integer enableThreshold;
+
+    /**
+     * 扩展字段
+     * 每张图片播放时间(秒)
+     */
+    @TableField(exist = false)
+    private Integer imgPlayTime;
+    /**
+     * 数组--要发布的广告id
+     * 扩展字段
+     */
+    @TableField(exist = false)
+    private Long[] adIds;
+    /**
+     * 数组--任务id
+     * 扩展字段
+     */
+   @TableField(exist = false)
+   private Long[] adPushTaskDetails;
+    /**
+     * 扩展属性
+     */
+    @TableField(exist = false)
+    private  List<AdPushContent> adPushContents;
+
+    /**
+     * 扩展属性
+     */
+    @TableField(exist = false)
+    private  List<AdPushTaskDetails> adPushTaskDetailsList;
+
+    /**
+     * 扩展属性
+     */
+    @TableField(exist = false)
+    private  List<String> adPushContentNames;
+
+    /**
+     * 扩展属性
+     */
+    @TableField(exist = false)
+    private  List<String> adPushRangeNames;
+    /**
+     * 扩展属性
+     */
+    @TableField(exist = false)
+    private String adTitle;
+
+}

+ 42 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdPushTaskDetails.java

@@ -0,0 +1,42 @@
+package com.sptg.ad.api.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * title: AdPushTaskDetails
+ * package: com.sptg.ad.api.entity
+ * description: 广告发布任务详情表(记录广告下发到哪些位置)
+ *
+ *               
+ *                 
+ */
+@Getter
+@Setter
+@TableName(value = "ad_push_task_details")
+public class AdPushTaskDetails {
+    /**
+     * 主键
+     */
+    @TableId(value = "l_id",type = IdType.AUTO)
+    private Long id;
+    /**
+     * 广告推送任务Id
+     */
+    @TableField(value = "l_task_id")
+    private Long taskId;
+    /**
+     * 小区/单元/设备/标签 Id (省市区)
+     */
+    @TableField(value = "l_fk_id")
+    private Long fkId;
+    /**
+     * 名字
+     */
+    @TableField(exist = false)
+    private  String fkName;
+}

+ 51 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdPushThresholdValue.java

@@ -0,0 +1,51 @@
+package com.sptg.ad.api.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * title: AdPushThresholdValue
+ * package: com.sptg.ad.api.entity
+ * description: 广告发布阈值
+ *
+ *                
+ *                
+ */
+@Getter
+@Setter
+@TableName(value = "ad_push_threshold_value")
+public class AdPushThresholdValue {
+    /**
+     * 主键
+     */
+    @TableId(value = "l_id",type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 设置广告条数阈值
+     */
+    @TableField(value = "i_count")
+    private Integer count;
+
+    /**
+     * 广告类型  { 0人脸广告发布,1闲时广告发布 }
+     */
+    @TableField(value = "i_type")
+    private Integer type;
+
+    /**
+     * 根机构id
+     */
+    @TableField(value = "l_root_org_id")
+    private Long rootOrgId;
+
+    /**
+     * 存储位置
+     */
+    @TableField(value = "s_org_position")
+    private String orgPosition;
+}

+ 71 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/AdType.java

@@ -0,0 +1,71 @@
+package com.sptg.ad.api.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * title: AdType
+ * package: com.sptg.ad.api.entity
+ * description: 广告类型  -- 总部管理分类,下级没有修改和删除权限
+ *
+ *               
+ *                 
+ */
+@Getter
+@Setter
+@TableName(value = "ad_type")
+public class AdType{
+    /**
+     * 主键
+     */
+    @TableId(value = "l_id",type = IdType.AUTO)
+    private Long id;
+    /**
+     * 类别名称
+     */
+    @TableField(value = "s_name")
+    private String name;
+    /**
+     * 备注,不能超过200个汉字
+     */
+    @TableField(value = "s_remark")
+    private String remark;
+    /**
+     * '删除标记:{ -1:已删除,0:正常 }',
+     */
+    @TableField(value = "i_status")
+    private Integer status;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @TableField(value = "t_create_date")
+    private Date createDate;
+    /**
+     * 创建人id
+     */
+    @TableField(value = "l_create_account_id")
+    private Long createAccountId;
+    /**
+     * 创建人登录名
+     */
+    @TableField(value = "s_create_account_name")
+    private String createAccountName;
+    /**
+     * 所属机构id
+     */
+    @TableField(value = "l_org_id")
+    private Long orgId;
+    /**
+     * 根机构id
+     */
+    @TableField(value = "l_root_org_id")
+    private Long rootOrgId;
+}

+ 114 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/DeviceAdvert.java

@@ -0,0 +1,114 @@
+package com.sptg.ad.api.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ *            
+ *                
+ * description: 设备广告
+ */
+@Getter
+@Setter
+public class DeviceAdvert implements java.io.Serializable {
+
+    @TableId(type = IdType.ID_WORKER)
+    private Long id;
+
+    /**
+     * 广告任务Id
+     */
+    private Long taskId;
+
+    /**
+     * 任务类型:{ 1:人脸广告,2:闲时广告 }
+     */
+    private Integer taskType;
+
+    /**
+     * 广告编号
+     */
+    private String adCode;
+
+    /**
+     * 广告名称
+     */
+    private String adName;
+
+    /**
+     * 广告类型
+     */
+    private String adType;
+
+    /**
+     * 机构位置
+     */
+    private String orgPosition;
+
+    /**
+     * 创建机构名称
+     */
+    private String orgName;
+
+    /**
+     * 创建人名称
+     */
+    private String createName;
+
+    /**
+     * 创建时间
+     */
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date createTime;
+
+    /**
+     * 广告开始播放时间
+     */
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date beginTime;
+
+    /**
+     * 广告结束播放时间
+     */
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date endTime;
+
+    /**
+     * 设备序列号
+     */
+    private String serialNumber;
+
+    /**
+     * 广告状态:-1:删除,0:正常
+     */
+    private Integer status;
+
+    /**
+     * 本月观看次数
+     */
+    private Long monthPlayVolume;
+
+    /**
+     * 总播放量
+     */
+    private Long totalPlayVolume;
+
+    /* -------------------------------------------------------------------------------------------------------------- */
+
+    /**
+     * 查询条件:发布时间
+     */
+    @TableField(exist = false)
+    private String publishTime;
+
+}

+ 142 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/DeviceAdvertStatistics.java

@@ -0,0 +1,142 @@
+package com.sptg.ad.api.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ *            
+ *               
+ * description: 设备广告统计
+ */
+@Setter
+@Getter
+@TableName(value = "device_advert_statistics")
+public class DeviceAdvertStatistics implements java.io.Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 任务类型:{ 1:人脸广告,2:闲时广告 }
+     */
+    private Integer taskType;
+
+    /**
+     * 总发布量
+     */
+    private Long publishCount;
+
+    /**
+     * 当前广告数量
+     */
+    private Integer adCount;
+
+    /**
+     * 总浏览量
+     */
+    private Long browseCount;
+
+    /**
+     * 上个月浏览量
+     */
+    private Integer lastMonthBrowse;
+
+    /**
+     * 当前月浏览量
+     */
+    private Integer thisMonthBrowse;
+
+    /**
+     * 第1周浏览量
+     */
+    @TableField(value = "week_1_browse")
+    private Integer week1Browse;
+
+    /**
+     * 第2周浏览量
+     */
+    @TableField(value = "week_2_browse")
+    private Integer week2Browse;
+
+    /**
+     * 第3周浏览量
+     */
+    @TableField(value = "week_3_browse")
+    private Integer week3Browse;
+
+    /**
+     * 第4周浏览量
+     */
+    @TableField(value = "week_4_browse")
+    private Integer week4Browse;
+
+    /**
+     * 预警次数
+     */
+    private Integer earlyWarningCount;
+
+    /**
+     * 小区Id
+     */
+    private Long xqId;
+
+    /**
+     * 机构位置
+     */
+    private String orgPosition;
+
+    /**
+     * 设备Id
+     */
+    private Long deviceId;
+
+    /**
+     * 设备名称
+     */
+    private String deviceName;
+
+    /**
+     * 设备序列号
+     */
+    private String deviceSerialNumber;
+
+    /**
+     * 设备安装位置
+     */
+    private String deviceInstallPath;
+
+    /**
+     * 省(id)
+     */
+    private String regionProvince;
+
+    /**
+     * 市(id)
+     */
+    private String regionCity;
+
+    /**
+     * 区(id)
+     */
+    private String regionArea;
+
+    /**
+     * 创建时间(yyyyMM)
+     */
+    private String createTime;
+
+    /* ============================================================================================================== */
+
+    /**
+     * 设备Id列表
+     */
+    @TableField(exist = false)
+    private List<Long> deviceIdList;
+
+}

+ 120 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/EarlyWarning.java

@@ -0,0 +1,120 @@
+package com.sptg.ad.api.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.enums.IdType;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *            
+ *                
+ * description: 预警
+ */
+@Setter
+@Getter
+@NoArgsConstructor
+public class EarlyWarning implements java.io.Serializable {
+
+    @TableId(type = IdType.ID_WORKER)
+    private Long id;
+
+    /**
+     * 设备序列号
+     */
+    private String serialNumber;
+
+    /**
+     * 设备Id
+     */
+    private Long deviceId;
+
+    /**
+     * 设备名称
+     */
+    private String deviceName;
+
+    /**
+     * 安装位置
+     */
+    private String installPath;
+
+    /**
+     * 预警类型:{ 1:月预警,2:周预警 }
+     */
+    private Integer type;
+
+    /**
+     * 任务类型:{ 1:人脸广告,2:闲时广告 }
+     */
+    private Integer taskType;
+
+    /**
+     * 预警值
+     */
+    private Long expect;
+
+    /**
+     * 实际值
+     */
+    private Long value;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 结束统计预警时间
+     */
+    private Date endTime;
+
+    /**
+     * 当前第几周
+     */
+    private Integer weekNum;
+
+    /**
+     * 结束标识:{ 0:未开始,1:已结束 }
+     */
+    private Integer endFlag;
+
+    /* -------------------------------------------------------------------------------------------------------------- */
+
+
+    @TableField(exist = false)
+    private String time;
+
+    /**
+     * 月预警值
+     */
+    @TableField(exist = false)
+    private Long monthExpect;
+
+    /**
+     * 周预警值
+     */
+    @TableField(exist = false)
+    private Long weekExpect;
+
+    @TableField(exist = false)
+    private List<Long> deviceIdList;
+
+    public EarlyWarning(DeviceAdvertStatistics statistics, Integer type, Integer taskType, Long expect, Date createTime, Date endTime) {
+        this.serialNumber = statistics.getDeviceSerialNumber();
+        this.deviceId = statistics.getDeviceId();
+        this.deviceName = statistics.getDeviceName();
+        this.installPath = statistics.getDeviceInstallPath();
+        this.type = type;
+        this.taskType = taskType;
+        this.expect = expect;
+        this.createTime = createTime;
+        this.endTime = endTime;
+        this.endFlag = 0;
+        this.value = 0L;
+    }
+}

+ 51 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/entity/ThresholdConfig.java

@@ -0,0 +1,51 @@
+package com.sptg.ad.api.entity;
+
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.enums.IdType;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ *            
+ *               
+ * description: 阈值配置
+ */
+@Setter
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class ThresholdConfig implements java.io.Serializable {
+
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.ID_WORKER)
+    private Long id;
+
+    /**
+     * 区域编号
+     */
+    private String regionCode;
+
+    /**
+     * 区域名称
+     */
+    private String region;
+
+    /**
+     * 类型:{ 1:人脸广告配置,2:闲时广告配置 }
+     */
+    private Integer type;
+
+    /**
+     * 阈值
+     */
+    private Integer value;
+
+    /**
+     * 机构Id
+     */
+    private Long orgId;
+}

+ 89 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/AdAdsenseFeign.java

@@ -0,0 +1,89 @@
+package com.sptg.ad.api.feigns;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdAdsenseDto;
+import com.sptg.ad.api.entity.AdAdsense;
+import com.sptg.ad.api.feigns.fallback.AdAdsenseFeignFallbackFactory;
+import com.sptg.common.core.beans.ResultBean;
+import io.protostuff.Request;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * title: AdAdsenseFeign
+ * package: com.sptg.ad.api.feigns
+ * description: 广告位-对外接口类
+ *
+ *
+ *
+ */
+@FeignClient(value = "smart-house-ad",fallbackFactory = AdAdsenseFeignFallbackFactory.class)
+public interface AdAdsenseFeign {
+
+
+    /**
+     * 查询广告位列表(分页)
+     * @param adAdsenseDto
+     * @return 分页查询结果
+     *
+     *
+     */
+    @PostMapping(value = "/showAdAdsenseList")
+    ResultBean<Page<AdAdsense>> showAdAdsenseList(@RequestBody AdAdsenseDto adAdsenseDto);
+
+    /**
+     * 功能描述:新增/编辑
+     * @param adAdsense
+     * @return
+     *
+     *
+     */
+    @PostMapping(value = "/addAdAdsense")
+    ResultBean<Boolean> addAdAdsense(AdAdsense adAdsense);
+    /**
+     * 功能描述:删除
+     * @param  ids
+     * @return
+     *
+     *
+     */
+    @PostMapping(value = "/deleteAdAdsense")
+    ResultBean<Boolean> deleteAdAdsense(@RequestBody String ids);
+
+    /**
+     * 功能描述: 根据id查询广告位
+     * @param
+     * @return
+     *
+     *
+     */
+    @PostMapping(value = "/findAdsenseById")
+    AdAdsense findAdsenseById(@RequestBody Long id);
+
+    /**
+     * 功能描述:批量删除广告位
+     * @param adAdsenseDto{ids:必填}
+     * @return ResultBean<Boolean>
+     *
+     *
+     */
+    @PostMapping(value = "/deleteAdsenseList")
+    ResultBean<Boolean> deleteAdsenseList(@RequestBody  AdAdsenseDto adAdsenseDto);
+
+    /**
+     * 功能描述:修改广告位状态
+     * @param id{ids:必填}
+     * @return ResultBean<Boolean>
+     *
+     *
+     */
+    @PostMapping(value = "/updateAdsenseStatus")
+    ResultBean<Boolean> updateAdsenseStatus(@RequestParam("id") Long id,@RequestParam("adsenseStatus") String adsenseStatus);
+
+    @GetMapping(value="/getAllCount")
+    ResultBean<Integer> getAllAdsenseCount();
+}
+

+ 80 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/AdContentFeign.java

@@ -0,0 +1,80 @@
+package com.sptg.ad.api.feigns;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdContentDto;
+import com.sptg.ad.api.entity.AdContent;
+import com.sptg.ad.api.feigns.fallback.AdContentFeignFallbackFactory;
+import com.sptg.common.core.beans.ResultBean;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * title: AdContentFeign
+ * package: com.sptg.ad.api.feigns
+ * description: 广告内容-对外接口类
+ *
+ *               
+ *                 
+ */
+@FeignClient(value = "smart-house-ad",fallbackFactory = AdContentFeignFallbackFactory.class)
+public interface AdContentFeign {
+
+
+    /**
+     * 查询广告类型列表(分页)
+     * @param adContentDto
+     * @return 分页查询结果
+     *               
+     *                      
+     */
+    @PostMapping(value = "/showAdContentList")
+    ResultBean<Page<AdContent>> showAdContentList(AdContentDto adContentDto);
+
+    /**
+     * 功能描述:新增/编辑
+     * @param adContent
+     * @return
+     *               
+     *                      
+     */
+    @PostMapping(value = "/addAdContent")
+    ResultBean<Boolean> addAdContent(AdContent adContent);
+    /**
+     * 功能描述:删除
+     * @param  ids
+     * @return
+     *               
+     *                      
+     */
+    @PostMapping(value = "/deleteAdContent")
+    ResultBean<Boolean> deleteAdContent(String ids);
+    
+    /**
+     * 功能描述:批量删除广告内容
+     * @param adContentDto{ids:必填}
+     * @return ResultBean<Boolean>
+     *             
+     *                      
+     */
+    @PostMapping(value = "/deleteAdContentList")
+    ResultBean<Boolean> deleteAdContentList(@RequestBody  AdContentDto adContentDto);
+    /**
+     * 功能描述:根据id获取广告类容
+     * @param id
+     * @return
+     *               
+     *                       
+     */
+    @PostMapping(value = "/findAdContentById")
+    AdContent findAdContentById(Long id);
+
+    /**
+     * 功能描述:获取广告列表
+     * @param dto
+     * @return
+     */
+    @PostMapping(value = "/getList")
+    ResultBean<AdContent> getList(AdContentDto dto);
+}
+

+ 63 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/AdMaterialFeign.java

@@ -0,0 +1,63 @@
+package com.sptg.ad.api.feigns;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdMaterialDto;
+import com.sptg.ad.api.entity.AdContent;
+import com.sptg.ad.api.entity.AdMaterial;
+import com.sptg.ad.api.feigns.fallback.AdMaterialFeignFallbackFactory;
+import com.sptg.common.core.beans.ResultBean;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+@FeignClient(value = "smart-house-ad",fallbackFactory = AdMaterialFeignFallbackFactory.class)
+public interface AdMaterialFeign {
+
+    /**
+     * 查询广告位素材表(分页)
+     * @param adMaterialDto
+     * @return 分页查询结果
+     *
+     *
+     */
+    @PostMapping(value = "/showAdMaterialList")
+    ResultBean<Page<AdMaterial>> showAdMaterialList(@RequestBody AdMaterialDto adMaterialDto);
+
+    /**
+     * 功能描述:新增/编辑
+     * @param adMaterial
+     * @return
+     *
+     *
+     */
+    @PostMapping(value = "/addAdMaterial")
+    ResultBean<Boolean> addAdMaterial(AdMaterial adMaterial);
+    /**
+     * 功能描述:删除
+     * @param  ids
+     * @return
+     *
+     *
+     */
+    @PostMapping(value = "/deleteAdMaterial")
+    ResultBean<Boolean> deleteAdMaterial(@RequestBody String ids);
+    /**
+     * 功能描述: 根据id查询广告素材
+     * @param
+     * @return
+     *
+     *
+     */
+    @PostMapping(value = "/findAdMaterialById")
+     AdMaterial findAdMaterialById(@RequestBody Long id);
+
+    /**
+     * 功能描述:批量删除广告内容
+     * @param adMaterialDto{ids:必填}
+     * @return ResultBean<Boolean>
+     *
+     *
+     */
+    @PostMapping(value = "/deleteAdMaterialList")
+    ResultBean<Boolean> deleteAdMaterialList(@RequestBody  AdMaterialDto adMaterialDto);
+}

+ 70 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/AdOfflinePushRecordFeign.java

@@ -0,0 +1,70 @@
+package com.sptg.ad.api.feigns;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdOfflinePushRecordDto;
+import com.sptg.ad.api.dto.AdPushTaskDto;
+import com.sptg.ad.api.entity.*;
+import com.sptg.ad.api.feigns.fallback.AdOfflinePushRecordFeignFallbackFactory;
+import com.sptg.ad.api.feigns.fallback.AdPushTaskFeignFallbackFactory;
+import com.sptg.common.core.beans.ResultBean;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * title: AdPushTaskFeign
+ * package: com.sptg.ad.api.feigns
+ * description: 线下广告发布-对外接口类
+ *
+ *
+ *
+ */
+@FeignClient(value = "smart-house-ad",fallbackFactory = AdOfflinePushRecordFeignFallbackFactory.class)
+public interface AdOfflinePushRecordFeign {
+
+    /**
+     * 查询线下广告发布记录列表(分页)
+     * @param adOfflinePushRecordDto
+     * @return 分页查询结果
+     *
+     *
+     */
+    @PostMapping(value = "/showAdOfflinePushRecordList")
+    ResultBean<Page<AdOfflinePushRecord>> showAdOfflinePushRecordList(AdOfflinePushRecordDto adOfflinePushRecordDto);
+
+    /**
+     * 功能描述:新增/编辑
+     * @param adOfflinePushRecord
+     * @return
+     *
+     *
+     */
+    @PostMapping(value = "/addAdOfflinePushRecord")
+    ResultBean<Boolean> addAdOfflinePushRecord(AdOfflinePushRecord adOfflinePushRecord);
+    /**
+     * 功能描述:撤销发布
+     * @param  id
+     * @return
+     *
+     *
+     */
+    @PostMapping(value = "/cancelAdOfflinePushRecord")
+    ResultBean<Boolean> cancelAdOfflinePushRecord(Long id);
+    /**
+     * 功能描述:根据id获取线下广告发布记录
+     * @param id
+     * @return
+     *
+     *
+     */
+    @PostMapping(value = "/findAdOfflinePushRecordById")
+    AdOfflinePushRecord findAdOfflinePushRecordById(Long id);
+
+    @PostMapping(value = "/updateAdOfflinePushRecord")
+    ResultBean<Boolean> updateAdOfflinePushRecord(AdOfflinePushRecord adOfflinePushRecord);
+    @PostMapping(value = "/getAdOfflinePushRecordByProvinceName")
+    Integer getAdOfflinePushRecordByProvinceName(@RequestParam("provinceShortName") String provinceShortName,@RequestParam("orgPosition") String orgPosition);
+    @PostMapping(value = "/getAdOfflinePushRecordByYearMonth")
+    Integer getAdOfflinePushRecordByYearMonth(@RequestParam(name="year",required = false) String year,@RequestParam(name="month",required = false) String month);
+}

+ 86 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/AdPushAppFeign.java

@@ -0,0 +1,86 @@
+package com.sptg.ad.api.feigns;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdPushAppDto;
+import com.sptg.ad.api.entity.AdPushApp;
+import com.sptg.ad.api.feigns.fallback.AdPushAppFeignFallbackFactory;
+import com.sptg.common.core.beans.ResultBean;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * title: AdTypeFeign
+ * package: com.sptg.ad.api.feigns
+ * description: 移动端广告-对外接口
+ *
+ *               
+ *               
+ */
+@FeignClient(value = "smart-house-ad",fallbackFactory = AdPushAppFeignFallbackFactory.class)
+public interface AdPushAppFeign {
+
+     /**
+      * 分页
+      * @param dto
+      * @return 分页查询结果
+      *               
+      *                     
+      */
+     @PostMapping(value = "/ad/push/app/showList")
+     ResultBean<Page<AdPushApp>> showList(@RequestBody AdPushAppDto dto);
+    /**
+     * 新增
+     * @param adPushApp
+     * @return ResultBean<Boolean>
+     *               
+     *                     
+     */
+    @PostMapping(value = "/ad/push/app/addEntity")
+     ResultBean<Boolean> addEntity(@RequestBody AdPushApp adPushApp);
+    /**
+     * 禁用| 启用 广告
+     * @param dto
+     * @return ResultBean<Boolean>
+     *               
+     *                     
+     */
+    @PostMapping(value = "/ad/push/app/updateIsEnable")
+    ResultBean<Boolean> updateIsEnable(@RequestBody AdPushAppDto dto);
+    /**
+     * 删除--软删除
+     * @param id
+     * @return ResultBean<Boolean>
+     *               
+     *                     
+     */
+    @PostMapping(value = "/ad/push/app/delete")
+    ResultBean<Boolean> delete(@RequestBody Long id);
+    /**
+     * 查询
+     * @param id
+     * @return ResultBean<AdPushApp>
+     *               
+     *                     
+     */
+    @PostMapping(value = "/ad/push/app/findById")
+    ResultBean<AdPushApp> findById(@RequestBody Long id);
+    /**
+     * 修改
+     * @param adPushApp
+     * @return ResultBean<Boolean>
+     *               
+     *                     
+     */
+    @PostMapping(value = "/ad/push/app/editById")
+    ResultBean<Boolean> editById(@RequestBody AdPushApp adPushApp);
+    /**
+     * 获取移动端广告
+     * @param dto
+     * @return ResultBean<Boolean>
+     *               
+     *                     
+     */
+    @PostMapping(value = "/ad/push/app/getList")
+    ResultBean<AdPushApp> getList(@RequestBody AdPushAppDto dto);
+}

+ 47 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/AdPushDeviceDetailsFeign.java

@@ -0,0 +1,47 @@
+package com.sptg.ad.api.feigns;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdPushDeviceDetailsDto;
+import com.sptg.ad.api.entity.AdPushDeviceDetails;
+import com.sptg.ad.api.feigns.fallback.AdPushDeviceDetailsFallbackFactory;
+import com.sptg.common.core.beans.ResultBean;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * title: AdPushDeviceDetailsFeign
+ * package: com.sptg.ad.api.feigns
+ * description: 广告发布到设备详情-对外接口类
+ *
+ *               
+ *                 
+ */
+@FeignClient(value = "smart-house-ad",fallbackFactory = AdPushDeviceDetailsFallbackFactory.class)
+public interface AdPushDeviceDetailsFeign {
+    /**
+     * 功能描述:分页查询
+     * @param  adPushDeviceDetailsDto
+     * @return
+     *               
+     *                       
+     */
+    @PostMapping(value = "/showAdPushDeviceDetails")
+    ResultBean<Page<AdPushDeviceDetails>> showAdPushDeviceDetails(@RequestBody AdPushDeviceDetailsDto adPushDeviceDetailsDto);
+
+    /**
+     * 功能描述: 修改发布状态
+     * @param dto
+     * {
+     *     taskId       :   任务Id
+     *     serialNumber :   设备序列号
+     *     pushStatus   :   任务执行状态{ 1:成功,2:失败 }
+     *     remark       :   备注(失败原因),选填
+     * }
+     * @return ResultBean<Boolean>
+     *                  
+     *                     
+     */
+    @PostMapping(value = "/ad/task/updatePushStatus")
+    ResultBean<Boolean> updatePushStatus(@RequestBody AdPushDeviceDetails dto);
+}

+ 147 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/AdPushTaskFeign.java

@@ -0,0 +1,147 @@
+package com.sptg.ad.api.feigns;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdPushTaskDto;
+import com.sptg.ad.api.entity.AdPushContent;
+import com.sptg.ad.api.entity.AdPushTask;
+import com.sptg.ad.api.entity.AdPushTaskDetails;
+import com.sptg.ad.api.entity.AdPushThresholdValue;
+import com.sptg.ad.api.feigns.fallback.AdPushTaskFeignFallbackFactory;
+import com.sptg.common.core.beans.ResultBean;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+/**
+ * title: AdPushTaskFeign
+ * package: com.sptg.ad.api.feigns
+ * description: 广告内容-对外接口类
+ *
+ *               
+ *                 
+ */
+@FeignClient(value = "smart-house-ad",fallbackFactory = AdPushTaskFeignFallbackFactory.class)
+public interface AdPushTaskFeign {
+
+    /**
+     * 查询广告类型列表(分页)
+     * @param adPushTaskDto
+     * @return 分页查询结果
+     *               
+     *                      
+     */
+    @PostMapping(value = "/showAdPushTaskList")
+    ResultBean<Page<AdPushTask>> showAdPushTaskList(AdPushTaskDto adPushTaskDto);
+
+    /**
+     * 功能描述:新增/编辑
+     * @param adPushTask
+     * @return
+     *               
+     *                      
+     */
+    @PostMapping(value = "/addAdPushTask")
+    ResultBean<Boolean> addAdPushTask(AdPushTask adPushTask);
+    /**
+     * 功能描述:撤销任务
+     * @param  id
+     * @return
+     *               
+     *                      
+     */
+    @PostMapping(value = "/cancelAdPushTask")
+    ResultBean<Boolean> cancelAdPushTask(Long id);
+    /**
+     * 功能描述:根据id获取广告类容
+     * @param id
+     * @return
+     *               
+     *                       
+     */
+    @PostMapping(value = "/findAdPushTaskById")
+    AdPushTask findAdPushTaskById(Long id);
+    /**
+     * 功能描述: 手动下发任务
+     * @param id
+     * @return
+     *               
+     *                       
+     */
+    @PostMapping(value = "/manuallyIssued")
+    ResultBean<Boolean> manuallyIssued(Long id);
+
+    /**
+     * 功能描述: 根据下发任务Id和广告编号获取广告内容
+     * @param taskId 任务Id
+     * @param code 广告编号
+     * @return AdPushContent
+     *                  
+     *                      
+     */
+    @GetMapping(value = "/getPushContentByTask/{taskId}/{code}")
+    AdPushContent getPushContentByTask(@PathVariable(value = "taskId")Long taskId, @PathVariable(value = "code")String code);
+
+    /**
+     * 功能描述:根据下发任务Id获取任务详细
+     * @param id
+     * @return List<AdPushTaskDetails>
+     *                
+     *                     
+     */
+    @PostMapping(value = "/getAdPushTaskDetailsByTaskId")
+    List<AdPushTaskDetails> getAdPushTaskDetailsByTaskId(@RequestBody Long id);
+
+    /**
+     * 功能描述:根据下发任务Id获取广告内容
+     * @param id
+     * @return  List<AdPushContent>
+     *                
+     *                     
+     */
+    @PostMapping(value = "/getAdPushContentsByTaskId")
+    List<AdPushContent> getAdPushContentsByTaskId(@RequestBody Long id);
+    /**
+     * 功能描述:实施小程序--广告一键下发测试
+     *  @param   deviceId
+     * @return  ResultBean<Boolean>
+     *                
+     *                      
+     */
+    @PostMapping(value = "/adIssued")
+    ResultBean<Boolean> adIssued(@RequestBody Long deviceId);
+
+    /**
+     * 功能描述:获取广告发布阈值
+     * @param adPushThresholdValue
+     * @return AdPushThresholdValue
+     *                
+     *                      
+     */
+    @PostMapping(value = "/getAdPushThresholdValue")
+    AdPushThresholdValue getAdPushThresholdValue(@RequestBody AdPushThresholdValue adPushThresholdValue);
+
+    /**
+     * 功能描述:保存广告发布阈值
+     *
+     * @param adPushThresholdValue
+     * @return ResultBean<Boolean>
+     *                
+     *                      
+     */
+    @PostMapping(value = "/savePushThresholdValue")
+    ResultBean<Boolean> savePushThresholdValue(@RequestBody AdPushThresholdValue adPushThresholdValue);
+
+    /**
+     * 功能描述:获取当前设备发布的有效广告数量
+     * @param deviceId
+     * @return com.sptg.common.core.beans.ResultBean<java.lang.Integer>
+     *                
+     *                     
+     */
+    @PostMapping(value = "/getValidAdPushCountDevice")
+    int getValidAdPushCountDevice(@RequestBody Long deviceId);
+}

+ 89 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/AdTypeFeign.java

@@ -0,0 +1,89 @@
+package com.sptg.ad.api.feigns;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdTypeDto;
+import com.sptg.ad.api.entity.AdType;
+import com.sptg.ad.api.feigns.fallback.AdTypeFeignFallbackFactory;
+import com.sptg.common.core.beans.ResultBean;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * title: AdTypeFeign
+ * package: com.sptg.ad.api.feigns
+ * description: 广告类型-对外接口
+ *
+ *               
+ *                 
+ */
+@FeignClient(value = "smart-house-ad",fallbackFactory = AdTypeFeignFallbackFactory.class)
+public interface AdTypeFeign {
+
+    /**
+     * 查询广告类型列表(分页)
+     * @param adTypeDto
+     * @return 分页查询结果
+     *               
+     *                      
+     */
+    @PostMapping(value = "/showAdTypeList")
+    ResultBean<Page<AdType>> showAdTypeList(AdTypeDto adTypeDto);
+
+   /**
+    * 功能描述:新增/编辑
+    * @param  adType
+    * @return
+    *               
+    *                      
+    */
+    @PostMapping(value = "/addAdType")
+    ResultBean<Boolean> addAdType(AdType adType);
+    /**
+     * 功能描述:删除
+     * @param  ids
+     * @return
+     *               
+     *                      
+     */
+    @PostMapping(value = "/deleteAdType")
+    ResultBean<Boolean> deleteAdType(String ids);
+    /**
+     * 功能描述:获取所有广告分类
+     * @param rootOrgId
+     * @return 
+     *               
+     *                       
+     */
+    @PostMapping(value = "/getAdTypeList")
+    ResultBean<AdType> getAdTypeList(Long rootOrgId);
+    /**
+     * 功能描述: 校验分类名字是否重复
+     * @param  adType
+     * @return
+     *               
+     *                       
+     */
+    @PostMapping(value = "/checkAdTypeName")
+    ResultBean<Boolean> checkAdTypeName(AdType adType);
+
+    /**
+     * 功能描述:获取广告分类---从缓存中获取
+     * @param id
+     * @return
+     *               
+     *                       
+     */
+    @PostMapping(value = "/getAdTypeById")
+    AdType getAdTypeById(Long id);
+
+    /**
+     * 功能描述:获取广告分类数量
+     * @param adTypeDto
+     * @return Integer
+     *                
+     *                      
+     */
+    @PostMapping(value = "/getAdTypeCount")
+    Integer getAdTypeCount(@RequestBody AdTypeDto adTypeDto);
+}

+ 43 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/DeviceAdvertFeign.java

@@ -0,0 +1,43 @@
+package com.sptg.ad.api.feigns;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.entity.DeviceAdvert;
+import com.sptg.ad.api.entity.DeviceAdvertStatistics;
+import com.sptg.common.core.beans.PageBean;
+import com.sptg.common.core.beans.ResultBean;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ *            
+ *               
+ * description:
+ */
+@FeignClient(value = "smart-house-ad")
+public interface DeviceAdvertFeign {
+
+    /**
+     * 分页查询设备广告统计列表
+     * @param pageBean 查询条件
+     * @return Page<DeviceAdvertStatistics>
+     */
+    @PostMapping(value = "/device/advert/statistics/pagingQuery")
+    Page<DeviceAdvertStatistics> pagingQueryStatistics(@RequestBody PageBean<DeviceAdvertStatistics,DeviceAdvertStatistics> pageBean);
+
+    /**
+     * 分页查询设备中的广告列表
+     * @param pageBean 查询条件
+     * @return Page<DeviceAdvert>
+     */
+    @PostMapping(value = "/device/advert/pagingQuery")
+    Page<DeviceAdvert> pagingQuery(@RequestBody PageBean<DeviceAdvert,DeviceAdvert> pageBean);
+
+    /**
+     * 删除设备中的广告
+     * @param advert { id:必填 }
+     * @return ResultBean<Boolean>
+     */
+    @PostMapping(value = "/device/advert/delete")
+    ResultBean<Boolean> deleteAdvert(@RequestBody DeviceAdvert advert);
+}

+ 35 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/EarlyWarningFeign.java

@@ -0,0 +1,35 @@
+package com.sptg.ad.api.feigns;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.entity.EarlyWarning;
+import com.sptg.common.core.beans.PageBean;
+import com.sptg.common.core.beans.ResultBean;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ *            
+ *                
+ * description:
+ */
+@FeignClient(value = "smart-house-ad")
+public interface EarlyWarningFeign {
+
+    /**
+     * 分页查询预警记录
+     * @param pageBean 分页条件
+     * @return Page<EarlyWarning>
+     */
+    @PostMapping(value = "/early_warning/pagingQuery")
+    Page<EarlyWarning> pagingQuery(@RequestBody PageBean<EarlyWarning,EarlyWarning> pageBean);
+
+    /**
+     * 添加预警
+     * @param warning 预警记录
+     * @return Boolean
+     */
+    @PostMapping(value = "/early_warning/add")
+    ResultBean<Boolean> addEntity(@RequestBody EarlyWarning warning);
+
+}

+ 61 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/ThresholdConfigFeign.java

@@ -0,0 +1,61 @@
+package com.sptg.ad.api.feigns;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.entity.ThresholdConfig;
+import com.sptg.common.core.beans.PageBean;
+import com.sptg.common.core.beans.ResultBean;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ *            
+ *               
+ * description:
+ */
+@FeignClient(value = "smart-house-ad")
+public interface ThresholdConfigFeign {
+
+
+    /**
+     * 分页查询阈值配置
+     * @param pageBean 分页条件
+     * @return Page<ThresholdConfig>
+     */
+    @PostMapping(value = "/threshold_config/pageingQuery")
+    Page<ThresholdConfig> pagingQuery(@RequestBody PageBean<ThresholdConfig,ThresholdConfig> pageBean);
+
+    /**
+     * 添加配置
+     * @param config 配置
+     * @return ResultBean
+     */
+    @PostMapping(value = "/threshold_config/add")
+    ResultBean addConfig(@RequestBody ThresholdConfig config);
+
+    /**
+     * 根据Id获取阈值配置
+     * @param id Id
+     * @return ThresholdConfig
+     */
+    @GetMapping(value = "/threshold_config/get/{id}")
+    ThresholdConfig getById(@PathVariable(value = "id") Long id);
+
+    /**
+     * 修改阈值配置
+     * @param config 配置
+     * @return ResultBean
+     */
+    @PostMapping(value = "/threshold_config/edit")
+    ResultBean editConfig(@RequestBody ThresholdConfig config);
+
+    /**
+     * 删除配置
+     * @param id Id
+     * @return ResultBean
+     */
+    @GetMapping(value = "/threshold_config/delete/{id}")
+    ResultBean deleteConfig(@PathVariable(value = "id") Long id);
+}

+ 72 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/fallback/AdAdsenseFeignFallbackFactory.java

@@ -0,0 +1,72 @@
+package com.sptg.ad.api.feigns.fallback;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdAdsenseDto;
+import com.sptg.ad.api.dto.AdContentDto;
+import com.sptg.ad.api.entity.AdAdsense;
+import com.sptg.ad.api.entity.AdContent;
+import com.sptg.ad.api.feigns.AdAdsenseFeign;
+import com.sptg.ad.api.feigns.AdContentFeign;
+import com.sptg.common.core.beans.ResultBean;
+import com.sptg.common.core.beans.ResultEnum;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * title: AdAdsenseFeignFallbackFactory
+ * package: com.sptg.ad.api.feigns.fallback
+ * description: 广告位接口容错处理
+ *
+ *
+ *
+ */
+@Slf4j
+@Component
+public class AdAdsenseFeignFallbackFactory implements FallbackFactory<AdAdsenseFeign> {
+
+    @Override
+    public AdAdsenseFeign create(Throwable cause) {
+        return new AdAdsenseFeign() {
+            @Override
+            public ResultBean<Page<AdAdsense>> showAdAdsenseList(AdAdsenseDto adAdsenseDto) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<Boolean> addAdAdsense(AdAdsense adAdsense) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<Boolean> deleteAdAdsense(String ids) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public AdAdsense findAdsenseById(Long id) {
+                log.error(cause.getMessage(),cause);
+                return new AdAdsense();
+            }
+
+            @Override
+            public ResultBean<Boolean> deleteAdsenseList(AdAdsenseDto adAdsenseDto) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<Boolean> updateAdsenseStatus(Long id, String adsenseStatus) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+            @Override
+            public ResultBean<Integer> getAllAdsenseCount() {
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+        };
+    }
+}

+ 64 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/fallback/AdContentFeignFallbackFactory.java

@@ -0,0 +1,64 @@
+package com.sptg.ad.api.feigns.fallback;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdContentDto;
+import com.sptg.ad.api.entity.AdContent;
+import com.sptg.ad.api.feigns.AdContentFeign;
+import com.sptg.common.core.beans.ResultBean;
+import com.sptg.common.core.beans.ResultEnum;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * title: AdContentFeignFallbackFactory
+ * package: com.sptg.ad.api.feigns.fallback
+ * description: 广告类容接口容错处理
+ *
+ *               
+ *                 
+ */
+@Slf4j
+@Component
+public class AdContentFeignFallbackFactory implements FallbackFactory<AdContentFeign> {
+    @Override
+    public AdContentFeign create(Throwable cause) {
+        return new AdContentFeign() {
+            @Override
+            public ResultBean<Page<AdContent>> showAdContentList(AdContentDto adContentDto) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<Boolean> addAdContent(AdContent adContent) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<Boolean> deleteAdContent(String ids) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<Boolean> deleteAdContentList(AdContentDto adContentDto) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public AdContent findAdContentById(Long id) {
+                log.error(cause.getMessage(),cause);
+                return null;
+            }
+
+            @Override
+            public ResultBean<AdContent> getList(AdContentDto dto) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+        };
+    }
+}

+ 61 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/fallback/AdMaterialFeignFallbackFactory.java

@@ -0,0 +1,61 @@
+package com.sptg.ad.api.feigns.fallback;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdMaterialDto;
+import com.sptg.ad.api.entity.AdMaterial;
+import com.sptg.ad.api.feigns.AdMaterialFeign;
+import com.sptg.common.core.beans.ResultBean;
+import com.sptg.common.core.beans.ResultEnum;
+import feign.hystrix.FallbackFactory;
+import javafx.scene.paint.Material;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * title: AdMaterialFeignFallbackFactory
+ * package: com.sptg.ad.api.feigns.fallback
+ * description: 广告素材接口容错处理
+ *
+ *
+ *
+ */
+@Slf4j
+@Component
+public class AdMaterialFeignFallbackFactory implements FallbackFactory<AdMaterialFeign> {
+    @Override
+    public AdMaterialFeign create(Throwable cause) {
+        return new AdMaterialFeign() {
+            @Override
+            public ResultBean<Page<AdMaterial>> showAdMaterialList(AdMaterialDto adMaterialDto) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<Boolean> addAdMaterial(AdMaterial adMaterial) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<Boolean> deleteAdMaterial(String ids) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public AdMaterial findAdMaterialById(Long id) {
+                log.error(cause.getMessage(),cause);
+                AdMaterial adMaterial = new AdMaterial();
+                adMaterial.setMaterialName("找不到id为 "+id+" 的广告素材");
+                return new AdMaterial();
+            }
+
+            @Override
+            public ResultBean<Boolean> deleteAdMaterialList(AdMaterialDto adMaterialDto) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+        };
+    }
+}

+ 65 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/fallback/AdOfflinePushRecordFeignFallbackFactory.java

@@ -0,0 +1,65 @@
+package com.sptg.ad.api.feigns.fallback;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdOfflinePushRecordDto;
+import com.sptg.ad.api.entity.AdOfflinePushRecord;
+import com.sptg.ad.api.feigns.AdOfflinePushRecordFeign;
+import com.sptg.common.core.beans.ResultBean;
+import com.sptg.common.core.beans.ResultEnum;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+
+/**
+ * title: AdOfflinePushRecordFeignFallbackFactory
+ * package: com.sptg.ad.api.feigns.fallback
+ * description: 线下广告发布记录接口容错处理
+ *
+ *
+ *
+ */
+@Slf4j
+@Component
+public class AdOfflinePushRecordFeignFallbackFactory implements FallbackFactory<AdOfflinePushRecordFeign> {
+    @Override
+    public AdOfflinePushRecordFeign create(Throwable cause) {
+        return new AdOfflinePushRecordFeign() {
+            @Override
+            public ResultBean<Page<AdOfflinePushRecord>> showAdOfflinePushRecordList(AdOfflinePushRecordDto adOfflinePushRecordDto) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<Boolean> addAdOfflinePushRecord(AdOfflinePushRecord adOfflinePushRecord) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<Boolean> cancelAdOfflinePushRecord(Long id) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public AdOfflinePushRecord findAdOfflinePushRecordById(Long id) {
+                return null;
+            }
+            @Override
+            public ResultBean<Boolean> updateAdOfflinePushRecord(AdOfflinePushRecord adOfflinePushRecord) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+            @Override
+            public Integer getAdOfflinePushRecordByProvinceName(String provinceShortName, String orgPosition) {
+                return 0;
+            }
+            @Override
+            public Integer getAdOfflinePushRecordByYearMonth(String year, String month) {
+                return 0;
+            }
+        };
+    }
+}

+ 72 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/fallback/AdPushAppFeignFallbackFactory.java

@@ -0,0 +1,72 @@
+package com.sptg.ad.api.feigns.fallback;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdPushAppDto;
+import com.sptg.ad.api.entity.AdPushApp;
+import com.sptg.ad.api.feigns.AdPushAppFeign;
+import com.sptg.ad.api.feigns.AdTypeFeign;
+import com.sptg.common.core.beans.ResultBean;
+import com.sptg.common.core.beans.ResultEnum;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * title: AdTypeFeignFallbackFactory
+ * package: com.sptg.ad.api.feigns.fallback
+ * description: 移动端广告接口容错处理
+ *
+ *               
+ *                 
+ */
+@Slf4j
+@Component
+public class AdPushAppFeignFallbackFactory implements FallbackFactory<AdPushAppFeign> {
+    @Override
+    public AdPushAppFeign create(Throwable cause) {
+        return new AdPushAppFeign() {
+
+            @Override
+            public ResultBean<Page<AdPushApp>> showList(AdPushAppDto dto) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<Boolean> addEntity(AdPushApp adPushApp) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<Boolean> updateIsEnable(AdPushAppDto dto) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<Boolean> delete(Long id) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<AdPushApp> findById(Long id) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<Boolean> editById(AdPushApp adPushApp) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<AdPushApp> getList(AdPushAppDto dto) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+        };
+    }
+}

+ 40 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/fallback/AdPushDeviceDetailsFallbackFactory.java

@@ -0,0 +1,40 @@
+package com.sptg.ad.api.feigns.fallback;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdPushDeviceDetailsDto;
+import com.sptg.ad.api.entity.AdPushDeviceDetails;
+import com.sptg.ad.api.feigns.AdPushDeviceDetailsFeign;
+import com.sptg.common.core.beans.ResultBean;
+import com.sptg.common.core.beans.ResultEnum;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * title: AdPushTaskFeignFallbackFactory
+ * package: com.sptg.ad.api.feigns.fallback
+ * description: 广告发布到设备详情接口容错处理
+ *
+ *               
+ *                 
+ */
+@Slf4j
+@Component
+public class AdPushDeviceDetailsFallbackFactory implements FallbackFactory<AdPushDeviceDetailsFeign> {
+    @Override
+    public AdPushDeviceDetailsFeign create(Throwable cause) {
+        return new AdPushDeviceDetailsFeign() {
+            @Override
+            public ResultBean<Page<AdPushDeviceDetails>> showAdPushDeviceDetails(AdPushDeviceDetailsDto adPushDeviceDetailsDto) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<Boolean> updatePushStatus(AdPushDeviceDetails dto) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+        };
+    }
+}

+ 105 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/fallback/AdPushTaskFeignFallbackFactory.java

@@ -0,0 +1,105 @@
+package com.sptg.ad.api.feigns.fallback;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdPushTaskDto;
+import com.sptg.ad.api.entity.AdPushContent;
+import com.sptg.ad.api.entity.AdPushTask;
+import com.sptg.ad.api.entity.AdPushTaskDetails;
+import com.sptg.ad.api.entity.AdPushThresholdValue;
+import com.sptg.ad.api.feigns.AdPushTaskFeign;
+import com.sptg.common.core.beans.ResultBean;
+import com.sptg.common.core.beans.ResultEnum;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * title: AdPushTaskFeignFallbackFactory
+ * package: com.sptg.ad.api.feigns.fallback
+ * description: 广告类容接口容错处理
+ *
+ *               
+ *                 
+ */
+@Slf4j
+@Component
+public class AdPushTaskFeignFallbackFactory implements FallbackFactory<AdPushTaskFeign> {
+    @Override
+    public AdPushTaskFeign create(Throwable cause) {
+        return new AdPushTaskFeign() {
+            @Override
+            public ResultBean<Page<AdPushTask>> showAdPushTaskList(AdPushTaskDto adPushTaskDto) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<Boolean> addAdPushTask(AdPushTask adPushTask) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<Boolean> cancelAdPushTask(Long id) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public AdPushTask findAdPushTaskById(Long id) {
+                log.error(cause.getMessage(),cause);
+                return null;
+            }
+
+            @Override
+            public ResultBean<Boolean> manuallyIssued(Long id) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public AdPushContent getPushContentByTask(Long taskId, String code) {
+                log.error(cause.getMessage(),cause);
+                return null;
+            }
+
+            @Override
+            public List<AdPushTaskDetails> getAdPushTaskDetailsByTaskId(Long id) {
+                log.error(cause.getMessage(),cause);
+                return null;
+            }
+
+            @Override
+            public List<AdPushContent> getAdPushContentsByTaskId(Long id) {
+                log.error(cause.getMessage(),cause);
+                return null;
+            }
+
+            @Override
+            public ResultBean<Boolean> adIssued(Long deviceId) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public AdPushThresholdValue getAdPushThresholdValue(AdPushThresholdValue adPushThresholdValue) {
+                log.error(cause.getMessage(),cause);
+                return null;
+            }
+
+            @Override
+            public ResultBean<Boolean> savePushThresholdValue(AdPushThresholdValue adPushThresholdValue) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public int getValidAdPushCountDevice(Long deviceId) {
+                log.error(cause.getMessage(),cause);
+                return 0;
+            }
+        };
+    }
+}

+ 72 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/feigns/fallback/AdTypeFeignFallbackFactory.java

@@ -0,0 +1,72 @@
+package com.sptg.ad.api.feigns.fallback;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdTypeDto;
+import com.sptg.ad.api.entity.AdType;
+import com.sptg.ad.api.feigns.AdTypeFeign;
+import com.sptg.common.core.beans.ResultBean;
+import com.sptg.common.core.beans.ResultEnum;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * title: AdTypeFeignFallbackFactory
+ * package: com.sptg.ad.api.feigns.fallback
+ * description: 广告类型接口容错处理
+ *
+ *               
+ *                 
+ */
+@Slf4j
+@Component
+public class AdTypeFeignFallbackFactory implements FallbackFactory<AdTypeFeign> {
+    @Override
+    public AdTypeFeign create(Throwable cause) {
+        return new AdTypeFeign() {
+            @Override
+            public ResultBean<Page<AdType>> showAdTypeList(AdTypeDto adTypeDto) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<Boolean> addAdType(AdType adType) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<Boolean> deleteAdType(String ids) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<AdType> getAdTypeList(Long rootOrgId) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public ResultBean<Boolean> checkAdTypeName(AdType adType) {
+                log.error(cause.getMessage(),cause);
+                return new ResultBean<>(ResultEnum.ERROR);
+            }
+
+            @Override
+            public AdType getAdTypeById(Long id) {
+                log.error(cause.getMessage(),cause);
+                return null;
+            }
+
+            @Override
+            public Integer getAdTypeCount(AdTypeDto adTypeDto) {
+                log.error(cause.getMessage(),cause);
+                return null;
+            }
+        };
+    }
+}

+ 19 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/stream/AdvertTaskCallbackProduceInterface.java

@@ -0,0 +1,19 @@
+package com.sptg.ad.api.stream;
+
+import org.springframework.cloud.stream.annotation.Output;
+import org.springframework.messaging.SubscribableChannel;
+
+/**
+ *            
+ *                
+ * description: 广告任务回调生产者接口
+ */
+public interface AdvertTaskCallbackProduceInterface {
+
+    /**
+     * 读取消息
+     * @return SubscribableChannel
+     */
+    @Output(value = "advert_task_callback_output")
+    SubscribableChannel output();
+}

+ 22 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/stream/SyncFaceAdvertDataProduceInterface.java

@@ -0,0 +1,22 @@
+package com.sptg.ad.api.stream;
+
+import org.springframework.cloud.stream.annotation.Output;
+import org.springframework.messaging.SubscribableChannel;
+
+/**
+ * title: SyncFaceAdvertDataProduceInterface
+ * description: 同步设备广告数据生产者接口
+ *
+ *                  
+ *            
+ */
+public interface SyncFaceAdvertDataProduceInterface {
+
+    /**
+     * 读取消息
+     * @return SubscribableChannel
+     */
+    @Output(value = "sync_face_advert_data_channel_output")
+    SubscribableChannel output();
+
+}

+ 22 - 0
sptg-ad/sptg-ad-api/src/main/java/com/sptg/ad/api/stream/SyncLeisureAdvertDataProduceInterface.java

@@ -0,0 +1,22 @@
+package com.sptg.ad.api.stream;
+
+import org.springframework.cloud.stream.annotation.Output;
+import org.springframework.messaging.SubscribableChannel;
+
+/**
+ * title: SyncPbDataDeviceProduceInterface
+ * description: 同步设备屏保生产者接口
+ *
+ *                  
+ *            
+ */
+public interface SyncLeisureAdvertDataProduceInterface {
+
+    /**
+     * 读取消息
+     * @return SubscribableChannel
+     */
+    @Output(value = "sync_leisure_advert_data_channel_output")
+    SubscribableChannel output();
+
+}

+ 86 - 0
sptg-ad/sptg-ad-biz/pom.xml

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>sptg-ad</artifactId>
+        <groupId>com.sptg</groupId>
+        <version>1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>sptg-ad-biz</artifactId>
+    <description>广告业务实现</description>
+
+    <dependencies>
+
+        <!-- ===================================== Or JAR ===================================== -->
+        <!-- MySql -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <!-- druid 数据源 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <!-- ===================================== Modular JAR ===================================== -->
+        <!-- 广告服务接口 -->
+        <dependency>
+            <groupId>com.sptg</groupId>
+            <artifactId>sptg-ad-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <!-- 权限模块接口 -->
+        <dependency>
+            <groupId>com.sptg</groupId>
+            <artifactId>sptg-permissions-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <!-- 设备模块接口 -->
+        <dependency>
+            <groupId>com.sptg</groupId>
+            <artifactId>sptg-device-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <!-- 统计模块接口 -->
+        <dependency>
+            <groupId>com.sptg</groupId>
+            <artifactId>sptg-statistics-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <!-- ===================================== Spring Boot JAR ===================================== -->
+        <!-- 测试用例 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+        </dependency>
+        <!-- mybatis-plus -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <filters>
+		  <filter>../../env_files/properties/${env}.properties</filter>
+		</filters>
+        <plugins>
+            <!-- Spring Boot 打包插件( 非“Web模块”请勿引入) -->
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 46 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/AdApplication.java

@@ -0,0 +1,46 @@
+package com.sptg.ad.biz;
+
+import com.sptg.ad.api.stream.AdvertTaskCallbackProduceInterface;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.cloud.netflix.hystrix.EnableHystrix;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+/**
+ * title: AdApplication
+ * package: com.sptg.ad.biz
+ * description: 广告服务启动类
+ *
+ *                  
+ *                 
+ */
+@Slf4j
+@SpringBootApplication
+@EnableEurekaClient
+@EnableHystrix
+@EnableScheduling
+@EnableFeignClients(basePackages = {
+        "com.sptg.device.api.feigns",
+        "com.sptg.permissions.api.feigns",
+        "com.sptg.statistics.api.feigns"
+})
+@ComponentScan(basePackages = {
+        "com.sptg.ad.biz",
+        "com.sptg.device.api.feigns",
+        "com.sptg.permissions.api.feigns",
+        "com.sptg.statistics.api.feigns"
+})
+@EnableBinding(value = AdvertTaskCallbackProduceInterface.class)
+public class AdApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(AdApplication.class,args);
+        log.warn("启动完成");
+    }
+
+}

+ 31 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/cfgbeans/MyBatisPlusConfigBean.java

@@ -0,0 +1,31 @@
+package com.sptg.ad.biz.cfgbeans;
+
+import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * title: MyBatisPlusConfigBean
+ * package: com.sptg.ad.biz.cfgbeans
+ * description: MyBatisPuls配置类
+ *
+ *                  
+ *                 
+ */
+@Configuration
+@MapperScan("com.sptg.ad.biz.mapper")
+public class MyBatisPlusConfigBean {
+
+    /**
+     * 分页插件,自动识别数据库类型
+     * 多租户,请参考官网【插件扩展】
+     * @return PaginationInterceptor
+     */
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        return new PaginationInterceptor();
+    }
+
+
+}

+ 73 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/AdAdsenseController.java

@@ -0,0 +1,73 @@
+package com.sptg.ad.biz.controller;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdAdsenseDto;
+import com.sptg.ad.api.dto.AdContentDto;
+import com.sptg.ad.api.entity.AdAdsense;
+import com.sptg.ad.api.entity.AdContent;
+import com.sptg.ad.api.feigns.AdAdsenseFeign;
+import com.sptg.ad.api.feigns.AdContentFeign;
+import com.sptg.ad.biz.service.AdAdsenseServiceInterface;
+import com.sptg.ad.biz.service.AdContentServiceInterface;
+import com.sptg.common.core.beans.ResultBean;
+import com.sptg.common.core.beans.ResultEnum;
+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.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * title: AdContentController
+ * package: com.sptg.ad.biz.controller
+ * description: 广告位-控制器
+ *
+ *
+ *
+ */
+@RestController
+public class AdAdsenseController implements AdAdsenseFeign {
+
+    private final AdAdsenseServiceInterface adAdsenseServiceInterface;
+    @Autowired
+    public AdAdsenseController(AdAdsenseServiceInterface adAdsenseServiceInterface){
+        this.adAdsenseServiceInterface = adAdsenseServiceInterface;
+    }
+    @Override
+    @PostMapping("/showAdAdsenseList")
+    public ResultBean<Page<AdAdsense>> showAdAdsenseList(@RequestBody AdAdsenseDto adAdsenseDto) {
+        Page<AdAdsense> adAdsensePage = adAdsenseServiceInterface.showAdAdsenseList(adAdsenseDto);
+        return new ResultBean<>(ResultEnum.SUCCESS,adAdsensePage);
+    }
+
+    @Override
+    @PostMapping("/addAdAdsense")
+    public ResultBean<Boolean> addAdAdsense(@RequestBody AdAdsense adAdsense) {
+        return this.adAdsenseServiceInterface.addAdAdsense(adAdsense);
+    }
+
+    @Override
+    @PostMapping("/deleteAdAdsense")
+    public ResultBean<Boolean> deleteAdAdsense(@RequestBody String ids) {
+        return this.adAdsenseServiceInterface.deleteAdAdsense(ids);
+    }
+
+    @Override
+    public AdAdsense findAdsenseById(@RequestBody Long id) {
+        return this.adAdsenseServiceInterface.findAdAdsenseById(id);
+    }
+
+    @Override
+    public ResultBean<Boolean> deleteAdsenseList(@RequestBody AdAdsenseDto adAdsenseDto) {
+        return this.adAdsenseServiceInterface.deleteAdsenseList(adAdsenseDto);
+    }
+
+    @Override
+    public ResultBean<Boolean> updateAdsenseStatus(@RequestParam("id") Long id, @RequestParam("adsenseStatus") String adsenseStatus) {
+        return this.adAdsenseServiceInterface.updateAdsenseStatus(id,adsenseStatus);
+    }
+    @Override
+    public ResultBean<Integer> getAllAdsenseCount() {
+        return this.adAdsenseServiceInterface.getAllAdsenseCount();
+    }
+}

+ 105 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/AdContentController.java

@@ -0,0 +1,105 @@
+package com.sptg.ad.biz.controller;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdContentDto;
+import com.sptg.ad.api.entity.AdContent;
+import com.sptg.ad.api.feigns.AdContentFeign;
+import com.sptg.ad.biz.service.AdContentServiceInterface;
+import com.sptg.common.core.beans.ResultBean;
+import com.sptg.common.core.beans.ResultEnum;
+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.RestController;
+
+/**
+ * title: AdContentController
+ * package: com.sptg.ad.biz.controller
+ * description: 广告类容-控制器
+ *
+ *               
+ *                 
+ */
+@RestController
+public class AdContentController implements AdContentFeign {
+
+    private final AdContentServiceInterface adContentServiceInterface;
+
+    /**
+     * 功能描述:显示广告类容列表
+     * @param
+     * @return 
+     *               
+     *                       
+     */
+    @Override
+    @PostMapping(value = "/showAdContentList")
+    public ResultBean<Page<AdContent>> showAdContentList(@RequestBody AdContentDto adContentDto) {
+        Page<AdContent> adContentPage = adContentServiceInterface.showAdContentList(adContentDto);
+        return new ResultBean<>(ResultEnum.SUCCESS,adContentPage);
+    }
+    /**
+     * 功能描述: 添加/修改
+     * @param
+     * @return
+     *               
+     *                       
+     */
+    @Override
+    @PostMapping(value = "/addAdContent")
+    public ResultBean<Boolean> addAdContent(@RequestBody AdContent adContent) {
+        return this.adContentServiceInterface.addAdContent(adContent);
+    }
+
+    /**
+     * 功能描述: 删除
+     * @param
+     * @return
+     *               
+     *                       
+     */
+    @Override
+    @PostMapping(value = "/deleteAdContent")
+    public ResultBean<Boolean> deleteAdContent(@RequestBody String ids) {
+        return this.adContentServiceInterface.deleteAdContent(ids);
+    }
+
+    @Override
+    @PostMapping(value = "/deleteAdContentList")
+    public ResultBean<Boolean> deleteAdContentList(@RequestBody AdContentDto adContentDto) {
+        return this.adContentServiceInterface.deleteAdContentList(adContentDto);
+    }
+
+    /**
+     * 功能描述: 根据id查询广告
+     * @param
+     * @return
+     *               
+     *                       
+     */
+    @Override
+    @PostMapping(value = "/findAdContentById")
+    public AdContent findAdContentById(@RequestBody Long id) {
+        return this.adContentServiceInterface.findAdContentById(id);
+    }
+
+    /**
+     * 功能描述: 获取广告列表
+     * @param  { adTitle:广告标题}
+     * @return
+     *               
+     *                       
+     */
+    @Override
+    @PostMapping(value = "/getList")
+    public ResultBean<AdContent> getList(@RequestBody AdContentDto dto){
+        return this.adContentServiceInterface.getList(dto);
+    }
+
+    @Autowired
+    public AdContentController(
+            AdContentServiceInterface adContentServiceInterface
+    ){
+        this.adContentServiceInterface = adContentServiceInterface;
+    }
+}

+ 64 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/AdMaterialController.java

@@ -0,0 +1,64 @@
+package com.sptg.ad.biz.controller;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdAdsenseDto;
+import com.sptg.ad.api.dto.AdMaterialDto;
+import com.sptg.ad.api.entity.AdAdsense;
+import com.sptg.ad.api.entity.AdContent;
+import com.sptg.ad.api.entity.AdMaterial;
+import com.sptg.ad.api.feigns.AdAdsenseFeign;
+import com.sptg.ad.api.feigns.AdMaterialFeign;
+import com.sptg.ad.biz.service.AdAdsenseServiceInterface;
+import com.sptg.ad.biz.service.AdMaterialServiceInterface;
+import com.sptg.common.core.beans.ResultBean;
+import com.sptg.common.core.beans.ResultEnum;
+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.RestController;
+
+/**
+ * title: AdMaterialController
+ * package: com.sptg.ad.biz.controller
+ * description: 广告素材-控制器
+ *
+ *
+ *
+ */
+@RestController
+public class AdMaterialController implements AdMaterialFeign {
+
+    private final AdMaterialServiceInterface adMaterialServiceInterface;
+    @Autowired
+    public AdMaterialController(AdMaterialServiceInterface adMaterialServiceInterface){
+        this.adMaterialServiceInterface = adMaterialServiceInterface;
+    }
+    @Override
+    @PostMapping("/showAdMaterialList")
+    public ResultBean<Page<AdMaterial>> showAdMaterialList(@RequestBody AdMaterialDto adMaterialDto) {
+        Page<AdMaterial> adMaterialPage = adMaterialServiceInterface.showAdMaterialList(adMaterialDto);
+        return new ResultBean<>(ResultEnum.SUCCESS,adMaterialPage);
+    }
+
+    @Override
+    @PostMapping("/addAdMaterial")
+    public ResultBean<Boolean> addAdMaterial(@RequestBody AdMaterial adMaterial) {
+        return this.adMaterialServiceInterface.addAdMaterial(adMaterial);
+    }
+
+    @Override
+    @PostMapping("/deleteAdMaterial")
+    public ResultBean<Boolean> deleteAdMaterial(@RequestBody String ids) {
+        return this.adMaterialServiceInterface.deleteAdMaterial(ids);
+    }
+    @Override
+    @PostMapping(value = "/findAdMaterialById")
+    public AdMaterial findAdMaterialById(@RequestBody Long id) {
+        return this.adMaterialServiceInterface.findAdMaterialById(id);
+    }
+
+    @Override
+    public ResultBean<Boolean> deleteAdMaterialList(@RequestBody  AdMaterialDto adMaterialDto) {
+        return this.adMaterialServiceInterface.deleteAdMaterialList(adMaterialDto);
+    }
+}

+ 65 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/AdOfflinePushRecordController.java

@@ -0,0 +1,65 @@
+package com.sptg.ad.biz.controller;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdOfflinePushRecordDto;
+import com.sptg.ad.api.dto.AdPushTaskDto;
+import com.sptg.ad.api.entity.*;
+import com.sptg.ad.api.feigns.AdOfflinePushRecordFeign;
+import com.sptg.ad.api.feigns.AdPushTaskFeign;
+import com.sptg.ad.biz.service.*;
+import com.sptg.common.core.beans.ResultBean;
+import com.sptg.common.core.beans.ResultEnum;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * title: AdPushTaskController
+ * package: com.sptg.ad.biz.controller
+ * description: 广告任务发布-控制器
+ *
+ *
+ *
+ */
+@RestController
+@RequiredArgsConstructor
+public class AdOfflinePushRecordController implements AdOfflinePushRecordFeign {
+
+    private final AdOfflinePushRecordServiceInterface adOfflinePushRecordServiceInterface;
+
+    @Override
+    public ResultBean<Page<AdOfflinePushRecord>> showAdOfflinePushRecordList(@RequestBody AdOfflinePushRecordDto adOfflinePushRecordDto) {
+        Page<AdOfflinePushRecord> offlinePushRecordPage = this.adOfflinePushRecordServiceInterface.showAdOfflinePushRecordList(adOfflinePushRecordDto);
+        return new ResultBean<>(ResultEnum.SUCCESS,offlinePushRecordPage);
+    }
+
+    @Override
+    public ResultBean<Boolean> addAdOfflinePushRecord(@RequestBody AdOfflinePushRecord adOfflinePushRecord) {
+        return this.adOfflinePushRecordServiceInterface.addAdOfflinePushRecord(adOfflinePushRecord);
+    }
+
+    @Override
+    public ResultBean<Boolean> cancelAdOfflinePushRecord(@RequestBody  Long id) {
+        return this.adOfflinePushRecordServiceInterface.cancelAdOfflinePushRecord(id);
+    }
+
+    @Override
+    public AdOfflinePushRecord findAdOfflinePushRecordById(@RequestBody  Long id) {
+        return this.adOfflinePushRecordServiceInterface.findAdOfflinePushRecordById(id);
+    }
+    @Override
+    public ResultBean<Boolean> updateAdOfflinePushRecord(@RequestBody AdOfflinePushRecord adOfflinePushRecord) {
+        return this.adOfflinePushRecordServiceInterface.updateAdOfflinePushRecord(adOfflinePushRecord);
+    }
+    @Override
+    public Integer getAdOfflinePushRecordByProvinceName(@RequestParam("provinceShortName") String provinceShortName,@RequestParam("orgPosition") String orgPosition) {
+        return this.adOfflinePushRecordServiceInterface.getAdOfflinePushRecordByProvinceName(provinceShortName,orgPosition);
+    }
+    @Override
+    public Integer getAdOfflinePushRecordByYearMonth(@RequestParam(name="year",required = false) String year,@RequestParam(name="month",required = false) String month) {
+        return this.adOfflinePushRecordServiceInterface.getAdOfflinePushRecordByYearMonth(year,month);
+    }
+}

+ 76 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/AdPushAppController.java

@@ -0,0 +1,76 @@
+package com.sptg.ad.biz.controller;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdPushAppDto;
+import com.sptg.ad.api.entity.AdPushApp;
+import com.sptg.ad.api.feigns.AdPushAppFeign;
+import com.sptg.ad.biz.service.AdPushAppServiceInterface;
+import com.sptg.common.core.beans.ResultBean;
+import com.sptg.common.core.beans.ResultEnum;
+import com.sptg.common.core.constant.OperationConstant;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * title: AdTypeController
+ * package: com.sptg.ad.biz.controller
+ * description: 广告类型-控制器
+ *
+ *               
+ *                 
+ */
+@RestController
+@RequestMapping(value = "/ad/push/app")
+@RequiredArgsConstructor
+public class AdPushAppController implements AdPushAppFeign {
+
+    private final AdPushAppServiceInterface adPushAppServiceInterface;
+
+    @Override
+    @PostMapping(value = "/showList")
+    public ResultBean<Page<AdPushApp>> showList(@RequestBody AdPushAppDto dto) {
+        return this.adPushAppServiceInterface.showList(dto);
+    }
+
+    @Override
+    @PostMapping(value = "/addEntity")
+    public ResultBean<Boolean> addEntity(@RequestBody AdPushApp adPushApp) {
+        return new ResultBean<>(ResultEnum.SUCCESS,this.adPushAppServiceInterface.insert(adPushApp));
+    }
+
+    @Override
+    @PostMapping(value = "/updateIsEnable")
+    public ResultBean<Boolean> updateIsEnable(@RequestBody AdPushAppDto dto) {
+        return new ResultBean<>(ResultEnum.SUCCESS,this.adPushAppServiceInterface.updateById(dto));
+    }
+
+    @Override
+    @PostMapping(value = "/delete")
+    public ResultBean<Boolean> delete(@RequestBody Long id) {
+        AdPushApp adPushApp = new AdPushApp();
+        adPushApp.setId(id);
+        adPushApp.setStatus(OperationConstant.MINUS_ONE);
+        return new ResultBean<>(ResultEnum.SUCCESS,this.adPushAppServiceInterface.updateById(adPushApp));
+    }
+
+    @Override
+    @PostMapping(value = "/findById")
+    public ResultBean<AdPushApp> findById(@RequestBody Long id) {
+        return new ResultBean<>(ResultEnum.SUCCESS,this.adPushAppServiceInterface.selectById(id));
+    }
+
+    @Override
+    @PostMapping(value = "/editById")
+    public ResultBean<Boolean> editById(@RequestBody AdPushApp adPushApp) {
+        return new ResultBean<>(ResultEnum.SUCCESS,this.adPushAppServiceInterface.updateById(adPushApp));
+    }
+
+    @Override
+    @PostMapping(value = "/getList")
+    public ResultBean<AdPushApp> getList(@RequestBody AdPushAppDto dto) {
+        return this.adPushAppServiceInterface.getList(dto);
+    }
+}

+ 109 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/AdPushDeviceDetailsController.java

@@ -0,0 +1,109 @@
+package com.sptg.ad.biz.controller;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdPushDeviceDetailsDto;
+import com.sptg.ad.api.entity.AdPushContent;
+import com.sptg.ad.api.entity.AdPushDeviceDetails;
+import com.sptg.ad.api.entity.AdPushTask;
+import com.sptg.ad.api.feigns.AdPushDeviceDetailsFeign;
+import com.sptg.ad.biz.service.AdPushContentServiceInterface;
+import com.sptg.ad.biz.service.AdPushDeviceDetailsServiceInterface;
+import com.sptg.ad.biz.service.AdPushTaskServiceInterface;
+import com.sptg.common.core.beans.ResultBean;
+import com.sptg.common.core.beans.ResultEnum;
+import com.sptg.common.core.constant.OperationConstant;
+import com.sptg.device.api.entity.Device;
+import com.sptg.device.api.feigns.DeviceFeign;
+import com.sptg.statistics.api.entity.StatisticsAdPush;
+import com.sptg.statistics.api.feigns.StatisticsAdPushFeign;
+import lombok.RequiredArgsConstructor;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * title: AdTypeController
+ * package: com.sptg.ad.biz.controller
+ * description: 广告发布到设备详情--控制器
+ *
+ *               
+ *                 
+ */
+@RestController
+@RequiredArgsConstructor
+public class AdPushDeviceDetailsController implements AdPushDeviceDetailsFeign {
+
+    private final AdPushTaskServiceInterface adPushTaskServiceInterface;
+    private final AdPushDeviceDetailsServiceInterface adPushDeviceDetailsServiceInterface;
+    private final DeviceFeign deviceFeign;
+    private final StatisticsAdPushFeign statisticsAdPushFeign;
+    private final AdPushContentServiceInterface adPushContentServiceInterface;
+
+
+    /**
+     * 查询详情列表(分页)
+     * @return 分页查询结果
+     *               
+     *                      
+     */
+    @Override
+    @PostMapping(value = "/showAdPushDeviceDetails")
+    public ResultBean<Page<AdPushDeviceDetails>> showAdPushDeviceDetails(@RequestBody AdPushDeviceDetailsDto adPushDeviceDetailsDto){
+       Page<AdPushDeviceDetails> page = adPushDeviceDetailsServiceInterface.showAdPushDeviceDetails(adPushDeviceDetailsDto);
+       return new ResultBean<>(ResultEnum.SUCCESS,page);
+    }
+
+    @Override
+    @PostMapping(value = "/ad/task/updatePushStatus")
+    @Transactional(rollbackFor = Exception.class)
+    public ResultBean<Boolean> updatePushStatus(@RequestBody AdPushDeviceDetails dto) {
+        Wrapper<AdPushDeviceDetails> wrapper = new EntityWrapper<>();
+        wrapper.eq("l_task_id",dto.getTaskId());
+        wrapper.eq("s_serial_number",dto.getSerialNumber());
+        boolean result = this.adPushDeviceDetailsServiceInterface.update(dto, wrapper);
+        Assert.isTrue(result,"请求参数有误");
+        //  判断是否推送成功
+        if (dto.getPushStatus() == OperationConstant.ONE){
+            //  获取推送任务信息
+            AdPushTask task = this.adPushTaskServiceInterface.selectById(dto.getTaskId());
+            task.setPushSuccess(task.getPushSuccess() + 1);
+            result = this.adPushTaskServiceInterface.updateById(task);
+        }
+        //发布广告内容
+        List<AdPushContent> contentList = this.adPushContentServiceInterface.getAdPushContents(dto.getTaskId());
+        if(!contentList.isEmpty()){
+            Device device = this.deviceFeign.getEntityBySerialNumber(dto.getSerialNumber());
+            AdPushTask adPushTask = this.adPushTaskServiceInterface.findAdPushTaskById(dto.getTaskId());
+            Date now = new Date();
+            List<StatisticsAdPush> statisticsAdPushList = new ArrayList<>();
+            contentList.forEach(content -> {
+                StatisticsAdPush statisticsAdPush=new StatisticsAdPush();
+                statisticsAdPush.setAdPushTaskId(dto.getTaskId());
+                statisticsAdPush.setTaskType(adPushTask.getTaskType());
+                statisticsAdPush.setAdContentId(content.getAdId());
+                statisticsAdPush.setAdBeginDate(adPushTask.getBeginDate());
+                statisticsAdPush.setAdEndDate(adPushTask.getEndDate());
+                statisticsAdPush.setDeviceSerialNumber(device.getSerialNumber());
+                statisticsAdPush.setDeviceInstallPath(device.getInstallPath());
+                statisticsAdPush.setDeviceRegionProvince(device.getRegionProvince());
+                statisticsAdPush.setDeviceRegionCity(device.getRegionCity());
+                statisticsAdPush.setDeviceRegionArea(device.getRegionArea());
+                statisticsAdPush.setOrgPosition(adPushTask.getOrgPosition());
+                statisticsAdPush.setRootOrgId(adPushTask.getRootOrgId());
+                statisticsAdPush.setCreateDate(now);
+                statisticsAdPushList.add(statisticsAdPush);
+            });
+            //统计广告发布投放记录
+            this.statisticsAdPushFeign.addAdPushList(statisticsAdPushList);
+        }
+        return new ResultBean<>(ResultEnum.SUCCESS,result);
+    }
+}

+ 128 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/AdPushTaskController.java

@@ -0,0 +1,128 @@
+package com.sptg.ad.biz.controller;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdPushTaskDto;
+import com.sptg.ad.api.entity.AdPushContent;
+import com.sptg.ad.api.entity.AdPushTask;
+import com.sptg.ad.api.entity.AdPushTaskDetails;
+import com.sptg.ad.api.entity.AdPushThresholdValue;
+import com.sptg.ad.api.feigns.AdPushTaskFeign;
+import com.sptg.ad.biz.service.AdPushContentServiceInterface;
+import com.sptg.ad.biz.service.AdPushTaskDetailsServiceInterface;
+import com.sptg.ad.biz.service.AdPushTaskServiceInterface;
+import com.sptg.ad.biz.service.AdPushThresholdValueServiceInterface;
+import com.sptg.common.core.beans.ResultBean;
+import com.sptg.common.core.beans.ResultEnum;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * title: AdPushTaskController
+ * package: com.sptg.ad.biz.controller
+ * description: 广告任务发布-控制器
+ *
+ *               
+ *                 
+ */
+@RestController
+@RequiredArgsConstructor
+public class AdPushTaskController implements AdPushTaskFeign {
+
+    private final AdPushContentServiceInterface adPushContentServiceInterface;
+    private final AdPushTaskServiceInterface adPushTaskServiceInterface;
+    private final AdPushTaskDetailsServiceInterface adPushTaskDetailsServiceInterface;
+    private final AdPushThresholdValueServiceInterface adPushThresholdValueServiceInterface;
+
+    /**
+     * 功能描述:显示广告类容列表
+     * @param
+     * @return
+     *               
+     *                       
+     */
+    @Override
+    @PostMapping(value = "/showAdPushTaskList")
+    public ResultBean<Page<AdPushTask>> showAdPushTaskList(@RequestBody AdPushTaskDto adPushTaskDto) {
+        Page<AdPushTask> adPushTaskPage = adPushTaskServiceInterface.showAdPushTaskList(adPushTaskDto);
+        return new ResultBean<>(ResultEnum.SUCCESS,adPushTaskPage);
+    }
+
+    @Override
+    @PostMapping(value = "/addAdPushTask")
+    public ResultBean<Boolean> addAdPushTask(@RequestBody AdPushTask adPushTask){
+        return this.adPushTaskServiceInterface.addAdPushTask(adPushTask);
+    }
+
+    @Override
+    @PostMapping(value = "/cancelAdPushTask")
+    public ResultBean<Boolean> cancelAdPushTask(@RequestBody Long id) {
+        return this.adPushTaskServiceInterface.cancelAdPushTask(id);
+    }
+
+    @Override
+    @PostMapping(value = "/findAdPushTaskById")
+    public AdPushTask findAdPushTaskById(@RequestBody Long id) {
+        return this.adPushTaskServiceInterface.findAdPushTaskById(id);
+    }
+
+    @Override
+    @PostMapping(value = "/manuallyIssued")
+    public ResultBean<Boolean> manuallyIssued(@RequestBody Long id) {
+        return this.adPushTaskServiceInterface.manuallyIssued(id);
+    }
+
+    @Override
+    @GetMapping(value = "/getPushContentByTask/{taskId}/{code}")
+    public AdPushContent getPushContentByTask(
+            @PathVariable(value = "taskId")Long taskId,
+            @PathVariable(value = "code")String code
+    ) {
+        Wrapper<AdPushContent> wrapper = new EntityWrapper<>();
+        wrapper.eq("l_task_id",taskId);
+        wrapper.eq("s_ad_code",code);
+        return this.adPushContentServiceInterface.selectOne(wrapper);
+    }
+
+    @Override
+    @PostMapping(value = "/getAdPushTaskDetailsByTaskId")
+    public List<AdPushTaskDetails> getAdPushTaskDetailsByTaskId(@RequestBody Long id) {
+        return this.adPushTaskDetailsServiceInterface.getAdPushTaskDetails(id);
+    }
+
+    @Override
+    @PostMapping(value = "/getAdPushContentsByTaskId")
+    public List<AdPushContent> getAdPushContentsByTaskId(@RequestBody Long id) {
+        return this.adPushContentServiceInterface.getAdPushContents(id);
+    }
+
+    @Override
+    @PostMapping(value = "/adIssued")
+    public ResultBean<Boolean> adIssued(@RequestBody Long deviceId) {
+        return this.adPushTaskServiceInterface.adIssued(deviceId);
+    }
+
+    @Override
+    @PostMapping(value = "/getAdPushThresholdValue")
+    public AdPushThresholdValue getAdPushThresholdValue(@RequestBody AdPushThresholdValue adPushThresholdValue) {
+        return this.adPushThresholdValueServiceInterface.getAdPushThresholdValue(adPushThresholdValue);
+    }
+
+    @Override
+    @PostMapping(value = "/savePushThresholdValue")
+    public ResultBean<Boolean> savePushThresholdValue(@RequestBody AdPushThresholdValue adPushThresholdValue) {
+        boolean result=this.adPushThresholdValueServiceInterface.saveOrUpdate(adPushThresholdValue);
+        return  new ResultBean<>(ResultEnum.SUCCESS,result);
+    }
+
+    @Override
+    @PostMapping(value = "/getValidAdPushCountDevice")
+    public int getValidAdPushCountDevice(@RequestBody Long deviceId) {
+        int count=this.adPushTaskServiceInterface.getValidAdPushCountDevice(deviceId);
+        return  count;
+    }
+}

+ 82 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/AdTypeController.java

@@ -0,0 +1,82 @@
+package com.sptg.ad.biz.controller;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.dto.AdTypeDto;
+import com.sptg.ad.api.entity.AdType;
+import com.sptg.ad.api.feigns.AdTypeFeign;
+import com.sptg.ad.biz.service.AdTypeServiceInterface;
+import com.sptg.common.core.beans.ResultBean;
+import com.sptg.common.core.beans.ResultEnum;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * title: AdTypeController
+ * package: com.sptg.ad.biz.controller
+ * description: 广告类型-控制器
+ *
+ *               
+ *                 
+ */
+@RestController
+public class AdTypeController implements AdTypeFeign {
+
+    private final AdTypeServiceInterface adTypeServiceInterface;
+
+
+    /**
+     * 查询广告类型列表(分页)
+     * @param
+     * @return 分页查询结果
+     *               
+     *                      
+     */
+    @Override
+    @PostMapping(value = "/showAdTypeList")
+    public ResultBean<Page<AdType>> showAdTypeList(@RequestBody AdTypeDto adTypeDto){
+       Page<AdType> adTypePage = adTypeServiceInterface.showAdTypeList(adTypeDto);
+       return new ResultBean<>(ResultEnum.SUCCESS,adTypePage);
+    }
+
+    @Override
+    @PostMapping(value = "/addAdType")
+    public ResultBean<Boolean> addAdType(@RequestBody AdType adType) {
+        return this.adTypeServiceInterface.addAdType(adType);
+    }
+
+    @Override
+    @PostMapping(value = "/deleteAdType")
+    public ResultBean<Boolean> deleteAdType(@RequestBody String ids) {
+        return this.adTypeServiceInterface.deleteAdType(ids);
+    }
+
+    @Override
+    @PostMapping(value = "/getAdTypeList")
+    public ResultBean<AdType> getAdTypeList(@RequestBody Long rootOrgId) {
+        return this.adTypeServiceInterface.getAdTypeList(rootOrgId);
+    }
+
+    @Override
+    @PostMapping(value = "/checkAdTypeName")
+    public ResultBean<Boolean> checkAdTypeName(@RequestBody AdType adType) {
+        return this.adTypeServiceInterface.checkAdTypeName(adType);
+    }
+
+    @Override
+    @PostMapping(value = "/getAdTypeById")
+    public AdType getAdTypeById(@RequestBody Long id) {
+        return this.adTypeServiceInterface.getAdTypeById(id);
+    }
+
+    @Override
+    @PostMapping(value = "/getAdTypeCount")
+    public Integer getAdTypeCount(@RequestBody AdTypeDto adTypeDto) {
+        return this.adTypeServiceInterface.getAdTypeCount(adTypeDto);
+    }
+
+    public AdTypeController(AdTypeServiceInterface adTypeServiceInterface){
+        this.adTypeServiceInterface = adTypeServiceInterface;
+    }
+}

+ 62 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/DeviceAdvertController.java

@@ -0,0 +1,62 @@
+package com.sptg.ad.biz.controller;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.entity.DeviceAdvert;
+import com.sptg.ad.api.entity.DeviceAdvertStatistics;
+import com.sptg.ad.api.feigns.DeviceAdvertFeign;
+import com.sptg.ad.biz.service.DeviceAdvertService;
+import com.sptg.ad.biz.service.DeviceAdvertStatisticsService;
+import com.sptg.common.core.beans.PageBean;
+import com.sptg.common.core.beans.ResultBean;
+import com.sptg.common.core.entity.DispatchTask;
+import com.sptg.device.api.feigns.DeviceFeign;
+import lombok.RequiredArgsConstructor;
+import org.springframework.util.Assert;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *            
+ *               
+ * description:
+ */
+@RestController
+@RequiredArgsConstructor
+public class DeviceAdvertController implements DeviceAdvertFeign {
+
+    private final DeviceAdvertStatisticsService deviceAdvertStatisticsService;
+    private final DeviceAdvertService deviceAdvertService;
+    private final DeviceFeign deviceFeign;
+
+    @Override
+    @PostMapping(value = "/device/advert/statistics/pagingQuery")
+    public Page<DeviceAdvertStatistics> pagingQueryStatistics(@RequestBody PageBean<DeviceAdvertStatistics, DeviceAdvertStatistics> pageBean) {
+        return this.deviceAdvertStatisticsService.pagingQuery(pageBean);
+    }
+
+    @Override
+    @PostMapping(value = "/device/advert/pagingQuery")
+    public Page<DeviceAdvert> pagingQuery(@RequestBody PageBean<DeviceAdvert, DeviceAdvert> pageBean) {
+        return this.deviceAdvertService.pagingQuery(pageBean);
+    }
+
+    @Override
+    @PostMapping(value = "/device/advert/delete")
+    public ResultBean<Boolean> deleteAdvert(@RequestBody DeviceAdvert advert) {
+        DeviceAdvert dbAdvert = this.deviceAdvertService.selectById(advert.getId());
+        Assert.notNull(dbAdvert,"Id不存在");
+        //  判断广告是否已被删除或已结束投放
+        if (dbAdvert.getStatus() == -1 || System.currentTimeMillis() > dbAdvert.getEndTime().getTime()){
+            return ResultBean.ok(true);
+        }
+        //  删除广告
+        dbAdvert.setStatus(-1);
+        boolean result = this.deviceAdvertService.updateById(dbAdvert);
+        if (result){
+            //  下发指令
+            this.deviceFeign.deleteAdvert(new DispatchTask(dbAdvert.getSerialNumber(),dbAdvert));
+        }
+        return ResultBean.ok(result);
+    }
+}

+ 94 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/EarlyWarningController.java

@@ -0,0 +1,94 @@
+package com.sptg.ad.biz.controller;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.entity.DeviceAdvertStatistics;
+import com.sptg.ad.api.entity.EarlyWarning;
+import com.sptg.ad.api.feigns.EarlyWarningFeign;
+import com.sptg.ad.biz.service.DeviceAdvertStatisticsService;
+import com.sptg.ad.biz.service.EarlyWarningService;
+import com.sptg.common.core.beans.PageBean;
+import com.sptg.common.core.beans.ResultBean;
+import lombok.RequiredArgsConstructor;
+import org.springframework.util.Assert;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ *            
+ *                
+ * description:
+ */
+@RestController
+@RequiredArgsConstructor
+public class EarlyWarningController implements EarlyWarningFeign {
+
+    private final EarlyWarningService earlyWarningService;
+    private final DeviceAdvertStatisticsService deviceAdvertStatisticsService;
+
+    @Override
+    @PostMapping(value = "/early_warning/pagingQuery")
+    public Page<EarlyWarning> pagingQuery(@RequestBody PageBean<EarlyWarning, EarlyWarning> pageBean) {
+        return this.earlyWarningService.pagingQuery(pageBean);
+    }
+
+    @Override
+    @PostMapping(value = "/early_warning/add")
+    public ResultBean<Boolean> addEntity(@RequestBody EarlyWarning earlyWarning) {
+        List<DeviceAdvertStatistics> statisticsList = new ArrayList<>();
+        Integer taskType = earlyWarning.getTaskType();
+        //  获取设备信息列表
+        earlyWarning.getDeviceIdList().forEach(deviceId -> {
+            DeviceAdvertStatistics statistics = this.deviceAdvertStatisticsService.selectCurrentMonthAdvertStatistics(deviceId, taskType);
+            statisticsList.add(statistics);
+        });
+        Assert.notEmpty(statisticsList,"设备不存在");
+
+        List<EarlyWarning> warningList = new ArrayList<>();
+        Date now = new Date();
+        //  月预警
+        if (null != earlyWarning.getMonthExpect()){
+            //  获取下个月1号的日期
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(now);
+            calendar.add(Calendar.MONTH, 1);
+            calendar.set(Calendar.DATE, 1);
+            Date endTime = calendar.getTime();
+            //  创建对象
+            statisticsList.forEach(statistics -> {
+                EarlyWarning warning = new EarlyWarning(statistics, 1, taskType, earlyWarning.getMonthExpect(), now, endTime);
+                warningList.add(warning);
+                statistics.setEarlyWarningCount(statistics.getEarlyWarningCount() + 1);
+            });
+        }
+        //  周预警
+        if (null != earlyWarning.getWeekExpect()){
+            //  获取下周一的日期
+            Calendar calendar = Calendar.getInstance();
+            int i = calendar.get(Calendar.DAY_OF_WEEK);
+            calendar.add(Calendar.DATE, i == 1 ? i : 9 - i);
+            Date endTime = calendar.getTime();
+            //  获取当前的第几周
+            int weekNum = calendar.get(Calendar.WEEK_OF_MONTH);
+            //  创建对象
+            statisticsList.forEach(statistics -> {
+                EarlyWarning warning = new EarlyWarning(statistics, 2, taskType, earlyWarning.getWeekExpect(), now, endTime);
+                warning.setWeekNum(weekNum);
+                warningList.add(warning);
+                statistics.setEarlyWarningCount(statistics.getEarlyWarningCount() + 1);
+            });
+        }
+        //  保存预警记录
+        if (this.earlyWarningService.insertBatch(warningList)){
+            //  更新设备信息列表
+            this.deviceAdvertStatisticsService.updateBatchById(statisticsList);
+            return ResultBean.ok(true);
+        }
+        return ResultBean.ok(false);
+    }
+}

+ 77 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/controller/ThresholdConfigController.java

@@ -0,0 +1,77 @@
+package com.sptg.ad.biz.controller;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.entity.ThresholdConfig;
+import com.sptg.ad.api.feigns.ThresholdConfigFeign;
+import com.sptg.ad.biz.service.ThresholdConfigService;
+import com.sptg.common.core.beans.PageBean;
+import com.sptg.common.core.beans.ResultBean;
+import com.sptg.common.core.beans.ResultEnum;
+import lombok.RequiredArgsConstructor;
+import org.springframework.util.Assert;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ *            
+ *               
+ * description:
+ */
+@RestController
+@RequiredArgsConstructor
+public class ThresholdConfigController implements ThresholdConfigFeign {
+
+    private final ThresholdConfigService thresholdConfigService;
+
+
+    @Override
+    @PostMapping(value = "/threshold_config/pageingQuery")
+    public Page<ThresholdConfig> pagingQuery(@RequestBody PageBean<ThresholdConfig, ThresholdConfig> pageBean) {
+        ThresholdConfig dto = pageBean.getDto();
+        Wrapper<ThresholdConfig> wrapper = new EntityWrapper<>();
+        if (null != dto.getOrgId()){
+            wrapper.eq("org_id",dto.getOrgId());
+        }
+        if (null != dto.getType()){
+            wrapper.eq("type",dto.getType());
+        }
+        return this.thresholdConfigService.selectPage(pageBean,wrapper);
+    }
+
+    @Override
+    @PostMapping(value = "/threshold_config/add")
+    public ResultBean addConfig(@RequestBody ThresholdConfig config) {
+        //  判断是否已存在配置
+        ThresholdConfig conf = this.thresholdConfigService.selectByRegionCode(config.getOrgId(), config.getType(), config.getRegionCode());
+        Assert.isNull(conf,"该城市的配置已存在");
+        this.thresholdConfigService.insert(config);
+        return ResultBean.ok();
+    }
+
+    @Override
+    @GetMapping(value = "/threshold_config/get/{id}")
+    public ThresholdConfig getById(@PathVariable(value = "id") Long id) {
+        return this.thresholdConfigService.selectById(id);
+    }
+
+    @Override
+    @PostMapping(value = "/threshold_config/edit")
+    public ResultBean editConfig(@RequestBody ThresholdConfig config) {
+        ThresholdConfig dbConfig = this.thresholdConfigService.selectById(config.getId());
+        Assert.notNull(dbConfig,"Id不存在");
+        dbConfig.setValue(config.getValue());
+        if (this.thresholdConfigService.updateById(dbConfig)){
+            return ResultBean.ok();
+        }
+        return new ResultBean(ResultEnum.ERROR);
+    }
+
+    @Override
+    @GetMapping(value = "/threshold_config/delete/{id}")
+    public ResultBean deleteConfig(@PathVariable(value = "id") Long id) {
+        boolean isDelete = this.thresholdConfigService.deleteById(id);
+        Assert.isTrue(isDelete,"Id不存在");
+        return ResultBean.ok();
+    }
+}

+ 32 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdAdsenseMapper.java

@@ -0,0 +1,32 @@
+package com.sptg.ad.biz.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.pagination.Pagination;
+import com.sptg.ad.api.entity.AdAdsense;
+import org.apache.ibatis.annotations.Param;
+import java.util.List;
+
+public interface AdAdsenseMapper extends BaseMapper<AdAdsense> {
+
+    /**
+     * 功能描述:分页查询广告位
+     * @param  wrapper 查询条件
+     * @param  page 分页条件
+     * @return
+     *
+     *
+     */
+    List<AdAdsense> showAdAdsenseList(@Param(value = "ew") Wrapper<AdAdsense> wrapper, @Param(value = "page") Pagination page);
+
+    /**
+     * 功能描述:修改广告位的状态
+     * @param id
+     * @return
+     *
+     *
+     */
+    boolean updateAdsenseStatus(@Param("id") Long id,@Param("adsenseStatus") String adsenseStatus);
+
+
+}

+ 15 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdContentImgMapper.java

@@ -0,0 +1,15 @@
+package com.sptg.ad.biz.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.sptg.ad.api.entity.AdContentImg;
+
+/**
+ * title: AdContentImgMapper
+ * package: com.sptg.ad.biz.mapper
+ * description: 广告图片-DAO
+ *
+ *               
+ *                 
+ */
+public interface AdContentImgMapper extends BaseMapper<AdContentImg>{
+}

+ 42 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdContentMapper.java

@@ -0,0 +1,42 @@
+package com.sptg.ad.biz.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.pagination.Pagination;
+import com.sptg.ad.api.dto.AdContentDto;
+import com.sptg.ad.api.entity.AdContent;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+/**
+ * title: AdContentMapper
+ * package: com.sptg.ad.biz.mapper
+ * description: 广告内容-DAO接口
+ *
+ *               
+ *                 
+ */
+public interface AdContentMapper extends BaseMapper<AdContent> {
+
+    /**
+     * 功能描述:分页查询广告类容
+     * @param  wrapper 查询条件
+     * @param  page 分页条件
+     * @return
+     *               
+     *                       
+     */
+    List<AdContent> showAdContentList(@Param(value = "ew") Wrapper<AdContent> wrapper, @Param(value = "page")Pagination page);
+
+    /**
+     * 功能描述:更新记录机构位置
+     * @param oldPosition 旧机构位置
+     * @param newPosition 新机构位置
+     *               
+     *                      
+     */
+    @Update("update ad_content set s_org_position=#{newPosition} where s_org_position=#{oldPosition}")
+    int updateOrgPosition(@Param(value = "oldPosition")String oldPosition, @Param(value = "newPosition") String newPosition);
+}

+ 25 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdMaterialMapper.java

@@ -0,0 +1,25 @@
+package com.sptg.ad.biz.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.pagination.Pagination;
+import com.sptg.ad.api.entity.AdAdsense;
+import com.sptg.ad.api.entity.AdMaterial;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface AdMaterialMapper extends BaseMapper<AdMaterial> {
+
+    /**
+     * 功能描述:分页查询广告素材
+     * @param  wrapper 查询条件
+     * @param  page 分页条件
+     * @return
+     *
+     *
+     */
+    List<AdMaterial> showAdMaterialList(@Param(value = "ew") Wrapper<AdMaterial> wrapper, @Param(value = "page") Pagination page);
+
+
+}

+ 35 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdOfflinePushRecordMapper.java

@@ -0,0 +1,35 @@
+package com.sptg.ad.biz.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.pagination.Pagination;
+import com.sptg.ad.api.entity.AdOfflinePushRecord;
+import com.sptg.ad.api.entity.AdPushTask;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+/**
+ * title: AdOfflinePushRecordMapper
+ * package: com.sptg.ad.biz.mapper
+ * description: 广告内容-DAO接口
+ *
+ *
+ *
+ */
+public interface AdOfflinePushRecordMapper extends BaseMapper<AdOfflinePushRecord> {
+
+    /**
+     * 功能描述:分页
+     * @param  wrapper 查询条件
+     * @param  page 分页条件
+     * @return
+     *
+     *
+     */
+    List<AdOfflinePushRecord> showList(@Param(value = "ew") Wrapper<AdOfflinePushRecord> wrapper, @Param(value = "page") Pagination page);
+
+    Integer getAdOfflinePushRecordByYearMonth(@Param("yearMonth") String yearMonth);
+}

+ 15 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdPushAppMapper.java

@@ -0,0 +1,15 @@
+package com.sptg.ad.biz.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.sptg.ad.api.entity.AdPushApp;
+
+/**
+ * title: AdTypeMapper
+ * package: com.sptg.ad.biz.mapper
+ * description: 移动端广告-DAO接口
+ *
+ *               
+ *                 
+ */
+public interface AdPushAppMapper extends BaseMapper<AdPushApp>{
+}

+ 15 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdPushContentImgMapper.java

@@ -0,0 +1,15 @@
+package com.sptg.ad.biz.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.sptg.ad.api.entity.AdPushContentImg;
+
+/**
+ * title: AdContentImgMapper
+ * package: com.sptg.ad.biz.mapper
+ * description: 广告发布图片-DAO
+ *
+ *               
+ *                 
+ */
+public interface AdPushContentImgMapper extends BaseMapper<AdPushContentImg>{
+}

+ 38 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdPushContentMapper.java

@@ -0,0 +1,38 @@
+package com.sptg.ad.biz.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.sptg.ad.api.entity.AdPushContent;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+/**
+ * title: AdPushContentMapper
+ * package: com.sptg.ad.biz.mapper
+ * description: 任务发布类容-DAO
+ *
+ *               
+ *                
+ */
+public interface AdPushContentMapper extends BaseMapper<AdPushContent> {
+    /**
+     * 功能描述:去重查询
+     * @param  wrapper 查询条件
+     * @return
+     *               
+     *                       
+     */
+    List<AdPushContent> getTaskIds(@Param(value = "ew") Wrapper<AdPushContent> wrapper);
+
+    /**
+     * 功能描述:更新记录机构位置
+     * @param oldPosition 旧机构位置
+     * @param newPosition 新机构位置
+     *               
+     *                      
+     */
+    @Update("update ad_push_content set s_org_position=#{newPosition} where s_org_position=#{oldPosition}")
+    int updateOrgPosition(@Param(value = "oldPosition")String oldPosition, @Param(value = "newPosition") String newPosition);
+}

+ 16 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdPushDeviceDetailsMapper.java

@@ -0,0 +1,16 @@
+package com.sptg.ad.biz.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.sptg.ad.api.entity.AdPushDeviceDetails;
+import com.sptg.ad.api.entity.AdPushTaskDetails;
+
+/**
+ * title: AdContentImgMapper
+ * package: com.sptg.ad.biz.mapper
+ * description: 广告发布任务详情-DAO
+ *
+ *               
+ *                 
+ */
+public interface AdPushDeviceDetailsMapper extends BaseMapper<AdPushDeviceDetails>{
+}

+ 15 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdPushTaskDetailsMapper.java

@@ -0,0 +1,15 @@
+package com.sptg.ad.biz.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.sptg.ad.api.entity.AdPushTaskDetails;
+
+/**
+ * title: AdContentImgMapper
+ * package: com.sptg.ad.biz.mapper
+ * description: 广告发布任务详情-DAO
+ *
+ *               
+ *                 
+ */
+public interface AdPushTaskDetailsMapper extends BaseMapper<AdPushTaskDetails>{
+}

+ 54 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdPushTaskMapper.java

@@ -0,0 +1,54 @@
+package com.sptg.ad.biz.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.pagination.Pagination;
+import com.sptg.ad.api.entity.AdPushTask;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+/**
+ * title: AdPushTaskMapper
+ * package: com.sptg.ad.biz.mapper
+ * description: 广告内容-DAO接口
+ *
+ *               
+ *                 
+ */
+public interface AdPushTaskMapper extends BaseMapper<AdPushTask> {
+
+    /**
+     * 功能描述:获取当前设备发布的有效广告数量
+     * @param deviceId 设备id
+     * @return int
+     *                
+     *                     
+     */
+    @Select("select sum(i_content_count) from ad_push_task where t_begin_date<now() and t_end_date>now() " +
+            "and l_id in( select l_task_id from  ad_push_device_details where l_device_id=#{deviceId})")
+    Integer getValidAdPushCountDevice(@Param(value = "deviceId")Long deviceId);
+
+    /**
+     * 功能描述:更新记录机构位置
+     * @param oldPosition 旧机构位置
+     * @param newPosition 新机构位置
+     *               
+     *                      
+     */
+    @Update("update ad_push_task set s_org_position=#{newPosition} where s_org_position=#{oldPosition}")
+    int updateOrgPosition(@Param(value = "oldPosition")String oldPosition, @Param(value = "newPosition") String newPosition);
+
+    /**
+     * 功能描述:分页
+     * @param  wrapper 查询条件
+     * @param  page 分页条件
+     * @return
+     *               
+     *                      
+     */
+    List<AdPushTask> showList(@Param(value = "ew") Wrapper<AdPushTask> wrapper, @Param(value = "page")Pagination page);
+
+}

+ 15 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdPushThresholdValueMapper.java

@@ -0,0 +1,15 @@
+package com.sptg.ad.biz.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.sptg.ad.api.entity.AdPushThresholdValue;
+
+/**
+ * title: AdPushThresholdValueMapper
+ * package: com.sptg.ad.biz.mapper
+ * description: 广告发布阈值-DAO接口
+ *
+ *                
+ *                
+ */
+public interface AdPushThresholdValueMapper extends BaseMapper<AdPushThresholdValue>{
+}

+ 15 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/AdTypeMapper.java

@@ -0,0 +1,15 @@
+package com.sptg.ad.biz.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.sptg.ad.api.entity.AdType;
+
+/**
+ * title: AdTypeMapper
+ * package: com.sptg.ad.biz.mapper
+ * description: 广告类型-DAO接口
+ *
+ *               
+ *                 
+ */
+public interface AdTypeMapper extends BaseMapper<AdType>{
+}

+ 15 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/DeviceAdvertMapper.java

@@ -0,0 +1,15 @@
+package com.sptg.ad.biz.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.sptg.ad.api.entity.DeviceAdvert;
+
+/**
+ *            
+ *                
+ * description: 设备广告DAO
+ */
+public interface DeviceAdvertMapper extends BaseMapper<DeviceAdvert> {
+
+
+
+}

+ 14 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/DeviceAdvertStatisticsMapper.java

@@ -0,0 +1,14 @@
+package com.sptg.ad.biz.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.sptg.ad.api.entity.DeviceAdvertStatistics;
+
+/**
+ *            
+ *               
+ * description: 设备广告统计DAO接口
+ */
+public interface DeviceAdvertStatisticsMapper extends BaseMapper<DeviceAdvertStatistics> {
+
+
+}

+ 15 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/EarlyWarningMapper.java

@@ -0,0 +1,15 @@
+package com.sptg.ad.biz.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.sptg.ad.api.entity.EarlyWarning;
+
+/**
+ *            
+ *                
+ * description:
+ */
+public interface EarlyWarningMapper extends BaseMapper<EarlyWarning> {
+
+
+
+}

+ 13 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/mapper/ThresholdConfigMapper.java

@@ -0,0 +1,13 @@
+package com.sptg.ad.biz.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.sptg.ad.api.entity.ThresholdConfig;
+
+/**
+ *            
+ *               
+ * description:
+ */
+public interface ThresholdConfigMapper extends BaseMapper<ThresholdConfig> {
+
+}

+ 225 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/quartz/AdvertQuartzTask.java

@@ -0,0 +1,225 @@
+package com.sptg.ad.biz.quartz;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.entity.*;
+import com.sptg.ad.api.stream.AdvertTaskCallbackProduceInterface;
+import com.sptg.ad.biz.service.*;
+import com.sptg.common.core.beans.PageBean;
+import com.sptg.common.core.constant.OperationConstant;
+import com.sptg.common.core.entity.PublishTask;
+import com.sptg.common.core.entity.PublishTaskResult;
+import com.sptg.common.core.enums.Instruct;
+import com.sptg.device.api.entity.Device;
+import com.sptg.device.api.feigns.DeviceFeign;
+import com.sptg.device.api.feigns.MsgPublishFeign;
+import com.sptg.permissions.api.dto.RegionAuthorizeDto;
+import com.sptg.permissions.api.entity.RegionAuthorize;
+import com.sptg.permissions.api.feigns.RegionAuthorizeFeign;
+import com.sptg.statistics.api.dto.StatisticsAdPushCountDto;
+import com.sptg.statistics.api.entity.StatisticsAdPushCount;
+import com.sptg.statistics.api.feigns.StatisticsAdPushCountFeign;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.integration.support.MessageBuilder;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ *
+ *
+ * description: 广告定时任务
+ */
+@Slf4j
+@Component
+@AllArgsConstructor
+public class AdvertQuartzTask {
+
+    private final AdPushTaskDetailsServiceInterface adPushTaskDetailsServiceInterface;
+    private final AdPushTaskServiceInterface adPushTaskServiceInterface;
+    private final AdPushContentServiceInterface adPushContentServiceInterface;
+    private final AdPushContentImgServiceInterface adPushContentImgServiceInterface;
+    private final MsgPublishFeign msgPublishFeign;
+    private final DeviceFeign deviceFeign;
+    private final RegionAuthorizeFeign regionAuthorizeFeign;
+    private final RedisTemplate<String,String> redisTemplate;
+    private final StatisticsAdPushCountFeign statisticsAdPushCountFeign;
+    private final ThresholdConfigService thresholdConfigService;
+    private final DeviceAdvertStatisticsService deviceAdvertStatisticsService;
+    private final AdvertTaskCallbackProduceInterface advertTaskCallbackProduceInterface;
+
+    private final static String REDIS_KEY = "advert.quartz";
+
+    @Scheduled(cron = "0/30 * * * * *")
+    public void run(){
+        ValueOperations<String, String> operations = this.redisTemplate.opsForValue();
+        String value = operations.get(REDIS_KEY);
+        //  值存在,则结束定时器
+        if (StringUtils.hasText(value)){
+            return;
+        }else {
+            operations.set(REDIS_KEY,"advert quartz running");
+        }
+        Wrapper<AdPushTask> wrapper = new EntityWrapper<>();
+        //发布状态{ -1:发布失败,0:待发布,1:发布成功,2:已撤销 }
+        wrapper.eq("i_push_status",0);
+        //当天凌晨2:00需要发布的任务
+        wrapper.le("t_estimate_push_date",new Date());
+        //查询满足条件需要发布的任务
+        List<AdPushTask> list = this.adPushTaskServiceInterface.selectList(wrapper);
+
+        list.forEach(task -> {
+            try {
+                //任务体
+                List<AdPushContent> contentList = this.adPushContentServiceInterface.getAdPushContents(task.getId());
+                contentList.forEach(content -> {
+                    //获取广告图片
+                    List<AdPushContentImg> imgList = adPushContentImgServiceInterface.getAdPushContentImgs(content.getId());
+                    content.setAdPushContentImgs(imgList);
+                });
+                task.setAdPushContents(contentList);
+                // 详情
+                List<AdPushTaskDetails> taskDetails = this.adPushTaskDetailsServiceInterface.getAdPushTaskDetails(task.getId());
+                // 获取关联外键Id列表
+                List<Long> fkIdList = taskDetails.stream().map(AdPushTaskDetails::getFkId).collect(Collectors.toList());
+                List<Long> deviceIdList = new ArrayList<>();
+                switch (task.getPushType()) {
+                    //  小区发布
+                    case 1:
+                        this.getDeviceIdByXqs(deviceIdList,fkIdList);
+                        break;
+                    //  单元发布
+                    case 2:
+                        this.getDeviceIdByUnits(deviceIdList,fkIdList);
+                        break;
+                    //  设备发布
+                    case 3:
+                        deviceIdList.addAll(fkIdList);
+                        break;
+                    //  区域发布
+                    case 4:
+                        this.getDeviceIdByRegions(deviceIdList,fkIdList,task.getOrgPosition());
+                        break;
+                    default:
+                        break;
+                }
+                //  更新任务状态
+                task.setPushStatus(OperationConstant.ONE);
+                task.setPushCount((long) deviceIdList.size());
+                //  阈值校验
+                this.fazhiCheck(task,deviceIdList);
+
+                if (deviceIdList.size() > 0) {
+                    //  判断是人脸广告还是闲时广告
+                    Instruct instruct = task.getTaskType() == 1 ? Instruct.add_face_advert_task : Instruct.add_leisure_advert_task;
+                    //  构建任务体,并发布
+                    PublishTask publishTask = new PublishTask(task.getId(), instruct, task, deviceIdList);
+                    //  任务类型:{ 1:广告,2:策略,3:公告 }
+                    publishTask.setTaskType(1);
+                    publishTask.setOrgId(task.getRootOrgId());
+                    Map<String,String> map = new HashMap<>();
+                    this.msgPublishFeign.publishTask(publishTask,map);
+                }
+                StatisticsAdPushCountDto statisticsAdPushCountDto=new StatisticsAdPushCountDto();
+                statisticsAdPushCountDto.setAdPushTaskId(task.getId());
+                //查询是否已经添加记录
+                StatisticsAdPushCount statisticsAdPushCount = this.statisticsAdPushCountFeign.getStatisticsAdPushCountByTaskId(statisticsAdPushCountDto);
+                if(statisticsAdPushCount==null){
+                    statisticsAdPushCountDto.setCount(task.getContentCount());
+                    //推送状态
+                    statisticsAdPushCountDto.setPushState(OperationConstant.ZERO);
+                    statisticsAdPushCountDto.setCreateDate(new Date());
+                    statisticsAdPushCountDto.setRootOrgId(task.getRootOrgId());
+                    statisticsAdPushCountDto.setOrgPosition(task.getOrgPosition());
+                    this.statisticsAdPushCountFeign.addAdPushCount(statisticsAdPushCountDto);
+                }
+            }catch (Exception e){
+                log.error(e.getMessage(),e);
+            }finally {
+                this.adPushTaskServiceInterface.updateAdPushTask(task);
+            }
+        });
+        //  定时器运行完后删除Key
+        this.redisTemplate.delete(REDIS_KEY);
+    }
+
+    private void fazhiCheck(AdPushTask task,List<Long> deviceIdList){
+        //  判断是否启用阈值配置
+        boolean isEnableFaZhi = null == task.getEnableThreshold() || 1 == task.getEnableThreshold();
+        //  校验阈值
+        if (isEnableFaZhi){
+            List<Device> deviceList = this.deviceFeign.getListByIds(deviceIdList);
+            Map<String, List<Device>> map = deviceList.stream().collect(Collectors.groupingBy(Device::getRegionCity));
+            map.forEach((city,values) -> {
+                //   获取市阈值
+                ThresholdConfig config = this.thresholdConfigService.selectByRegionCode(task.getRootOrgId(), task.getTaskType(), city);
+                if (null == config){
+                    //  获取省阈值
+                    config = this.thresholdConfigService.selectByRegionCode(task.getRootOrgId(), task.getTaskType(), values.get(0).getRegionProvince());
+                }
+                if (null != config){
+                    for (Device device : values){
+                        //  获取设备的广告数量
+                        DeviceAdvertStatistics statistics = this.deviceAdvertStatisticsService.selectCurrentMonthAdvertStatistics(device.getId(), task.getTaskType());
+                        if (statistics.getAdCount() > config.getValue()){
+                            PublishTaskResult taskResult = new PublishTaskResult();
+                            taskResult.setTaskId(task.getId());
+                            taskResult.setDeviceId(device.getId());
+                            taskResult.setDeviceName(device.getName());
+                            taskResult.setSerialNumber(device.getSerialNumber());
+                            taskResult.setInstallPath(device.getInstallPath());
+                            taskResult.setXqName(device.getXqName());
+                            taskResult.setDyName(device.getDyName());
+                            taskResult.setPushStatus(2);
+                            taskResult.setRemark("超出阈值");
+                            this.advertTaskCallbackProduceInterface.output().send(MessageBuilder.withPayload(taskResult).build());
+                            //  移除超过阈值的设备
+                            deviceIdList.remove(device.getId());
+                        }
+                    }
+                }
+            });
+        }
+    }
+
+    private void getDeviceIdByRegions(List<Long> deviceIdList,List<Long> fkIdList,String position){
+        PageBean<RegionAuthorize, RegionAuthorizeDto> pageBean = new PageBean<>(1,100);
+        RegionAuthorizeDto dto = new RegionAuthorizeDto();
+        dto.setUserOrgPosition(position);
+        dto.setAreaIdList(fkIdList);
+        pageBean.setDto(dto);
+        List<Long> xqIdList = new ArrayList<>();
+        int pageNo = 0;
+        while (true){
+            ++ pageNo;
+            pageBean.setCurrent(pageNo);
+            //  得到授权小区列表
+            Page<RegionAuthorize> page = this.regionAuthorizeFeign.pagingQuery(pageBean);
+            if (page.getRecords().size() == 0){
+                break;
+            }
+            page.getRecords().forEach(authorize -> xqIdList.add(authorize.getXqId()));
+        }
+        this.getDeviceIdByXqs(deviceIdList,xqIdList);
+    }
+
+    private void getDeviceIdByXqs(List<Long> deviceIdList,List<Long> fkIdList){
+        fkIdList.forEach(xqId -> {
+            List<Device> deviceList = this.deviceFeign.getListByXqId(xqId);
+            deviceList.forEach(device -> deviceIdList.add(device.getId()));
+        });
+    }
+
+    private void getDeviceIdByUnits(List<Long> deviceIdList,List<Long> fkIdList){
+        List<Device> deviceList = this.deviceFeign.getListByUnitIds(fkIdList);
+        deviceList.forEach(device -> deviceIdList.add(device.getId()));
+    }
+
+}

+ 207 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/quartz/DeviceAdvertStatisticsQuartzTask.java

@@ -0,0 +1,207 @@
+package com.sptg.ad.biz.quartz;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.entity.DeviceAdvertStatistics;
+import com.sptg.ad.biz.service.DeviceAdvertService;
+import com.sptg.ad.biz.service.DeviceAdvertStatisticsService;
+import com.sptg.common.core.beans.PageBean;
+import com.sptg.common.core.constant.OperationConstant;
+import com.sptg.common.core.interfaces.VoidInterface;
+import com.sptg.common.core.util.DateUtil;
+import com.sptg.statistics.api.dto.StatisticsAdPlayFreeTimeDto;
+import com.sptg.statistics.api.dto.StatisticsAdWatchDto;
+import com.sptg.statistics.api.feigns.StatisticsAdWatchFeign;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ *            
+ *               
+ * description: 设备广告定时任务
+ */
+@Slf4j
+@Component
+@AllArgsConstructor
+public class DeviceAdvertStatisticsQuartzTask {
+
+    private final DeviceAdvertStatisticsService deviceAdvertStatisticsService;
+    private final DeviceAdvertService deviceAdvertService;
+    private final StatisticsAdWatchFeign statisticsAdWatchFeign;
+
+    /**
+     * 每月1号0时执行
+     * 将上个月的统计记录复制到当月
+     */
+    @Scheduled(cron = "0 0 0 * * ?")
+    public void monthly(){
+        this.pagingQuery(statistics ->
+                this.deviceAdvertStatisticsService.selectCurrentMonthAdvertStatistics(statistics.getDeviceId(),statistics.getTaskType()));
+    }
+
+    /**
+     * 每天1时执行一次
+     * 同步设备当前广告和预警的数量
+     */
+    @Scheduled(cron = "0 0 1 * * ?")
+    public void onceDay(){
+        this.pagingQuery2(statistics -> {
+            //  获取设备的广告数量
+            int advertCount = this.deviceAdvertService.selectDeviceAdvertCount(statistics.getDeviceSerialNumber(), statistics.getTaskType());
+            statistics.setAdCount(advertCount);
+            //  TODO 统计浏览量
+            Integer taskType = statistics.getTaskType();
+            Calendar calendar= Calendar.getInstance();
+            calendar.setTime(new Date());
+            if(null!=taskType&&taskType== OperationConstant.ONE){//人脸广告
+                StatisticsAdWatchDto dto=new StatisticsAdWatchDto();
+                dto.setSerialNumber(statistics.getDeviceSerialNumber());
+                calendar.add(Calendar.MONTH,-1);
+                dto.setSelectMonth(calendar.getTime());
+                //上一个月观看次数
+               Long lastMonthCount=statisticsAdWatchFeign.getAdWatchCount(dto);
+               statistics.setLastMonthBrowse(lastMonthCount.intValue());
+               //当前月
+                calendar.add(Calendar.MONTH,1);
+                dto.setSelectMonth(calendar.getTime());
+                //获取当前时间是当月第几周
+                calendar.setFirstDayOfWeek(Calendar.MONDAY);
+                int currentWeek = calendar.get(Calendar.WEEK_OF_MONTH);
+                if(currentWeek!=5){//没有第五周
+                    for(int i = 1; currentWeek + i < 5; i++){
+                        //获取当前周于其他周相差值
+                        int preWeek = currentWeek - i;
+                        //获取第几周统计次数
+                        int yearWeek = DateUtil.getYearWeek(calendar.getTime(), Calendar.MONTH) - i;
+                        dto.setYearWeek(yearWeek);
+                        Long count=statisticsAdWatchFeign.getAdWatchCount(dto);
+                        //获取当周数据
+                        this.setWeekBrowse(statistics,preWeek, i,count.intValue());
+                   }
+                }
+                StatisticsAdWatchDto dto1=new StatisticsAdWatchDto();
+                dto1.setSerialNumber(statistics.getDeviceSerialNumber());
+                Long countAll = this.statisticsAdWatchFeign.getAdWatchCount(dto1);
+                statistics.setBrowseCount(countAll);
+            }else if(null!=taskType&&taskType==OperationConstant.TWO){//闲时广告
+                StatisticsAdPlayFreeTimeDto dto=new StatisticsAdPlayFreeTimeDto();
+                //设备
+                dto.setSerialNumber(statistics.getDeviceSerialNumber());
+                calendar.add(Calendar.MONTH,-1);
+                dto.setSelectMonth(calendar.getTime());
+                //上一个月播放次数
+                Long lastMonthCount=statisticsAdWatchFeign.getAdPlayCount(dto);
+                statistics.setLastMonthBrowse(lastMonthCount.intValue());
+                //当前月
+                calendar.add(Calendar.MONTH,1);
+                dto.setSelectMonth(calendar.getTime());
+                //获取当前时间是当月第几周
+                calendar.setFirstDayOfWeek(Calendar.MONDAY);
+                int currentWeek = calendar.get(Calendar.WEEK_OF_MONTH);
+                if(currentWeek!=5){//没有第五周
+                    for(int i = 1; currentWeek + i < 5; i++){
+                        //获取当前周于其他周相差值
+                        int preWeek = currentWeek - i;
+                        //获取第几周统计次数
+                        int yearWeek = DateUtil.getYearWeek(calendar.getTime(), Calendar.MONTH) - i;
+                        dto.setYearWeek(yearWeek);
+                        Long count=statisticsAdWatchFeign.getAdPlayCount(dto);
+                        //获取当周数据
+                        this.setWeekBrowse(statistics, preWeek, i, count.intValue());
+                    }
+                }
+                StatisticsAdPlayFreeTimeDto dto2 = new StatisticsAdPlayFreeTimeDto();
+                dto2.setSerialNumber(statistics.getDeviceSerialNumber());
+                Long countAll = this.statisticsAdWatchFeign.getAdPlayCount(dto2);
+                statistics.setBrowseCount(countAll);
+            }
+
+            this.deviceAdvertStatisticsService.updateById(statistics);
+        });
+    }
+
+    private void pagingQuery(VoidInterface<DeviceAdvertStatistics> voidInterface){
+        //  分页查询上个月的设备统计记录
+        DeviceAdvertStatistics dto = new DeviceAdvertStatistics();
+        dto.setCreateTime(LocalDate.now().minusMonths(1).format(DateTimeFormatter.ofPattern("yyyyMM")));
+        PageBean<DeviceAdvertStatistics, DeviceAdvertStatistics> pageBean = new PageBean<>(dto);
+        pageBean.setSize(100);
+        int pageNo = 0;
+        while (true){
+            ++ pageNo;
+            pageBean.setCurrent(pageNo);
+            Page<DeviceAdvertStatistics> page = this.deviceAdvertStatisticsService.pagingQuery(pageBean);
+            if (page.getRecords().size() == 0){
+                break;
+            }
+            page.getRecords().forEach(voidInterface::run);
+        }
+    }
+
+    private void pagingQuery2(VoidInterface<DeviceAdvertStatistics> voidInterface){
+        DeviceAdvertStatistics dto = new DeviceAdvertStatistics();
+        PageBean<DeviceAdvertStatistics, DeviceAdvertStatistics> pageBean = new PageBean<>(dto);
+        pageBean.setSize(100);
+        int pageNo = 0;
+        while (true){
+            ++ pageNo;
+            pageBean.setCurrent(pageNo);
+            Page<DeviceAdvertStatistics> page = this.deviceAdvertStatisticsService.pagingQuery(pageBean);
+            if (page.getRecords().size() == 0){
+                break;
+            }
+            page.getRecords().forEach(voidInterface::run);
+        }
+    }
+    /**
+     * 功能描述:获取当月第几周统计数据
+     * @param statistics 统计实体
+     * @param week 当前第几周
+     * @param temp 统计周与当前周差值
+     * @param count 数据值
+     * @return void
+     *                
+     *                      
+     */
+    private void setWeekBrowse(DeviceAdvertStatistics statistics, int week, int temp, int count){
+        switch (week){
+            case 1:
+                //第一周
+                Integer week1Browse=statistics.getWeek1Browse();
+                if(temp!=0&&(null==week1Browse||week1Browse==0)){
+                    //不是当前周,且这周数据为空或者0的话,就可以更新
+                    statistics.setWeek1Browse(count);
+                }
+                break;
+            case 2:
+                //第二周
+                Integer week2Browse=statistics.getWeek2Browse();
+                if(temp!=0&&(null==week2Browse||week2Browse==0)){
+                    statistics.setWeek2Browse(count);
+                }
+                break;
+            case 3:
+                //第三周
+                Integer week3Browse=statistics.getWeek3Browse();
+                if(temp!=0&&(null==week3Browse||week3Browse==0)){
+                    statistics.setWeek3Browse(count);
+                }
+                break;
+            case 4:
+                //第四周
+                Integer week4Browse=statistics.getWeek4Browse();
+                if(temp!=0&&(null==week4Browse||week4Browse==0)){
+                    statistics.setWeek4Browse(count);
+                }
+                break;
+            default:
+                break;
+        }
+    }
+}

+ 153 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/quartz/EarlyWarningQuartzTask.java

@@ -0,0 +1,153 @@
+package com.sptg.ad.biz.quartz;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.sptg.ad.api.entity.DeviceAdvertStatistics;
+import com.sptg.ad.api.entity.EarlyWarning;
+import com.sptg.ad.biz.service.DeviceAdvertStatisticsService;
+import com.sptg.ad.biz.service.EarlyWarningService;
+import com.sptg.common.core.interfaces.VoidInterface;
+import com.sptg.common.core.util.DateUtil;
+import com.sptg.statistics.api.dto.StatisticsAdPlayFreeTimeDto;
+import com.sptg.statistics.api.dto.StatisticsAdWatchDto;
+import com.sptg.statistics.api.feigns.StatisticsAdWatchFeign;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ *            
+ *                
+ * description: 设备广告预警定时任务
+ */
+@Slf4j
+@Component
+@AllArgsConstructor
+public class EarlyWarningQuartzTask {
+
+    private final RedisTemplate<String,String> redisTemplate;
+    private final EarlyWarningService earlyWarningService;
+    private final DeviceAdvertStatisticsService deviceAdvertStatisticsService;
+    private final StatisticsAdWatchFeign statisticsAdWatchFeign;
+
+    /**
+     * 人脸广告预警
+     * 每天1点时运行一次
+     */
+    @Scheduled(cron = "0 0 1 * * ?")
+    public void faceAdvertEarlyWarning(){
+        this.compute(1,(earlyWarning) -> {
+            //  TODO 给 value 字段赋值即可
+            long value = 0L;
+            StatisticsAdWatchDto dto=new StatisticsAdWatchDto();
+            //设备
+            dto.setSerialNumber(earlyWarning.getSerialNumber());
+            Calendar calendar= Calendar.getInstance();
+            calendar.setTime(new Date());
+            if (earlyWarning.getType() == 1){
+                //  月预警-人脸广告
+                //  value = 1000L;
+                calendar.add(Calendar.MONTH,-1);
+                //上一个月
+                dto.setSelectMonth(calendar.getTime());
+                value=statisticsAdWatchFeign.getAdWatchCount(dto);
+            } else {
+                //  周预警-人脸广告
+                //  value = 1000L;
+                //上一周
+                int yearWeek = DateUtil.getYearWeek(new Date(), Calendar.MONTH)-1;
+                dto.setYearWeek(yearWeek);
+                value=statisticsAdWatchFeign.getAdWatchCount(dto);
+            }
+            earlyWarning.setValue(value);
+        });
+    }
+
+    /**
+     * 闲时广告预警
+     * 每天1点时运行一次
+     */
+    @Scheduled(cron = "0 0 1 * * ?")
+    public void leisureAdvertEarlyWarning(){
+        this.compute(2,(earlyWarning) -> {
+            //  TODO 给 value 字段赋值即可
+            long value = 0L;
+            StatisticsAdPlayFreeTimeDto dto=new StatisticsAdPlayFreeTimeDto();
+            //设备
+            dto.setSerialNumber(earlyWarning.getSerialNumber());
+            Calendar calendar= Calendar.getInstance();
+            calendar.setTime(new Date());
+            if (earlyWarning.getType() == 1){
+                //  月预警-闲时广告
+                //  value = 1000L;
+                calendar.add(Calendar.MONTH,-1);
+                //上一个月
+                dto.setSelectMonth(calendar.getTime());
+                value=statisticsAdWatchFeign.getAdPlayCount(dto);
+            } else {
+                //  周预警-闲时广告
+                //  value = 1000L;
+                //上一周
+                int yearWeek = DateUtil.getYearWeek(new Date(), Calendar.MONTH)-1;
+                dto.setYearWeek(yearWeek);
+                value=statisticsAdWatchFeign.getAdPlayCount(dto);
+            }
+            earlyWarning.setValue(value);
+        });
+    }
+
+    private final static String REDIS_KEY = "advert.early_warning.";
+
+    private void compute(Integer taskType, VoidInterface<EarlyWarning> voidInterface){
+        ValueOperations<String, String> operations = this.redisTemplate.opsForValue();
+        //  防止集群时定时器被运行多次
+        String key  = REDIS_KEY + taskType;
+        String result = operations.get(key);
+        if (StringUtils.hasText(result)){
+            return;
+        }
+        operations.set(key,"early_warning quartz runing");
+        //  查询当天结束的预警记录列表
+        Wrapper<EarlyWarning> wrapper = new EntityWrapper<>();
+        wrapper.eq("task_type",taskType);
+        wrapper.eq("end_flag",0);
+        String now = LocalDate.now().minusMonths(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        wrapper.and("( DATE_FORMAT( end_time,'%Y-%m-%d') <= {0} )",now);
+        List<EarlyWarning> list = this.earlyWarningService.selectList(wrapper);
+        if (list.size() > 0) {
+            //  需要修改的设备统计记录
+            List<DeviceAdvertStatistics> statisticsList = new ArrayList<>(list.size());
+            //  统计预警值
+            list.forEach(warning -> {
+                voidInterface.run(warning);
+                //  标记为结束状态
+                warning.setEndFlag(1);
+                //  获取修改设备统计
+                DeviceAdvertStatistics statistics = this.deviceAdvertStatisticsService
+                        .selectCurrentMonthAdvertStatistics(warning.getDeviceId(), taskType);
+                statistics.setEarlyWarningCount(statistics.getEarlyWarningCount() - 1);
+                statisticsList.add(statistics);
+            });
+            //  批量更新预警记录
+            if (this.earlyWarningService.updateBatchById(list) && statisticsList.size() > 0) {
+                //  批量更新需要修改的设备统计记录
+                this.deviceAdvertStatisticsService.updateBatchById(statisticsList);
+            }
+        }
+        //  删除缓存
+        this.redisTemplate.delete(key);
+    }
+
+
+}

+ 111 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/receiver/AdvertTaskCallbackReceiver.java

@@ -0,0 +1,111 @@
+package com.sptg.ad.biz.receiver;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.sptg.ad.api.entity.*;
+import com.sptg.ad.biz.service.*;
+import com.sptg.ad.biz.stream.AdvertTaskCallbackReceiverInterface;
+import com.sptg.common.core.entity.PublishTaskResult;
+import com.sptg.permissions.api.entity.Organization;
+import com.sptg.permissions.api.feigns.OrgFeign;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+import org.springframework.cloud.stream.annotation.StreamListener;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ *            
+ *                
+ * description: 广告任务回调消费者
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+@EnableBinding(value = { AdvertTaskCallbackReceiverInterface.class})
+public class AdvertTaskCallbackReceiver {
+
+    private final AdPushDeviceDetailsServiceInterface adPushDeviceDetailsServiceInterface;
+    private final AdPushTaskServiceInterface adPushTaskServiceInterface;
+    private final AdPushContentServiceInterface adPushContentServiceInterface;
+    private final DeviceAdvertService deviceAdvertService;
+    private final OrgFeign orgFeign;
+    private final DeviceAdvertStatisticsService deviceAdvertStatisticsService;
+
+    @Transactional(rollbackFor = Throwable.class)
+    @StreamListener(value = AdvertTaskCallbackReceiverInterface.INPUT)
+    public void input(PublishTaskResult taskResult){
+        //  更新或保存广告任务与设备的关联记录
+        boolean isInsert = this.insertOrUpdateDeviceDetails(taskResult);
+
+        if (isInsert){
+            //  获取任务的广告信息
+            AdPushTask task = this.adPushTaskServiceInterface.selectById(taskResult.getTaskId());
+            List<AdPushContent> contentList = this.adPushContentServiceInterface.getAdPushContents(task.getId());
+            List<DeviceAdvert> advertList = new ArrayList<>(contentList.size());
+            Organization org = this.orgFeign.getOrgById(task.getOrgId());
+            Date now = new Date();
+            contentList.forEach(content -> {
+                DeviceAdvert advert = new DeviceAdvert();
+                advert.setTaskId(task.getId());
+                advert.setTaskType(task.getTaskType());
+                advert.setAdCode(content.getAdCode());
+                advert.setAdName(content.getAdTitle());
+                advert.setAdType(content.getAdTypeName());
+                advert.setOrgName(org.getName());
+                advert.setOrgPosition(task.getOrgPosition());
+                advert.setCreateName(task.getCreateAccountName());
+                advert.setCreateTime(now);
+                advert.setBeginTime(task.getBeginDate());
+                advert.setEndTime(task.getEndDate());
+                advert.setStatus(0);
+                advert.setMonthPlayVolume(0L);
+                advert.setTotalPlayVolume(0L);
+                advert.setSerialNumber(taskResult.getSerialNumber());
+                advertList.add(advert);
+            });
+            //  保存广告与设备的关联记录
+            this.deviceAdvertService.insertBatch(advertList);
+            //  更新设备广告统计表
+            DeviceAdvertStatistics statistics = this.deviceAdvertStatisticsService.selectCurrentMonthAdvertStatistics(taskResult.getDeviceId(), task.getTaskType());
+            statistics.setPublishCount(statistics.getPublishCount() + contentList.size());
+            statistics.setAdCount(statistics.getAdCount() + contentList.size());
+            statistics.setDeviceSerialNumber(taskResult.getSerialNumber());
+            this.deviceAdvertStatisticsService.updateById(statistics);
+        }
+    }
+
+    private boolean insertOrUpdateDeviceDetails(PublishTaskResult taskResult){
+        boolean result = true;
+        //  获取广告任务与设备的关联
+        Wrapper<AdPushDeviceDetails> wrapper = new EntityWrapper<>();
+        wrapper.eq("l_task_id", taskResult.getTaskId());
+        wrapper.eq("l_device_id",taskResult.getDeviceId());
+        AdPushDeviceDetails deviceDetails = this.adPushDeviceDetailsServiceInterface.selectOne(wrapper);
+        if (null == deviceDetails){
+            deviceDetails = new AdPushDeviceDetails();
+        }else {
+            //  3表示正在向设备推送
+            int inRelease = 3;
+            //  推送成功,并且是第一次推送成功
+            result = taskResult.getPushStatus() == inRelease && !deviceDetails.getPushStatus().equals(taskResult.getPushStatus());
+        }
+        deviceDetails.setTaskId(taskResult.getTaskId());
+        deviceDetails.setDeviceId(taskResult.getDeviceId());
+        deviceDetails.setDeviceName(taskResult.getDeviceName());
+        deviceDetails.setSerialNumber(taskResult.getSerialNumber());
+        deviceDetails.setInstallPath(taskResult.getInstallPath());
+        deviceDetails.setXqName(taskResult.getXqName());
+        deviceDetails.setDyName(taskResult.getDyName());
+        deviceDetails.setPushStatus(taskResult.getPushStatus());
+        deviceDetails.setRemark(taskResult.getRemark());
+        //  更新或保存记录
+        this.adPushDeviceDetailsServiceInterface.insertOrUpdate(deviceDetails);
+        return result;
+    }
+}

+ 65 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/receiver/DeviceAddReceiver.java

@@ -0,0 +1,65 @@
+package com.sptg.ad.biz.receiver;
+
+import com.sptg.ad.api.entity.DeviceAdvertStatistics;
+import com.sptg.ad.biz.service.DeviceAdvertStatisticsService;
+import com.sptg.device.api.dto.DeviceDto;
+import com.sptg.device.api.stream.DeviceAddReceiverInterface;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+import org.springframework.cloud.stream.annotation.StreamListener;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ *            
+ *               
+ * description:
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+@EnableBinding(value = { DeviceAddReceiverInterface.class})
+public class DeviceAddReceiver {
+
+    private final DeviceAdvertStatisticsService deviceAdvertStatisticsService;
+
+    @StreamListener(value = DeviceAddReceiverInterface.INPUT)
+    public void input(DeviceDto dto){
+        String month = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMM"));
+        List<DeviceAdvertStatistics> statisticsList = new ArrayList<>(2);
+        Arrays.asList(new Integer[]{ 1,2 })
+                .forEach(taskType -> {
+                    DeviceAdvertStatistics statistics = new DeviceAdvertStatistics();
+                    statistics.setTaskType(taskType);
+                    statistics.setPublishCount(0L);
+                    statistics.setAdCount(0);
+                    statistics.setBrowseCount(0L);
+                    statistics.setLastMonthBrowse(0);
+                    statistics.setThisMonthBrowse(0);
+                    statistics.setWeek1Browse(0);
+                    statistics.setWeek2Browse(0);
+                    statistics.setWeek3Browse(0);
+                    statistics.setWeek4Browse(0);
+                    statistics.setXqId(dto.getXqId());
+                    statistics.setEarlyWarningCount(0);
+                    statistics.setOrgPosition(dto.getOrgPosition());
+                    statistics.setDeviceId(dto.getId());
+                    statistics.setDeviceName(dto.getName());
+                    statistics.setDeviceSerialNumber(dto.getSerialNumber());
+                    statistics.setDeviceInstallPath(dto.getInstallPath());
+                    statistics.setRegionProvince(dto.getRegionProvince());
+                    statistics.setRegionCity(dto.getRegionCity());
+                    statistics.setRegionArea(dto.getRegionArea());
+                    statistics.setCreateTime(month);
+                    statisticsList.add(statistics);
+                });
+        this.deviceAdvertStatisticsService.insertBatch(statisticsList);
+    }
+
+}

+ 55 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/receiver/OrgDeleteReceiver.java

@@ -0,0 +1,55 @@
+package com.sptg.ad.biz.receiver;
+
+import com.baomidou.mybatisplus.enums.SqlLike;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.sptg.ad.api.entity.AdContent;
+import com.sptg.ad.api.entity.AdPushContent;
+import com.sptg.ad.api.entity.AdPushTask;
+import com.sptg.ad.biz.service.AdContentServiceInterface;
+import com.sptg.ad.biz.service.AdPushContentServiceInterface;
+import com.sptg.ad.biz.service.AdPushTaskServiceInterface;
+import com.sptg.permissions.api.entity.Organization;
+import com.sptg.permissions.api.stream.OrgDeleteReceiverInterface;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+import org.springframework.cloud.stream.annotation.StreamListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * title: OrgDeleteConsume
+ * description: 机构删除消费者
+ *
+ *                  
+ *            
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+@EnableBinding(value = { OrgDeleteReceiverInterface.class})
+public class OrgDeleteReceiver {
+
+    private final AdContentServiceInterface adContentServiceInterface;
+    private final AdPushContentServiceInterface adPushContentServiceInterface;
+    private final AdPushTaskServiceInterface adPushTaskServiceInterface;
+
+    @StreamListener(value = OrgDeleteReceiverInterface.INPUT)
+    public void input(Organization org){
+        //删除广告
+        Wrapper<AdContent> adContentWrapper=new EntityWrapper<>();
+        adContentWrapper.like("s_org_position",org.getPosition(), SqlLike.RIGHT);
+        this.adContentServiceInterface.delete(adContentWrapper);
+
+        //删除发布广告
+        Wrapper<AdPushContent> adPushContentWrapper=new EntityWrapper<>();
+        adPushContentWrapper.like("s_org_position",org.getPosition(), SqlLike.RIGHT);
+        this.adPushContentServiceInterface.delete(adPushContentWrapper);
+
+        //删除发布的任务
+        Wrapper<AdPushTask> adPushTaskWrapper=new EntityWrapper<>();
+        adPushTaskWrapper.like("s_org_position",org.getPosition(), SqlLike.RIGHT);
+        this.adPushTaskServiceInterface.delete(adPushTaskWrapper);
+    }
+
+}

+ 34 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/receiver/OrgModifyNameReceiver.java

@@ -0,0 +1,34 @@
+package com.sptg.ad.biz.receiver;
+
+import com.sptg.permissions.api.dto.OrgDto;
+import com.sptg.permissions.api.stream.OrgModifyNameReceiverInterface;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+import org.springframework.cloud.stream.annotation.StreamListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * title: OrgModifyNameReceiver
+ * description: 机构名称修改消费者
+ *
+ *                  
+ *            
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+@EnableBinding(value = { OrgModifyNameReceiverInterface.class})
+public class OrgModifyNameReceiver {
+
+    @StreamListener(value = OrgModifyNameReceiverInterface.INPUT)
+    public void input(OrgDto dto){
+        //  机构Id
+        Long orgId = dto.getId();
+        //  机构新名称
+        String orgName = dto.getName();
+
+
+    }
+
+}

+ 50 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/receiver/OrgTransferReceiver.java

@@ -0,0 +1,50 @@
+package com.sptg.ad.biz.receiver;
+
+import com.sptg.ad.api.entity.AdType;
+import com.sptg.ad.biz.service.AdContentServiceInterface;
+import com.sptg.ad.biz.service.AdPushContentServiceInterface;
+import com.sptg.ad.biz.service.AdPushTaskServiceInterface;
+import com.sptg.ad.biz.service.AdTypeServiceInterface;
+import com.sptg.permissions.api.dto.OrgDto;
+import com.sptg.permissions.api.stream.OrgTransferReceiverInterface;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+import org.springframework.cloud.stream.annotation.StreamListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * title: OrgTransferReceiver
+ * description:
+ *
+ *                  
+ *            
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+@EnableBinding(value = { OrgTransferReceiverInterface.class})
+public class OrgTransferReceiver {
+
+    private final AdContentServiceInterface adContentServiceInterface;
+    private final AdPushContentServiceInterface adPushContentServiceInterface;
+    private final AdPushTaskServiceInterface adPushTaskServiceInterface;
+
+    @StreamListener(value = OrgTransferReceiverInterface.INPUT)
+    public void input(OrgDto dto){
+        if (null == dto){
+            return;
+        }
+        //  旧的机构位置
+        String oldPosition = dto.getOrgPosition();
+        //  新的机构位置
+        String newPosition = dto.getPosition();
+
+        //更新机构位置
+        this.adContentServiceInterface.updateOrgPosition(oldPosition,newPosition);
+        this.adPushContentServiceInterface.updateOrgPosition(oldPosition,newPosition);
+        this.adPushTaskServiceInterface.updateOrgPosition(oldPosition,newPosition);
+    }
+
+}
+

+ 204 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/receiver/SyncFaceAdvertDataDeviceReceiver.java

@@ -0,0 +1,204 @@
+package com.sptg.ad.biz.receiver;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.entity.AdPushContent;
+import com.sptg.ad.api.entity.AdPushContentImg;
+import com.sptg.ad.api.entity.AdPushTask;
+import com.sptg.ad.api.entity.AdPushTaskDetails;
+import com.sptg.ad.biz.service.AdPushContentImgServiceInterface;
+import com.sptg.ad.biz.service.AdPushContentServiceInterface;
+import com.sptg.ad.biz.service.AdPushTaskDetailsServiceInterface;
+import com.sptg.ad.biz.service.AdPushTaskServiceInterface;
+import com.sptg.ad.biz.stream.SyncFaceAdvertDataDeviceReceiverInterface;
+import com.sptg.common.core.beans.PageBean;
+import com.sptg.common.core.constant.OperationConstant;
+import com.sptg.common.core.entity.PublishTask;
+import com.sptg.common.core.enums.Instruct;
+import com.sptg.device.api.entity.Device;
+import com.sptg.device.api.feigns.DeviceFeign;
+import com.sptg.device.api.feigns.MsgPublishFeign;
+import com.sptg.permissions.api.dto.RegionAuthorizeDto;
+import com.sptg.permissions.api.entity.RegionAuthorize;
+import com.sptg.permissions.api.feigns.DeviceAuthorizeFeign;
+import com.sptg.permissions.api.feigns.RegionAuthorizeFeign;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+import org.springframework.cloud.stream.annotation.StreamListener;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * title: SyncAdDataDeviceReceiver
+ * description:
+ *
+ *
+ *
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+@SuppressWarnings({"all"})
+@EnableBinding(value = { SyncFaceAdvertDataDeviceReceiverInterface.class})
+public class SyncFaceAdvertDataDeviceReceiver {
+
+    private final DeviceFeign deviceFeign;
+    private final DeviceAuthorizeFeign deviceAuthorizeFeign;
+    private final AdPushTaskServiceInterface adPushTaskServiceInterface;
+    private final AdPushContentServiceInterface adPushContentServiceInterface;
+    private final AdPushContentImgServiceInterface adPushContentImgServiceInterface;
+    private final AdPushTaskDetailsServiceInterface adPushTaskDetailsServiceInterface;
+    private final RegionAuthorizeFeign regionAuthorizeFeign;
+    private final MsgPublishFeign msgPublishFeign;
+
+    @StreamListener(value = SyncFaceAdvertDataDeviceReceiverInterface.INPUT)
+    public void input(String serialNumber){
+        if (null == serialNumber){
+            return;
+        }
+        //  获取设备授权的机构列表
+        List<String> orgPositionList = this.deviceAuthorizeFeign.getDeviceAuthorizeOrgList(serialNumber);
+        if (null == orgPositionList || orgPositionList.size() <= 0){
+            return;
+        }
+        //  获取设备信息
+        Device device = this.deviceFeign.getEntityBySerialNumber(serialNumber);
+        if (null  == device){
+            return;
+        }
+        //  分页获取广告任务列表
+        int pageNum = 1;
+        int pageSize = 100;
+        Page<AdPushTask> page = new Page<>();
+        page.setSize(pageSize);
+        /*
+            构建查询条件:
+                1.查询授权机构下发的所有广告记录
+                2.过滤已过期数据
+                3.只查询发布成功的数据
+                4.过滤针对单台设备发布的数据
+                5.只查询人脸广告
+         */
+        Wrapper<AdPushTask> wrapper = new EntityWrapper<>();
+//        wrapper.in("s_org_position",orgPositionList);
+        wrapper.gt("t_end_date",new Date());
+        wrapper.eq("i_push_status",1);
+        wrapper.notIn("i_push_type",3);
+        wrapper.eq("i_task_type",1);
+        StringBuilder sb = new StringBuilder();
+        for(int i = 0; i < orgPositionList.size(); i++){
+//            wrapper.where("INSTR(\'" + orgPositionList.get(i) +" \', s_org_position" + ")");
+            sb.append("INSTR(\'" + orgPositionList.get(i) +" \', s_org_position" + ")");
+            if(i < orgPositionList.size() - 1){
+//                wrapper.or();
+                sb.append(" or ");
+            }
+        }
+        if(sb.length() > 0){
+            String sql = "(" + sb.toString() + ")";
+            wrapper.where(sql);
+        }
+        while (true){
+            page.setCurrent(pageNum);
+            Page<AdPushTask> resultPage = this.adPushTaskServiceInterface.selectPage(page, wrapper);
+            if (resultPage.getRecords().size() > 0){
+                //  推送任务
+                resultPage.getRecords().forEach(task -> this.pushTask(task,device));
+            }
+            if (resultPage.getRecords().size() < pageSize){
+                //  结束循环
+                break;
+            }
+            ++ pageNum;
+        }
+    }
+
+    private void pushTask(AdPushTask task,Device device){
+        //  获取发布范围,并判断是否需要推送到设备
+        List<AdPushTaskDetails> detailsList = this.adPushTaskDetailsServiceInterface.getAdPushTaskDetails(task.getId());
+        List<Long> fkIdList = detailsList.stream().map(AdPushTaskDetails::getFkId).collect(Collectors.toList());
+        List<Long> deviceIdList;
+        switch (task.getPushType()){
+            //  小区发布
+            case 1:
+                if (!fkIdList.contains(device.getXqId())){
+                    return;
+                }
+                deviceIdList = this.getDeviceIdByXqs(fkIdList);
+                break;
+            //  单元发布
+            case 2:
+                if (!fkIdList.contains(device.getUnitId())){
+                    return;
+                }
+                deviceIdList = this.getDeviceIdByUnits(fkIdList);
+                break;
+            //  区域发布
+            case 4:
+                long province = Long.parseLong(device.getRegionProvince());
+                long city = Long.parseLong(device.getRegionCity());
+                long area = Long.parseLong(device.getRegionArea());
+                if (!fkIdList.contains(province) && !fkIdList.contains(city) && !fkIdList.contains(area)){
+                    return;
+                }
+                deviceIdList = this.getDeviceIdByRegions(fkIdList,task.getOrgPosition());
+                break;
+            default: return;
+        }
+        //  获取广告内容列表
+        List<AdPushContent> contentList = this.adPushContentServiceInterface.getAdPushContents(task.getId());
+        contentList.forEach(content -> {
+            //  获取广告图片
+            List<AdPushContentImg> imgList = this.adPushContentImgServiceInterface.getAdPushContentImgs(content.getId());
+            content.setAdPushContentImgs(imgList);
+        });
+        task.setAdPushContents(contentList);
+
+        PublishTask publishTask = new PublishTask(task.getId(), Instruct.add_face_advert_task,task,deviceIdList);
+        publishTask.setTaskType(OperationConstant.ONE);
+        Map<String,String> map = new HashMap<>();
+        this.msgPublishFeign.publishTask(publishTask,map);
+    }
+
+
+    private List<Long> getDeviceIdByRegions(List<Long> fkIdList,String position){
+        List<Long> xqIdList = new ArrayList<>();
+        PageBean<RegionAuthorize, RegionAuthorizeDto> pageBean = new PageBean<>();
+        pageBean.setSize(100);
+        RegionAuthorizeDto dto = new RegionAuthorizeDto();
+        dto.setUserOrgPosition(position);
+        dto.setAreaIdList(fkIdList);
+        pageBean.setDto(dto);
+        int pageNo = 0;
+        while (true){
+            ++ pageNo;
+            pageBean.setCurrent(pageNo);
+            //  得到授权小区列表
+            Page<RegionAuthorize> page = this.regionAuthorizeFeign.pagingQuery(pageBean);
+            if (page.getRecords().size() == 0){
+                break;
+            }
+            page.getRecords().forEach(authorize -> xqIdList.add(authorize.getXqId()));
+        }
+        return this.getDeviceIdByXqs(xqIdList);
+    }
+
+    private List<Long> getDeviceIdByXqs(List<Long> fkIdList){
+        List<Long> deviceIdList = new ArrayList<>();
+        fkIdList.forEach(xqId -> {
+            List<Device> deviceList = this.deviceFeign.getListByXqId(xqId);
+            deviceList.forEach(device -> deviceIdList.add(device.getId()));
+        });
+        return deviceIdList;
+    }
+
+    private List<Long> getDeviceIdByUnits(List<Long> fkIdList){
+        List<Device> deviceList = this.deviceFeign.getListByUnitIds(fkIdList);
+        return deviceList.stream().map(Device::getId).collect(Collectors.toList());
+    }
+
+}

+ 202 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/receiver/SyncLeisureAdvertDataDeviceReceiver.java

@@ -0,0 +1,202 @@
+package com.sptg.ad.biz.receiver;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.sptg.ad.api.entity.AdPushContent;
+import com.sptg.ad.api.entity.AdPushContentImg;
+import com.sptg.ad.api.entity.AdPushTask;
+import com.sptg.ad.api.entity.AdPushTaskDetails;
+import com.sptg.ad.biz.service.AdPushContentImgServiceInterface;
+import com.sptg.ad.biz.service.AdPushContentServiceInterface;
+import com.sptg.ad.biz.service.AdPushTaskDetailsServiceInterface;
+import com.sptg.ad.biz.service.AdPushTaskServiceInterface;
+import com.sptg.ad.biz.stream.SyncLeisureAdvertDataDeviceReceiverInterface;
+import com.sptg.common.core.beans.PageBean;
+import com.sptg.common.core.constant.OperationConstant;
+import com.sptg.common.core.entity.PublishTask;
+import com.sptg.common.core.enums.Instruct;
+import com.sptg.device.api.entity.Device;
+import com.sptg.device.api.feigns.DeviceFeign;
+import com.sptg.device.api.feigns.MsgPublishFeign;
+import com.sptg.permissions.api.dto.RegionAuthorizeDto;
+import com.sptg.permissions.api.entity.RegionAuthorize;
+import com.sptg.permissions.api.feigns.DeviceAuthorizeFeign;
+import com.sptg.permissions.api.feigns.RegionAuthorizeFeign;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+import org.springframework.cloud.stream.annotation.StreamListener;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ *
+ *
+ * description:
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+@SuppressWarnings({"all"})
+@EnableBinding(value = { SyncLeisureAdvertDataDeviceReceiverInterface.class})
+public class SyncLeisureAdvertDataDeviceReceiver {
+
+    private final DeviceFeign deviceFeign;
+    private final DeviceAuthorizeFeign deviceAuthorizeFeign;
+    private final AdPushTaskServiceInterface adPushTaskServiceInterface;
+    private final AdPushContentServiceInterface adPushContentServiceInterface;
+    private final AdPushContentImgServiceInterface adPushContentImgServiceInterface;
+    private final AdPushTaskDetailsServiceInterface adPushTaskDetailsServiceInterface;
+    private final RegionAuthorizeFeign regionAuthorizeFeign;
+    private final MsgPublishFeign msgPublishFeign;
+
+    @StreamListener(value = SyncLeisureAdvertDataDeviceReceiverInterface.INPUT)
+    public void input(String serialNumber){
+        if (null == serialNumber){
+            return;
+        }
+        //  获取设备授权的机构列表
+        List<String> orgPositionList = this.deviceAuthorizeFeign.getDeviceAuthorizeOrgList(serialNumber);
+        if (null == orgPositionList || orgPositionList.size() <= 0){
+            return;
+        }
+        //  获取设备信息
+        Device device = this.deviceFeign.getEntityBySerialNumber(serialNumber);
+        if (null  == device){
+            return;
+        }
+        //  分页获取广告任务列表
+        int pageNum = 1;
+        int pageSize = 100;
+        Page<AdPushTask> page = new Page<>();
+        page.setSize(pageSize);
+        /*
+            构建查询条件:
+                1.查询授权机构下发的所有广告记录
+                2.过滤已过期数据
+                3.只查询发布成功的数据
+                4.过滤针对单台设备发布的数据
+                5.只查询闲时广告
+         */
+        Wrapper<AdPushTask> wrapper = new EntityWrapper<>();
+//        wrapper.in("s_org_position",orgPositionList);
+        wrapper.gt("t_end_date",new Date());
+        wrapper.eq("i_push_status",1);
+        wrapper.notIn("i_push_type",3);
+        wrapper.eq("i_task_type",2);
+        StringBuilder sb = new StringBuilder();
+        for(int i = 0; i < orgPositionList.size(); i++){
+            sb.append("INSTR(\'" + orgPositionList.get(i) +" \', s_org_position" + ")");
+//            wrapper.where("INSTR(\'" + orgPositionList.get(i) +" \', s_org_position" + ")");
+            if(i < orgPositionList.size() - 1){
+//                wrapper.or();
+                sb.append(" or ");
+            }
+        }
+        if(sb.length() > 0){
+            String sql = "(" + sb.toString() + ")";
+            wrapper.where(sql);
+        }
+        while (true){
+            page.setCurrent(pageNum);
+            Page<AdPushTask> resultPage = this.adPushTaskServiceInterface.selectPage(page, wrapper);
+            if (resultPage.getRecords().size() > 0){
+                //  推送任务
+                resultPage.getRecords().forEach(task -> this.pushTask(task,device));
+            }
+            if (resultPage.getRecords().size() < pageSize){
+                //  结束循环
+                break;
+            }
+            ++ pageNum;
+        }
+    }
+
+    private void pushTask(AdPushTask task, Device device){
+        //  获取发布范围,并判断是否需要推送到设备
+        List<AdPushTaskDetails> detailsList = this.adPushTaskDetailsServiceInterface.getAdPushTaskDetails(task.getId());
+        List<Long> fkIdList = detailsList.stream().map(AdPushTaskDetails::getFkId).collect(Collectors.toList());
+        List<Long> deviceIdList;
+        switch (task.getPushType()){
+            //  小区发布
+            case 1:
+                if (!fkIdList.contains(device.getXqId())){
+                    return;
+                }
+                deviceIdList = this.getDeviceIdByXqs(fkIdList);
+                break;
+            //  单元发布
+            case 2:
+                if (!fkIdList.contains(device.getUnitId())){
+                    return;
+                }
+                deviceIdList = this.getDeviceIdByUnits(fkIdList);
+                break;
+            //  区域发布
+            case 4:
+                long province = Long.parseLong(device.getRegionProvince());
+                long city = Long.parseLong(device.getRegionCity());
+                long area = Long.parseLong(device.getRegionArea());
+                if (!fkIdList.contains(province) && !fkIdList.contains(city) && !fkIdList.contains(area)){
+                    return;
+                }
+                deviceIdList = this.getDeviceIdByRegions(fkIdList,task.getOrgPosition());
+                break;
+            default: return;
+        }
+        //  获取广告内容列表
+        List<AdPushContent> contentList = this.adPushContentServiceInterface.getAdPushContents(task.getId());
+        contentList.forEach(content -> {
+            //  获取广告图片
+            List<AdPushContentImg> imgList = this.adPushContentImgServiceInterface.getAdPushContentImgs(content.getId());
+            content.setAdPushContentImgs(imgList);
+        });
+        task.setAdPushContents(contentList);
+
+        PublishTask publishTask = new PublishTask(task.getId(), Instruct.add_leisure_advert_task,task,deviceIdList);
+        publishTask.setTaskType(OperationConstant.ONE);
+        Map<String,String> map = new HashMap<>();
+        this.msgPublishFeign.publishTask(publishTask,map);
+    }
+
+
+    private List<Long> getDeviceIdByRegions(List<Long> fkIdList,String position){
+        List<Long> xqIdList = new ArrayList<>();
+        PageBean<RegionAuthorize, RegionAuthorizeDto> pageBean = new PageBean<>();
+        pageBean.setSize(100);
+        RegionAuthorizeDto dto = new RegionAuthorizeDto();
+        dto.setUserOrgPosition(position);
+        dto.setAreaIdList(fkIdList);
+        pageBean.setDto(dto);
+        int pageNo = 0;
+        while (true){
+            ++ pageNo;
+            pageBean.setCurrent(pageNo);
+            //  得到授权小区列表
+            Page<RegionAuthorize> page = this.regionAuthorizeFeign.pagingQuery(pageBean);
+            if (page.getRecords().size() == 0){
+                break;
+            }
+            page.getRecords().forEach(authorize -> xqIdList.add(authorize.getXqId()));
+        }
+        return this.getDeviceIdByXqs(xqIdList);
+    }
+
+    private List<Long> getDeviceIdByXqs(List<Long> fkIdList){
+        List<Long> deviceIdList = new ArrayList<>();
+        fkIdList.forEach(xqId -> {
+            List<Device> deviceList = this.deviceFeign.getListByXqId(xqId);
+            deviceList.forEach(device -> deviceIdList.add(device.getId()));
+        });
+        return deviceIdList;
+    }
+
+    private List<Long> getDeviceIdByUnits(List<Long> fkIdList){
+        List<Device> deviceList = this.deviceFeign.getListByUnitIds(fkIdList);
+        return deviceList.stream().map(Device::getId).collect(Collectors.toList());
+    }
+
+}

+ 74 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/service/AdAdsenseServiceInterface.java

@@ -0,0 +1,74 @@
+package com.sptg.ad.biz.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.IService;
+import com.sptg.ad.api.dto.AdAdsenseDto;
+import com.sptg.ad.api.entity.AdAdsense;
+import com.sptg.ad.api.entity.AdContent;
+import com.sptg.common.core.beans.ResultBean;
+
+/**
+ * title: AdAdsenseServiceInterface
+ * package: com.sptg.ad.biz.security
+ * description: 广告位-服务层接口
+ *
+ *
+ *
+ */
+public interface AdAdsenseServiceInterface extends IService<AdAdsense> {
+    /**
+     * 功能描述:分页查询
+     * @param adAdsenseDto
+     * @return
+     *
+     *
+     */
+    Page<AdAdsense> showAdAdsenseList(AdAdsenseDto adAdsenseDto);
+
+    /**
+     * 功能描述:新增/编辑
+     * @param adAdsense
+     * @return
+     *
+     *
+     */
+    ResultBean<Boolean> addAdAdsense(AdAdsense adAdsense);
+    /**
+     * 功能描述:软删除
+     * @param ids
+     * @return
+     *
+     *
+     */
+    ResultBean<Boolean> deleteAdAdsense(String ids);
+
+    /**
+     * 功能描述:批量删除
+     * @param adAdsenseDto
+     * @return
+     *
+     *
+     */
+    ResultBean<Boolean> deleteAdsenseList(AdAdsenseDto adAdsenseDto);
+
+
+    /**
+     * 功能描述:根据id获取广告位
+     * @param id
+     * @return
+     *
+     *
+     */
+    AdAdsense findAdAdsenseById(Long id);
+
+    /**
+     * 功能描述:修改广告位的状态
+     * @param id
+     * @return
+     *
+     *
+     */
+    ResultBean<Boolean> updateAdsenseStatus(Long id,String adsenseStatus);
+
+    ResultBean<Integer> getAllAdsenseCount();
+}

+ 42 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/service/AdContentImgServiceInterface.java

@@ -0,0 +1,42 @@
+package com.sptg.ad.biz.service;
+
+import com.sptg.ad.api.entity.AdContentImg;
+import com.sptg.common.core.beans.ResultBean;
+
+import java.util.List;
+
+/**
+ * title: AdContentImgServiceInterface
+ * package: com.sptg.ad.biz.security
+ * description: 广告图片-接口类
+ *
+ *               
+ *                 
+ */
+public interface AdContentImgServiceInterface {
+    /**
+     * 功能描述:根据广告id删除图片
+     * @param adContentId 广告类容id
+     * @return
+     *               
+     *                       
+     */
+    ResultBean<Boolean> deleteImgByAdContentId(Long adContentId);
+
+    /**
+     * 功能描述:添加
+     * @param adContentImgs
+     * @return
+     *               
+     *                       
+     */
+    ResultBean<Boolean> addAdContentImg(List<AdContentImg> adContentImgs);
+    /**
+     * 功能描述:根据广告id获取广告图片
+     * @param adContentId
+     * @return
+     *               
+     *                       
+     */
+    List<AdContentImg> getAdContentImgs(Long adContentId);
+}

+ 77 - 0
sptg-ad/sptg-ad-biz/src/main/java/com/sptg/ad/biz/service/AdContentServiceInterface.java

@@ -0,0 +1,77 @@
+package com.sptg.ad.biz.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.IService;
+import com.sptg.ad.api.dto.AdContentDto;
+import com.sptg.ad.api.entity.AdContent;
+import com.sptg.common.core.beans.ResultBean;
+
+/**
+ * title: AdContentServiceInterface
+ * package: com.sptg.ad.biz.security
+ * description: 广告类容-服务层接口
+ *
+ *               
+ *                 
+ */
+public interface AdContentServiceInterface extends IService<AdContent> {
+    /**
+     * 功能描述:分页查询
+     * @param adContentDto
+     * @return 
+     *               
+     *                       
+     */
+    Page<AdContent> showAdContentList(AdContentDto adContentDto);
+
+    /**
+     * 功能描述:新增/编辑
+     * @param adContent
+     * @return
+     *               
+     *                      
+     */
+    ResultBean<Boolean> addAdContent(AdContent adContent);
+    /**
+     * 功能描述:软删除
+     * @param ids
+     * @return
+     *               
+     *                      
+     */
+    ResultBean<Boolean> deleteAdContent(String ids);
+
+    /**
+     * 功能描述:根据Id集合批量删除广告内容
+     * @param adContentDto
+     * @return ResultBean<Boolean>
+     *             
+     *                      
+     */
+    ResultBean<Boolean> deleteAdContentList(AdContentDto adContentDto);
+    /**
+     * 功能描述:根据id获取广告类容
+     * @param id
+     * @return
+     *               
+     *                       
+     */
+    AdContent findAdContentById(Long id);
+    /**
+     * 功能描述:获取广告类型列表
+     * @param dto
+     * @return
+     *               
+     *                       
+     */
+    ResultBean<AdContent> getList(AdContentDto dto);
+
+    /**
+     * 功能描述:更新记录机构位置
+     * @param oldPosition 旧机构位置
+     * @param newPosition 新机构位置
+     *               
+     *                      
+     */
+    void updateOrgPosition(String oldPosition, String newPosition);
+}

Некоторые файлы не были показаны из-за большого количества измененных файлов