瀏覽代碼

Merge branch 'usky-zyj' of uskycloud/usky-modules into master

gez 6 月之前
父節點
當前提交
a3f4acac4b
共有 52 個文件被更改,包括 2137 次插入69 次删除
  1. 3 0
      pom.xml
  2. 17 0
      service-eg/pom.xml
  3. 29 0
      service-eg/service-eg-api/pom.xml
  4. 16 0
      service-eg/service-eg-api/src/main/java/com/usky/eg/RemoteEgService.java
  5. 43 0
      service-eg/service-eg-api/src/main/java/com/usky/eg/domain/DeviceDataWriteVO.java
  6. 29 0
      service-eg/service-eg-api/src/main/java/com/usky/eg/factory/RemoteEgFallbackFactory.java
  7. 96 0
      service-eg/service-eg-biz/pom.xml
  8. 50 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/ApplicationRun.java
  9. 105 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/MybatisGenerator.java
  10. 81 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/controller/web/EgDeviceController.java
  11. 41 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/controller/web/EgRecordController.java
  12. 116 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/domain/EgDevice.java
  13. 115 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/domain/EgRecord.java
  14. 86 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/domain/MeetingFace.java
  15. 32 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/domain/MeetingFaceDevice.java
  16. 27 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/mapper/EgDeviceMapper.java
  17. 16 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/mapper/EgRecordMapper.java
  18. 18 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/mapper/MeetingFaceDeviceMapper.java
  19. 18 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/mapper/MeetingFaceMapper.java
  20. 31 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/service/EgDeviceService.java
  21. 22 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/service/EgRecordService.java
  22. 211 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/service/impl/EgDeviceServiceImpl.java
  23. 113 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/service/impl/EgRecordServiceImpl.java
  24. 39 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/service/vo/EgDeviceRequestVO.java
  25. 42 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/service/vo/EgRecordRequestVO.java
  26. 25 0
      service-eg/service-eg-biz/src/main/resources/bootstrap.yml
  27. 108 0
      service-eg/service-eg-biz/src/main/resources/doc/index.adoc
  28. 74 0
      service-eg/service-eg-biz/src/main/resources/logback.xml
  29. 58 0
      service-eg/service-eg-biz/src/main/resources/mapper/eg/EgDeviceMapper.xml
  30. 23 0
      service-eg/service-eg-biz/src/main/resources/mapper/eg/EgRecordMapper.xml
  31. 11 0
      service-eg/service-eg-biz/src/main/resources/mapper/eg/MeetingFaceDeviceMapper.xml
  32. 21 0
      service-eg/service-eg-biz/src/main/resources/mapper/eg/MeetingFaceMapper.xml
  33. 15 0
      service-eg/service-eg-biz/src/main/resources/smart-doc.json
  34. 8 0
      service-iot/service-iot-api/src/main/java/com/usky/iot/RemoteIotTaskService.java
  35. 11 0
      service-iot/service-iot-api/src/main/java/com/usky/iot/factory/RemoteIotTaskFactory.java
  36. 30 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/api/ServiceIotTaskApi.java
  37. 2 2
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/DeviceHttpController.java
  38. 1 1
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/DmpDeviceInfoService.java
  39. 33 31
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/DmpDeviceInfoServiceImpl.java
  40. 5 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/DmpDeviceInfoRequest.java
  41. 5 0
      service-meeting/service-meeting-biz/pom.xml
  42. 4 4
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/MybatisGenerator.java
  43. 4 4
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/MeetingDeviceController.java
  44. 23 3
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/MeetingFaceController.java
  45. 101 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/EgDevice.java
  46. 21 3
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingDevice.java
  47. 18 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/mapper/EgDeviceMapper.java
  48. 2 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/mapper/MeetingFaceMapper.java
  49. 87 20
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/MeetingDeviceServiceImpl.java
  50. 25 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/vo/MeetingDeviceRequestVO.java
  51. 24 0
      service-meeting/service-meeting-biz/src/main/resources/mapper/meeting/EgDeviceMapper.xml
  52. 2 1
      service-meeting/service-meeting-biz/src/main/resources/mapper/meeting/MeetingDeviceMapper.xml

+ 3 - 0
pom.xml

@@ -84,6 +84,9 @@
 
     <module>service-job</module>
 
+
+    <module>service-eg</module>
+
   </modules>
           
   

+ 17 - 0
service-eg/pom.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<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>usky-modules</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>service-eg</artifactId>
+    <packaging>pom</packaging>
+    <modules>
+        <module>service-eg-biz</module>
+        <module>service-eg-api</module>
+  </modules>
+
+</project>

+ 29 - 0
service-eg/service-eg-api/pom.xml

@@ -0,0 +1,29 @@
+<?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>service-eg</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>service-eg-api</artifactId>
+    <!-- SpringCloud Openfeign -->
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>usky-common-core</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+    </build>
+
+</project>

+ 16 - 0
service-eg/service-eg-api/src/main/java/com/usky/eg/RemoteEgService.java

@@ -0,0 +1,16 @@
+package com.usky.eg;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.eg.domain.*;
+import com.usky.eg.factory.RemoteEgFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+@FeignClient(contextId = "remoteEgService", value = "service-eg", fallbackFactory = RemoteEgFallbackFactory.class)
+public interface RemoteEgService {
+
+}

+ 43 - 0
service-eg/service-eg-api/src/main/java/com/usky/eg/domain/DeviceDataWriteVO.java

@@ -0,0 +1,43 @@
+package com.usky.eg.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class DeviceDataWriteVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 产品编码
+     */
+    private String productCode;
+
+    /**
+     * 设备UUId
+     */
+    private String deviceUUId;
+
+    /**
+     * 数据上报时间
+     */
+    private long timestamp;
+
+    /**
+     * 标签集合
+     */
+    private Map<String,String> tags;
+
+    /**
+     * 属性值集合
+     */
+    private Map<String,Object> metrics;
+
+}
+

+ 29 - 0
service-eg/service-eg-api/src/main/java/com/usky/eg/factory/RemoteEgFallbackFactory.java

@@ -0,0 +1,29 @@
+package com.usky.eg.factory;
+
+import com.usky.eg.RemoteEgService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+
+/**
+ * 用户服务降级处理
+ *
+ * @author ruoyi
+ */
+@Component
+public class RemoteEgFallbackFactory implements FallbackFactory<RemoteEgService>
+{
+    private static final Logger log = LoggerFactory.getLogger(RemoteEgFallbackFactory.class);
+
+    @Override
+    public RemoteEgService create(Throwable throwable)
+    {
+        log.error("用户服务调用失败:{}", throwable.getMessage());
+        return new RemoteEgService() {
+
+        };
+    }
+}

+ 96 - 0
service-eg/service-eg-biz/pom.xml

@@ -0,0 +1,96 @@
+<?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>service-eg</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>service-eg-biz</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>common-cloud-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <!-- Pagehelper -->
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>ruoyi-common-swagger</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.28</version>
+        </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-eg-api</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>data-transfer-api</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-iot-api</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.2.6.RELEASE</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>com.github.shalousun</groupId>
+                <artifactId>smart-doc-maven-plugin</artifactId>
+                <version>2.1.1</version>
+                <configuration>
+                    <!--指定生成文档的使用的配置文件,配置文件放在自己的项目中-->
+                    <configFile>./src/main/resources/smart-doc.json</configFile>
+                    <!--指定项目名称-->
+                    <projectName>test</projectName>
+                    <!--                    <excludes>-->
+                    <!--                        <exclude>com.bizmatics:product-service-provider</exclude>-->
+                    <!--                        <exclude>cn.afterturn:easypoi-web</exclude>-->
+                    <!--                    </excludes>-->
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 50 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/ApplicationRun.java

@@ -0,0 +1,50 @@
+package com.usky.eg;
+
+
+import com.ruoyi.common.swagger.annotation.EnableCustomSwagger2;
+import org.mybatis.spring.annotation.MapperScan;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.core.env.Environment;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * 应用启动模块
+ * 
+ */
+
+
+@EnableCustomSwagger2
+//@EnableSwagger2
+@EnableFeignClients(basePackages = "com.usky")
+@MapperScan(value = "com.usky.eg.mapper")
+@ComponentScan("com.usky")
+@SpringBootApplication
+public class ApplicationRun
+{
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationRun.class);
+
+    public static void main(String[] args) throws UnknownHostException {
+        ConfigurableApplicationContext application = SpringApplication.run(ApplicationRun.class, args);
+        Environment env = application.getEnvironment();
+        String ip = InetAddress.getLocalHost().getHostAddress();
+        String port = env.getProperty("server.port");
+        String path = env.getProperty("server.servlet.context-path");
+        LOGGER.info("\n----------------------------------------------------------\n\t" +
+                "Application is running! Access URLs:\n\t" +
+                "Local: \t\thttp://localhost:" + port + (null==path?"":path) + "/\n\t" +
+                "External: \thttp://" + ip + ":" + port + (null==path?"":path) + "/\n\t" +
+                "Api: \t\thttp://" + ip + ":" + port + (null==path?"":path) + "/swagger-ui/index.html\n\t" +
+                "----------------------------------------------------------");
+    }
+}

+ 105 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/MybatisGenerator.java

@@ -0,0 +1,105 @@
+package com.usky.eg;
+
+
+
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.InjectionConfig;
+import com.baomidou.mybatisplus.generator.config.*;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ */
+public class MybatisGenerator {
+    public static void main(String[] args) {
+
+            shell("service-eg","service-eg-biz");
+    }
+
+    private static void shell(String parentName,String model) {
+
+        AutoGenerator mpg = new AutoGenerator();
+        //1、全局配置
+        GlobalConfig gc = new GlobalConfig();
+//        File file = new File(model);
+//        String path = file.getAbsolutePath();
+        String projectPath = System.getProperty("user.dir");
+        projectPath+="/"+parentName;
+        projectPath+="/"+model;
+        gc.setOutputDir(projectPath+ "/src/main/java");  //生成路径(一般都是生成在此项目的src/main/java下面)
+        //修改为自己的名字
+        gc.setAuthor("zyj"); //设置作者
+        gc.setOpen(false);
+        gc.setFileOverride(true); //第二次生成会把第一次生成的覆盖掉
+        gc.setServiceName("%sService"); //生成的service接口名字首字母是否为I,这样设置就没有
+        gc.setBaseResultMap(true); //生成resultMap
+        mpg.setGlobalConfig(gc);
+
+        //2、数据源配置
+        //修改数据源
+        DataSourceConfig dsc = new DataSourceConfig();
+        dsc.setUrl("jdbc:mysql://192.168.10.165:3306/usky-cloud?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");
+        dsc.setDriverName("com.mysql.jdbc.Driver");
+        dsc.setUsername("root");
+        dsc.setPassword("yt123456");
+        mpg.setDataSource(dsc);
+
+        // 3、包配置
+        PackageConfig pc = new PackageConfig();
+        pc.setParent("com.usky.eg");
+        pc.setController("controller.web");
+        pc.setEntity("domain");
+        pc.setMapper("mapper");
+        pc.setService("service");
+        pc.setServiceImpl("service.impl");
+        mpg.setPackageInfo(pc);
+
+        // 4、策略配置
+        StrategyConfig strategy = new StrategyConfig();
+        strategy.setNaming(NamingStrategy.underline_to_camel);
+        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
+        strategy.setSuperMapperClass("com.usky.common.mybatis.core.CrudMapper");
+        strategy.setSuperServiceClass("com.usky.common.mybatis.core.CrudService");
+        strategy.setSuperServiceImplClass("com.usky.common.mybatis.core.AbstractCrudService");
+        // strategy.setTablePrefix("t_"); // 表名前缀
+        strategy.setEntityLombokModel(true); //使用lombok
+        //修改自己想要生成的表
+        strategy.setInclude("meeting_face");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
+        mpg.setStrategy(strategy);
+
+        // 关闭默认 xml 生成,调整生成 至 根目录
+        //修改对应的模块名称
+        TemplateConfig tc = new TemplateConfig();
+        // 自定义配置
+        InjectionConfig cfg = new InjectionConfig() {
+            @Override
+            public void initMap() {
+                // to do nothing
+            }
+        };
+        //如果模板引擎是 velocity
+        String templatePath = "/templates/mapper.xml.vm";
+        // 自定义输出配置
+        List<FileOutConfig> focList = new ArrayList<>();
+        // 自定义配置会被优先输出
+        String finalProjectPath = projectPath;
+        focList.add(new FileOutConfig(templatePath) {
+            @Override
+            public String outputFile(TableInfo tableInfo) {
+                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
+                return finalProjectPath + "/src/main/resources/mapper/eg" + "/"
+                        + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
+            }
+        });
+        cfg.setFileOutConfigList(focList);
+        mpg.setCfg(cfg);
+        tc.setXml(null);
+        mpg.setTemplate(tc);
+        //5、执行
+        mpg.execute();
+    }
+}

+ 81 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/controller/web/EgDeviceController.java

@@ -0,0 +1,81 @@
+package com.usky.eg.controller.web;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.eg.domain.EgDevice;
+import com.usky.eg.service.EgDeviceService;
+import com.usky.eg.service.vo.EgDeviceRequestVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 门禁_设备信息表 前端控制器
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@RestController
+@RequestMapping("/egDevice")
+public class EgDeviceController {
+    @Autowired
+    private EgDeviceService egDeviceService;
+
+    @PostMapping("page")
+    public ApiResult<CommonPage<EgDevice>> page(@RequestBody EgDeviceRequestVO requestVO){
+        return ApiResult.success(egDeviceService.page(requestVO));
+    }
+
+    /**
+     * 新增
+     * @param egDevice
+     * @return
+     */
+    @PostMapping
+    public ApiResult<Void> add(@RequestBody EgDevice egDevice){
+        egDeviceService.add(egDevice);
+        return ApiResult.success();
+    }
+
+    /**
+     * 修改
+     * @param egDevice
+     * @return
+     */
+    @PutMapping
+    public ApiResult<Void> update(@RequestBody EgDevice egDevice){
+        egDeviceService.update(egDevice);
+        return ApiResult.success();
+    }
+
+    /**
+     * 删除
+     * @param id
+     * @return
+     */
+    @DeleteMapping("/{id}")
+    public ApiResult<Void> remove(@PathVariable("id") Integer id){
+        egDeviceService.remove(id);
+        return ApiResult.success();
+    }
+
+    /**
+     * 下发设备控制命令
+     */
+    @GetMapping("/control")
+    public ApiResult<Map<String,Object>> control(@RequestParam("productCode") String productCode,
+                                                 @RequestParam("deviceUuid") String deviceUuid,
+                                                 @RequestParam("commandCode") String commandCode,
+                                                 @RequestParam("commandValue") String commandValue,
+                                                 @RequestParam(value = "domain",required = false) String domain,
+                                                 @RequestParam(value = "userId",required = false) Long userId,
+                                                 @RequestParam(value = "userName",required = false) String userName){
+        return ApiResult.success(egDeviceService.control(productCode,deviceUuid,commandCode,commandValue,domain,userId,userName));
+    }
+
+}
+

+ 41 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/controller/web/EgRecordController.java

@@ -0,0 +1,41 @@
+package com.usky.eg.controller.web;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.eg.domain.EgRecord;
+import com.usky.eg.service.EgRecordService;
+import com.usky.eg.service.vo.EgRecordRequestVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 门禁_通行记录表 前端控制器
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@RestController
+@RequestMapping("/egRecord")
+public class EgRecordController {
+    @Autowired
+    private EgRecordService egRecordService;
+
+    @PostMapping
+    public ApiResult<Void> add(@RequestBody EgRecord egRecord){
+        egRecordService.add(egRecord);
+        return ApiResult.success();
+    }
+
+    @PostMapping("page")
+    public ApiResult<CommonPage<EgRecord>> page(@RequestBody EgRecordRequestVO requestVO){
+        return ApiResult.success(egRecordService.page(requestVO));
+    }
+}
+

+ 116 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/domain/EgDevice.java

@@ -0,0 +1,116 @@
+package com.usky.eg.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.List;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import rx.BackpressureOverflow;
+
+/**
+ * <p>
+ * 门禁_设备信息表
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class EgDevice implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 设备uuid
+     */
+    private String deviceUuid;
+
+    /**
+     * 设备ID
+     */
+    private String deviceId;
+
+    /**
+     * 设备名称
+     */
+    private String deviceName;
+
+    /**
+     * 安装位置
+     */
+    private String installAddress;
+
+    /**
+     * 业务状态;1:未激活,2:已激活,3:禁用
+     */
+    private Integer serviceStatus;
+
+    /**
+     * IP
+     */
+    private String deviceIp;
+
+    /**
+     * 端口
+     */
+    private Integer devicePort;
+
+    /**
+     * 门禁号
+     */
+    private String egNumber;
+
+    /**
+     * 绑定人脸信息
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private String bindFace;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 创建日期
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 组织机构ID
+     */
+    private Integer deptId;
+
+    /**
+     * 租户ID
+     */
+    private Integer tenantId;
+
+    /**
+     * 用户人脸信息记录
+     */
+    @TableField(exist = false)
+    private List<MeetingFace> meetingFaceList;
+}

+ 115 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/domain/EgRecord.java

@@ -0,0 +1,115 @@
+package com.usky.eg.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.List;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 门禁_通行记录表
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class EgRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 用户姓名
+     */
+    private String userName;
+
+    /**
+     * 通行时间
+     */
+    private LocalDateTime passTime;
+
+    /**
+     * 门禁设备主键id
+     */
+    private Integer egDeviceId;
+
+    /**
+     * 通行方式(1、人脸 2、刷卡 3、手机)
+     */
+    private Integer passType;
+
+    /**
+     * 人脸图片数据 base_64编码
+     */
+    private String faceBase;
+
+    /**
+     * 卡号
+     */
+    private String cardNum;
+
+    /**
+     * 通行结果
+     */
+    private String passResult;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 创建日期
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 组织机构ID
+     */
+    private Integer deptId;
+
+    /**
+     * 租户ID
+     */
+    private Integer tenantId;
+
+    /**
+     * 设备Uuid
+     */
+    @TableField(exist = false)
+    private String deviceUuid;
+
+    /**
+     * 域名
+     */
+    @TableField(exist = false)
+    private String domain;
+
+    /**
+     * 门禁设备信息集合
+     */
+    @TableField(exist = false)
+    private EgDevice egDevice;
+}

+ 86 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/domain/MeetingFace.java

@@ -0,0 +1,86 @@
+package com.usky.eg.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class MeetingFace implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "fid", type = IdType.AUTO)
+    private Integer fid;
+
+    /**
+     * 图片数据 base_64编码
+     */
+    private String faceBase;
+
+    /**
+     * 插入时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 验证次数
+     */
+    private Integer vefNum;
+
+    /**
+     * 人脸名称
+     */
+    private String faceName;
+
+    /**
+     * 人脸备注
+     */
+    private String remark;
+
+    /**
+     * 人脸是否可用,(0==可用,1,不可用)
+     */
+    private Integer faceStatus;
+
+    /**
+     * 卡号
+     */
+    private String cardNum;
+
+    /**
+     * 绑定设备
+     */
+    private String bindDevice;
+
+    /**
+     * 组织机构ID
+     */
+    private Integer deptId;
+
+    /**
+     * 租户ID
+     */
+    private Integer tenantId;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+
+}

+ 32 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/domain/MeetingFaceDevice.java

@@ -0,0 +1,32 @@
+package com.usky.eg.domain;
+
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 人脸设备关联表
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class MeetingFaceDevice implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 人脸主键ID
+     */
+    private Integer faceId;
+
+    /**
+     * 设备主键ID
+     */
+    private Integer deviceId;
+
+
+}

+ 27 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/mapper/EgDeviceMapper.java

@@ -0,0 +1,27 @@
+package com.usky.eg.mapper;
+
+import com.usky.eg.domain.EgDevice;
+import com.usky.common.mybatis.core.CrudMapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ * 门禁_设备信息表 Mapper 接口
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@Repository
+public interface EgDeviceMapper extends CrudMapper<EgDevice> {
+    void insertMeetingFaceDevice(@Param("fid") Integer fid, @Param("egDeviceId") Integer egDeviceId);
+
+    void deleteMeetingFaceDevice(@Param("egDeviceId") Integer egDeviceId);
+
+    Integer sysTenantId(@Param("domain") String domain);
+
+    Integer getMeetingFaceData(@Param("userId") Long userId);
+
+    Integer[] getMeetingFaceDeviceList(@Param("fid") Integer fid);
+}

+ 16 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/mapper/EgRecordMapper.java

@@ -0,0 +1,16 @@
+package com.usky.eg.mapper;
+
+import com.usky.eg.domain.EgRecord;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 门禁_通行记录表 Mapper 接口
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+public interface EgRecordMapper extends CrudMapper<EgRecord> {
+
+}

+ 18 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/mapper/MeetingFaceDeviceMapper.java

@@ -0,0 +1,18 @@
+package com.usky.eg.mapper;
+
+import com.usky.eg.domain.MeetingFaceDevice;
+import com.usky.common.mybatis.core.CrudMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ * 人脸设备关联表 Mapper 接口
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@Repository
+public interface MeetingFaceDeviceMapper extends CrudMapper<MeetingFaceDevice> {
+
+}

+ 18 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/mapper/MeetingFaceMapper.java

@@ -0,0 +1,18 @@
+package com.usky.eg.mapper;
+
+import com.usky.eg.domain.MeetingFace;
+import com.usky.common.mybatis.core.CrudMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@Repository
+public interface MeetingFaceMapper extends CrudMapper<MeetingFace> {
+
+}

+ 31 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/service/EgDeviceService.java

@@ -0,0 +1,31 @@
+package com.usky.eg.service;
+
+import com.usky.common.core.bean.CommonPage;
+import com.usky.eg.domain.EgDevice;
+import com.usky.common.mybatis.core.CrudService;
+import com.usky.eg.service.vo.EgDeviceRequestVO;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 门禁_设备信息表 服务类
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+public interface EgDeviceService extends CrudService<EgDevice> {
+    CommonPage<EgDevice> page(EgDeviceRequestVO requestVO);
+
+    void add(EgDevice egDevice);
+
+    void update(EgDevice egDevice);
+
+    void remove(Integer id);
+
+    boolean checkNameUnique(EgDevice egDevice);
+
+    Map<String,Object> control(String productCode, String deviceUuid, String commandCode, String commandValue, String domain, Long userId, String userName);
+}

+ 22 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/service/EgRecordService.java

@@ -0,0 +1,22 @@
+package com.usky.eg.service;
+
+import com.usky.common.core.bean.CommonPage;
+import com.usky.eg.domain.EgRecord;
+import com.usky.common.mybatis.core.CrudService;
+import com.usky.eg.service.vo.EgRecordRequestVO;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * <p>
+ * 门禁_通行记录表 服务类
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+public interface EgRecordService extends CrudService<EgRecord> {
+
+    void add(EgRecord egRecord);
+
+    CommonPage<EgRecord> page(EgRecordRequestVO requestVO);
+}

+ 211 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/service/impl/EgDeviceServiceImpl.java

@@ -0,0 +1,211 @@
+package com.usky.eg.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.core.exception.BusinessException;
+import com.usky.common.core.util.UUIDUtils;
+import com.usky.common.security.utils.SecurityUtils;
+import com.usky.eg.domain.EgDevice;
+import com.usky.eg.domain.MeetingFace;
+import com.usky.eg.domain.MeetingFaceDevice;
+import com.usky.eg.mapper.EgDeviceMapper;
+import com.usky.eg.mapper.MeetingFaceDeviceMapper;
+import com.usky.eg.mapper.MeetingFaceMapper;
+import com.usky.eg.service.EgDeviceService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.eg.service.vo.EgDeviceRequestVO;
+import com.usky.iot.RemoteIotTaskService;
+import com.usky.transfer.RemoteTransferService;
+import io.swagger.models.auth.In;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.*;
+
+/**
+ * <p>
+ * 门禁_设备信息表 服务实现类
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@Service
+public class EgDeviceServiceImpl extends AbstractCrudService<EgDeviceMapper, EgDevice> implements EgDeviceService {
+    @Autowired
+    private MeetingFaceDeviceMapper meetingFaceDeviceMapper;
+    @Autowired
+    private MeetingFaceMapper meetingFaceMapper;
+    @Autowired
+    private EgDeviceMapper egDeviceMapper;
+    @Autowired
+    private RemoteIotTaskService remoteIotTaskService;
+
+    @Autowired
+    private RemoteTransferService remoteTransferService;
+
+    @Override
+    public CommonPage<EgDevice> page(EgDeviceRequestVO requestVO){
+        IPage<EgDevice> page = new Page<>(requestVO.getCurrent(),requestVO.getSize());
+
+        LambdaQueryWrapper<EgDevice> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.like(StringUtils.isNotBlank(requestVO.getDeviceName()),EgDevice::getDeviceName,requestVO.getDeviceName())
+                .like(StringUtils.isNotBlank(requestVO.getInstallAddress()),EgDevice::getInstallAddress,requestVO.getInstallAddress())
+                .eq(null != requestVO.getServiceStatus(),EgDevice::getServiceStatus,requestVO.getServiceStatus())
+                .eq(null != requestVO.getId(),EgDevice::getId,requestVO.getId())
+                .eq(EgDevice::getTenantId,SecurityUtils.getTenantId())
+                .orderByDesc(EgDevice::getId);
+        page = this.page(page,queryWrapper);
+        if(page.getRecords().size() > 0){
+            for (int i = 0; i < page.getRecords().size(); i++) {
+                if(Objects.nonNull(page.getRecords().get(i).getBindFace()) ||StringUtils.isNotBlank(page.getRecords().get(i).getBindFace())){
+                    String[] fidListStr = page.getRecords().get(i).getBindFace().split(",");
+                    Integer[] fidList = Arrays.stream(fidListStr).map(Integer::parseInt).toArray(Integer[]::new);
+
+                    LambdaQueryWrapper<MeetingFace> meetingFaceQuery = Wrappers.lambdaQuery();
+                    meetingFaceQuery.in(MeetingFace::getFid,Arrays.asList(fidList));
+                    List<MeetingFace> meetingFaceList = meetingFaceMapper.selectList(meetingFaceQuery);
+
+                    page.getRecords().get(i).setMeetingFaceList(meetingFaceList);
+                }
+
+            }
+        }
+
+        return new CommonPage<>(page.getRecords(),page.getTotal(),requestVO.getSize(),requestVO.getCurrent());
+    }
+
+    @Override
+    public void add(EgDevice egDevice){
+        if(checkNameUnique(egDevice)){
+            throw new BusinessException("新增门禁门号设备'"+egDevice.getDeviceId()+","+egDevice.getEgNumber()+"'失败,设备已存在");
+        }
+
+        egDevice.setDeviceUuid(UUIDUtils.uuid());
+        egDevice.setCreateBy(SecurityUtils.getUsername());
+        egDevice.setCreateTime(LocalDateTime.now());
+        egDevice.setTenantId(SecurityUtils.getTenantId());
+
+        this.save(egDevice);
+
+        String[] fids = new String[0];
+        if(Objects.nonNull(egDevice.getBindFace()) || StringUtils.isNotBlank(egDevice.getBindFace())){
+            fids = egDevice.getBindFace().split(",");
+        }
+        if(fids.length > 0){
+            for (int i = 0; i < fids.length; i++) {
+                egDeviceMapper.insertMeetingFaceDevice(Integer.parseInt(fids[i]),egDevice.getId());
+            }
+        }
+
+        remoteIotTaskService.addDeviceInfo("502_USKY", egDevice.getDeviceUuid(),egDevice.getDeviceId()+egDevice.getEgNumber(),egDevice.getDeviceName(),egDevice.getInstallAddress(),egDevice.getServiceStatus());
+    }
+
+    @Override
+    public void update(EgDevice egDevice){
+        if(checkNameUnique(egDevice)){
+            throw new BusinessException("修改门禁门号设备'"+egDevice.getDeviceId()+","+egDevice.getEgNumber()+"'失败,设备已存在");
+        }
+
+        egDevice.setUpdateBy(SecurityUtils.getUsername());
+        egDevice.setUpdateTime(LocalDateTime.now());
+
+        this.updateById(egDevice);
+
+        String[] fids = new String[0];
+        egDeviceMapper.deleteMeetingFaceDevice(egDevice.getId());
+        if(Objects.nonNull(egDevice.getBindFace()) || StringUtils.isNotBlank(egDevice.getBindFace())){
+            fids = egDevice.getBindFace().split(",");
+        }
+        if(fids.length > 0){
+            for (int i = 0; i < fids.length; i++) {
+                egDeviceMapper.insertMeetingFaceDevice(Integer.parseInt(fids[i]),egDevice.getId());
+            }
+        }
+    }
+
+    @Override
+    public void remove(Integer id){
+        EgDevice egDevice = this.getById(id);
+        Optional.ofNullable(egDevice).orElseThrow(() -> new BusinessException("门禁设备信息不存在"));
+
+        LambdaQueryWrapper<MeetingFaceDevice> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(MeetingFaceDevice::getDeviceId,id);
+        Integer count = meetingFaceDeviceMapper.selectCount(queryWrapper);
+        if(count > 0){
+            throw new BusinessException("已绑定人员不能删除");
+        }
+
+        this.removeById(id);
+
+        remoteIotTaskService.deleteDeviceInfo(egDevice.getDeviceUuid());
+    }
+
+    @Override
+    public boolean checkNameUnique(EgDevice egDevice){
+        Integer id = null == egDevice.getId() ? -1 : egDevice.getId();
+        LambdaQueryWrapper<EgDevice> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(EgDevice::getDeviceId,egDevice.getDeviceId())
+                .eq(EgDevice::getEgNumber,egDevice.getEgNumber())
+                .eq(EgDevice::getTenantId, SecurityUtils.getTenantId());
+        EgDevice one = this.getOne(queryWrapper);
+        return null != one && !Objects.equals(one.getId(),id);
+    }
+
+    @Override
+    public Map<String,Object> control(String productCode, String deviceUuid, String commandCode, String commandValue, String domain, Long userId, String userName){
+        Integer tenantId;
+        long commandUserId;
+        String commandUserName;
+        if(StringUtils.isNotBlank(domain)){
+            tenantId = baseMapper.sysTenantId(domain);
+            commandUserId = userId;
+            commandUserName = userName;
+        }else{
+            tenantId = SecurityUtils.getTenantId();
+            commandUserId = SecurityUtils.getUserId();
+            commandUserName = SecurityUtils.getUsername();
+        }
+
+        //人员设备权限校验,校验通过,可以下发命令控制设备
+        Integer fid = baseMapper.getMeetingFaceData(commandUserId);
+        if(fid == null){
+            throw new BusinessException("人脸卡号信息未注册");
+        }
+        Integer[] deviceFid = baseMapper.getMeetingFaceDeviceList(fid);
+        if(deviceFid.length == 0){
+            throw new BusinessException("人员未绑定设备,请检查");
+        }
+
+        LambdaQueryWrapper<EgDevice> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.select(EgDevice::getId)
+                .eq(EgDevice::getDeviceUuid,deviceUuid);
+        EgDevice one = this.getOne(queryWrapper);
+        if(one != null){
+            boolean exist = Arrays.asList(deviceFid).contains(one.getId());
+            if(!exist){
+                throw new BusinessException("暂无权限");
+            }
+        }else{
+            throw new BusinessException("设备未注册,请先注册");
+        }
+
+
+        Map<String,Object> map = new HashMap<>();
+        map.put("method","control");
+        Map<String,Object> map1 = new HashMap<>();
+        map1.put("commandCode",commandCode);
+        map1.put("commandValue",commandValue);
+        map.put("params",map1);
+
+        return remoteTransferService.deviceControl(productCode,deviceUuid, JSON.toJSONString(map),tenantId,commandUserId,commandUserName);
+    }
+}

+ 113 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/service/impl/EgRecordServiceImpl.java

@@ -0,0 +1,113 @@
+package com.usky.eg.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.core.exception.BusinessException;
+import com.usky.common.security.utils.SecurityUtils;
+import com.usky.eg.domain.EgDevice;
+import com.usky.eg.domain.EgRecord;
+import com.usky.eg.mapper.EgDeviceMapper;
+import com.usky.eg.mapper.EgRecordMapper;
+import com.usky.eg.service.EgDeviceService;
+import com.usky.eg.service.EgRecordService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.eg.service.vo.EgRecordRequestVO;
+import net.bytebuddy.dynamic.scaffold.MethodRegistry;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.time.temporal.Temporal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 门禁_通行记录表 服务实现类
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@Service
+public class EgRecordServiceImpl extends AbstractCrudService<EgRecordMapper, EgRecord> implements EgRecordService {
+    @Autowired
+    private EgDeviceService egDeviceService;
+    @Autowired
+    private EgDeviceMapper egDeviceMapper;
+
+    @Override
+    public void add(EgRecord egRecord){
+        Integer tenantId;
+        if(StringUtils.isNotBlank(egRecord.getDomain())){
+            tenantId = egDeviceMapper.sysTenantId(egRecord.getDomain());
+        }else{
+            tenantId = SecurityUtils.getTenantId();
+        }
+
+        LambdaQueryWrapper<EgDevice> queryWrapper = Wrappers.lambdaQuery();
+        if(StringUtils.isBlank(egRecord.getDeviceUuid())){
+            throw new BusinessException("设备Uuid不能为空");
+        }
+        queryWrapper.eq(EgDevice::getDeviceUuid,egRecord.getDeviceUuid());
+        EgDevice one = egDeviceService.getOne(queryWrapper);
+        egRecord.setEgDeviceId(one.getId());
+
+        egRecord.setCreateTime(LocalDateTime.now());
+        egRecord.setTenantId(tenantId);
+
+        this.save(egRecord);
+    }
+
+    @Override
+    public CommonPage<EgRecord> page(EgRecordRequestVO requestVO){
+        IPage<EgRecord> page = new Page<>(requestVO.getCurrent(),requestVO.getSize());
+        String deviceName = requestVO.getDeviceName();
+
+        List<Integer> egDeviceIdList = new ArrayList<>();
+        List<EgDevice> egDeviceList ;
+        LambdaQueryWrapper<EgDevice> egDeviceQuery = Wrappers.lambdaQuery();
+        if(StringUtils.isNotBlank(deviceName)){
+            egDeviceQuery.like(EgDevice::getDeviceName,deviceName).eq(EgDevice::getTenantId, SecurityUtils.getTenantId());
+            egDeviceList = egDeviceMapper.selectList(egDeviceQuery);
+            if(egDeviceList.size() > 0){
+                for (int i = 0; i < egDeviceList.size(); i++) {
+                    egDeviceIdList.add(egDeviceList.get(i).getId());
+                }
+            }
+        }else{
+            egDeviceQuery.eq(EgDevice::getTenantId, SecurityUtils.getTenantId());
+            egDeviceList = egDeviceMapper.selectList(egDeviceQuery);
+        }
+
+        LambdaQueryWrapper<EgRecord> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.like(StringUtils.isNotBlank(requestVO.getUserName()),EgRecord::getUserName,requestVO.getUserName())
+                .eq(null != requestVO.getPassType(),EgRecord::getPassType,requestVO.getPassType())
+                .in(CollectionUtils.isNotEmpty(egDeviceIdList),EgRecord::getEgDeviceId,egDeviceIdList)
+                .between(StringUtils.isNotBlank(requestVO.getStartTime())&&StringUtils.isNotBlank(requestVO.getEndTime()),EgRecord::getPassTime,requestVO.getStartTime(),requestVO.getEndTime())
+                .orderByDesc(EgRecord::getId);
+        page = this.page(page,queryWrapper);
+        if((page.getRecords().size() > 0) && (egDeviceList.size() > 0)){
+            for (int i = 0; i < page.getRecords().size(); i++) {
+                if(Objects.nonNull(page.getRecords().get(i).getEgDeviceId())){
+                    Integer egDeviceId = page.getRecords().get(i).getEgDeviceId();
+                    for (int j = 0; j < egDeviceList.size(); j++) {
+                        if(egDeviceId.equals(egDeviceList.get(j).getId())){
+                            page.getRecords().get(i).setEgDevice(egDeviceList.get(j));
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+
+
+        return new CommonPage<>(page.getRecords(),page.getTotal(),requestVO.getSize(),requestVO.getCurrent());
+    }
+}

+ 39 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/service/vo/EgDeviceRequestVO.java

@@ -0,0 +1,39 @@
+package com.usky.eg.service.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class EgDeviceRequestVO implements Serializable {
+
+    /**
+     * 页数
+     */
+    private Integer current;
+    /**
+     * 条数
+     */
+    private Integer size;
+
+    /**
+     * 设备名称
+     */
+    private String deviceName;
+
+    /**
+     * 安装位置
+     */
+    private String installAddress;
+
+    /**
+     * 业务状态;1:未激活,2:已激活,3:禁用
+     */
+    private Integer serviceStatus;
+
+    /**
+     * 表主键Id
+     */
+    private Integer id;
+
+}

+ 42 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/service/vo/EgRecordRequestVO.java

@@ -0,0 +1,42 @@
+package com.usky.eg.service.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class EgRecordRequestVO implements Serializable {
+    /**
+     * 页数
+     */
+    private Integer current;
+    /**
+     * 条数
+     */
+    private Integer size;
+
+    /**
+     * 用户姓名
+     */
+    private String userName;
+
+    /**
+     * 通行方式(1、人脸 2、刷卡)
+     */
+    private Integer passType;
+
+    /**
+     * 设备名称
+     */
+    private String deviceName;
+
+    /**
+     * 开始时间
+     */
+    private String startTime;
+
+    /**
+     * 结束时间
+     */
+    private String endTime;
+}

+ 25 - 0
service-eg/service-eg-biz/src/main/resources/bootstrap.yml

@@ -0,0 +1,25 @@
+# Tomcat
+server:
+  port: 9898
+
+# Spring
+spring: 
+  application:
+    # 应用名称
+    name: service-eg
+  profiles:
+    # 环境配置
+    active: dev
+  cloud:
+    nacos:
+      discovery:
+        # 服务注册地址
+        server-addr: usky-cloud-nacos:8848
+      config:
+        # 配置中心地址
+        server-addr: usky-cloud-nacos:8848
+        # 配置文件格式
+        file-extension: yml
+        # 共享配置
+        shared-configs:
+          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

+ 108 - 0
service-eg/service-eg-biz/src/main/resources/doc/index.adoc

@@ -0,0 +1,108 @@
+= 安防项目
+
+[width="100%",options="header"]
+[stripes=even]
+|====================
+|Version |  Update Time  | Status | Author |  Description
+|v2022-04-21 16:57:08|2022-04-21 16:57:08|auto|@yq|Created by smart-doc
+|====================
+
+
+== &lt;p&gt;参数配置表 前端控制器&lt;/p&gt;
+== &lt;p&gt;部门信息&lt;/p&gt;
+=== 查看部门信息
+*URL:* http:10.23.39.1:8082/sysDept/list
+
+*Type:* POST
+
+*Author:* ya
+
+*Content-Type:* application/json; charset=utf-8
+
+
+
+
+*Body-parameters:*
+
+[width="100%",options="header"]
+[stripes=even]
+|====================
+|Parameter | Type|Description|Required|Since
+|deptId|int64|部门id|false|-
+|parentId|int64|父部门id|false|-
+|ancestors|string|祖级列表|false|-
+|deptName|string|部门名称|false|-
+|orderNum|int32|显示顺序|false|-
+|leader|string|负责人|false|-
+|phone|string|联系电话|false|-
+|email|string|邮箱|false|-
+|status|string|部门状态(0正常 1停用)|false|-
+|delFlag|string|删除标志(0代表存在 2代表删除)|false|-
+|createBy|string|创建者|false|-
+|createTime|string|创建时间|false|-
+|updateBy|string|更新者|false|-
+|updateTime|string|更新时间|false|-
+|bId|int64|建筑id|false|-
+|====================
+
+*Response-fields:*
+
+[width="100%",options="header"]
+[stripes=even]
+|====================
+|Field | Type|Description|Since
+|status|object|No comments found.|-
+|code|string|No comments found.|-
+|msg|string|No comments found.|-
+|data|object|No comments found.|-
+|└─deptId|int64|部门id|-
+|└─parentId|int64|父部门id|-
+|└─ancestors|string|祖级列表|-
+|└─deptName|string|部门名称|-
+|└─orderNum|int32|显示顺序|-
+|└─leader|string|负责人|-
+|└─phone|string|联系电话|-
+|└─email|string|邮箱|-
+|└─status|string|部门状态(0正常 1停用)|-
+|└─delFlag|string|删除标志(0代表存在 2代表删除)|-
+|└─createBy|string|创建者|-
+|└─createTime|string|创建时间|-
+|└─updateBy|string|更新者|-
+|└─updateTime|string|更新时间|-
+|└─bId|int64|建筑id|-
+|exception|string|No comments found.|-
+|====================
+
+*Response-example:*
+----
+{
+	"status": {
+		
+	},
+	"code": "97564",
+	"msg": "wnr5qt",
+	"data": [
+		{
+			"deptId": 540,
+			"parentId": 858,
+			"ancestors": "o5lg60",
+			"deptName": "文.沈",
+			"orderNum": 260,
+			"leader": "ufz93p",
+			"phone": "17852835049",
+			"email": "智渊.徐@yahoo.com",
+			"status": "nu6cnp",
+			"delFlag": "72oiji",
+			"createBy": "5fxr6j",
+			"createTime": "2022-04-21 16:57:10",
+			"updateBy": "4kcs4e",
+			"updateTime": "2022-04-21 16:57:10",
+			"bId": 977
+		}
+	],
+	"exception": "53u6bg"
+}
+----
+
+== &lt;p&gt;用户信息表 前端控制器&lt;/p&gt;
+

+ 74 - 0
service-eg/service-eg-biz/src/main/resources/logback.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!-- 日志存放路径 -->
+	<property name="log.path" value="/var/log/uskycloud/data-transfer" />
+   <!-- 日志输出格式 -->
+	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
+
+    <!-- 控制台输出 -->
+	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+	</appender>
+
+    <!-- 系统日志输出 -->
+	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/info.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+			<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+		</rollingPolicy>
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>INFO</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+	</appender>
+
+    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/error.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>ERROR</level>
+			<!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+			<!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 系统模块日志级别控制  -->
+	<logger name="com.usky" level="info" />
+	<!-- Spring日志级别控制  -->
+	<logger name="org.springframework" level="warn" />
+
+	<root level="info">
+		<appender-ref ref="console" />
+	</root>
+	
+	<!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="file_info" />
+        <appender-ref ref="file_error" />
+    </root>
+</configuration>

+ 58 - 0
service-eg/service-eg-biz/src/main/resources/mapper/eg/EgDeviceMapper.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.eg.mapper.EgDeviceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.eg.domain.EgDevice">
+        <id column="id" property="id" />
+        <result column="device_uuid" property="deviceUuid" />
+        <result column="device_id" property="deviceId" />
+        <result column="device_name" property="deviceName" />
+        <result column="install_address" property="installAddress" />
+        <result column="service_status" property="serviceStatus" />
+        <result column="device_ip" property="deviceIp" />
+        <result column="device_port" property="devicePort" />
+        <result column="eg_number" property="egNumber" />
+        <result column="bind_face" property="bindFace" />
+        <result column="create_by" property="createBy" />
+        <result column="update_by" property="updateBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="dept_id" property="deptId" />
+        <result column="tenant_id" property="tenantId" />
+    </resultMap>
+    <insert id="insertMeetingFaceDevice" parameterType="integer">
+        insert into meeting_face_device (face_id,device_id) value (#{fid}, #{egDeviceId});
+    </insert>
+    <delete id="deleteMeetingFaceDevice" parameterType="integer">
+        delete from meeting_face_device where device_id = #{egDeviceId};
+    </delete>
+    <select id="sysTenantId" resultType="integer">
+        select id
+        from sys_tenant
+        <where>
+            <if test="1 == 1">
+                and domain = #{domain}
+            </if>
+        </where>
+    </select>
+    <select id="getMeetingFaceData" resultType="integer">
+        select mf.fid as fid
+        from meeting_face mf
+        <where>
+            <if test="userId != null">
+                and mf.user_id = #{userId}
+            </if>
+        </where>
+    </select>
+    <select id="getMeetingFaceDeviceList" resultType="integer">
+        select mfd.device_id as deviceFid
+        from meeting_face_device mfd
+        <where>
+            <if test="fid != null">
+                and mfd.face_id = #{fid}
+            </if>
+        </where>
+    </select>
+
+</mapper>

+ 23 - 0
service-eg/service-eg-biz/src/main/resources/mapper/eg/EgRecordMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.eg.mapper.EgRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.eg.domain.EgRecord">
+        <id column="id" property="id" />
+        <result column="user_name" property="userName" />
+        <result column="pass_time" property="passTime" />
+        <result column="eg_device_id" property="egDeviceId" />
+        <result column="pass_type" property="passType" />
+        <result column="face_base" property="faceBase" />
+        <result column="card_num" property="cardNum" />
+        <result column="pass_result" property="passResult" />
+        <result column="create_by" property="createBy" />
+        <result column="update_by" property="updateBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="dept_id" property="deptId" />
+        <result column="tenant_id" property="tenantId" />
+    </resultMap>
+
+</mapper>

+ 11 - 0
service-eg/service-eg-biz/src/main/resources/mapper/eg/MeetingFaceDeviceMapper.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.eg.mapper.MeetingFaceDeviceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.eg.domain.MeetingFaceDevice">
+        <id column="face_id" property="faceId" />
+        <result column="device_id" property="deviceId" />
+    </resultMap>
+
+</mapper>

+ 21 - 0
service-eg/service-eg-biz/src/main/resources/mapper/eg/MeetingFaceMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.eg.mapper.MeetingFaceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.eg.domain.MeetingFace">
+        <id column="fid" property="fid" />
+        <result column="face_base" property="faceBase" />
+        <result column="create_time" property="createTime" />
+        <result column="vef_num" property="vefNum" />
+        <result column="face_name" property="faceName" />
+        <result column="remark" property="remark" />
+        <result column="face_status" property="faceStatus" />
+        <result column="card_num" property="cardNum" />
+        <result column="bind_device" property="bindDevice" />
+        <result column="dept_id" property="deptId" />
+        <result column="tenant_id" property="tenantId" />
+        <result column="user_id" property="userId" />
+    </resultMap>
+
+</mapper>

+ 15 - 0
service-eg/service-eg-biz/src/main/resources/smart-doc.json

@@ -0,0 +1,15 @@
+{
+  "outPath":"./src/main/resources/doc",
+  "serverUrl": "http:10.23.39.1:8082/",
+  "isStrict": false,
+  "coverOld": true,
+  "allInOne": true,
+  "packageFilters": "com.usky.demo.controller.web",
+  "requestExample":"false",
+  "responseExample":"true",
+  "projectName": "安防项目",
+  "appKey": "20211216921084883495813120",
+  "appToken":"36bde2426ad546a5a50311bb747e7e61",
+  "secret": "N@Pd,KXAHki*BW3=zK.XPNykf!=CM79J",
+  "openUrl": "http://101.133.214.75:7700/api"
+}

+ 8 - 0
service-iot/service-iot-api/src/main/java/com/usky/iot/RemoteIotTaskService.java

@@ -3,8 +3,10 @@ package com.usky.iot;
 
 import com.usky.iot.factory.RemoteIotTaskFactory;
 import com.usky.iot.factory.RemotePmFactory;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 
 @FeignClient(contextId = "RemoteIotTaskService", value = "service-iot" , fallbackFactory = RemoteIotTaskFactory.class)
 public interface RemoteIotTaskService {
@@ -17,4 +19,10 @@ public interface RemoteIotTaskService {
 
     @GetMapping("/customInfoStatus")
     void customInfoStatus();
+
+    @GetMapping("/addDeviceInfo")
+    void addDeviceInfo(@RequestParam("productCode") String productCode, @RequestParam(value = "deviceUuid") String deviceUuid, @RequestParam(value = "deviceId") String deviceId, @RequestParam(value = "deviceName") String deviceName, @RequestParam(value = "installAddress") String installAddress, @RequestParam(value = "serviceStatus") Integer serviceStatus);
+
+    @GetMapping("/deleteDeviceInfo")
+    void deleteDeviceInfo(@RequestParam(value = "deviceUuid") String deviceUuid);
 }

+ 11 - 0
service-iot/service-iot-api/src/main/java/com/usky/iot/factory/RemoteIotTaskFactory.java

@@ -3,6 +3,7 @@ package com.usky.iot.factory;
 import com.usky.common.core.exception.FeignBadRequestException;
 import com.usky.iot.RemoteIotTaskService;
 import com.usky.iot.RemotePmService;
+import org.apache.ibatis.annotations.Param;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.cloud.openfeign.FallbackFactory;
@@ -40,6 +41,16 @@ public class RemoteIotTaskFactory implements FallbackFactory<RemoteIotTaskServic
                 throw new FeignBadRequestException(500,"定时同步客户信息状态异常"+throwable.getMessage());
             }
 
+            @Override
+            public void addDeviceInfo(String productCode, String deviceUuid, String deviceId, String deviceName, String installAddress, Integer serviceStatus) {
+                throw new FeignBadRequestException(500,"新增设备信息异常"+throwable.getMessage());
+            }
+
+            @Override
+            public void deleteDeviceInfo(String deviceUuid) {
+                throw new FeignBadRequestException(500,"删除设备信息异常"+throwable.getMessage());
+            }
+
         };
     }
 }

+ 30 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/api/ServiceIotTaskApi.java

@@ -1,9 +1,14 @@
 package com.usky.iot.controller.api;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.usky.iot.RemoteIotTaskService;
+import com.usky.iot.domain.DmpDeviceInfo;
 import com.usky.iot.service.BaseAlarmService;
 import com.usky.iot.service.CrmCustomInfoService;
+import com.usky.iot.service.DmpDeviceInfoService;
 import com.usky.iot.service.job.DmpDataOverviewJob;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.web.bind.annotation.RestController;
@@ -20,6 +25,9 @@ public class ServiceIotTaskApi implements RemoteIotTaskService {
     @Autowired
     private CrmCustomInfoService crmCustomInfoService;
 
+    @Autowired
+    private DmpDeviceInfoService dmpDeviceInfoService;
+
     @Override
     public void dataOverviewJobData () {
         dmpDataOverviewJob.execute();
@@ -34,4 +42,26 @@ public class ServiceIotTaskApi implements RemoteIotTaskService {
     public void customInfoStatus() {
         crmCustomInfoService.updateStatus();
     }
+
+    @Override
+    public void addDeviceInfo(String productCode, String deviceUuid, String deviceId, String deviceName, String installAddress, Integer serviceStatus){
+        DmpDeviceInfo dmpDeviceInfo = new DmpDeviceInfo();
+        dmpDeviceInfo.setProductCode(productCode);
+        dmpDeviceInfo.setDeviceUuid(deviceUuid);
+        dmpDeviceInfo.setDeviceId(deviceId);
+        dmpDeviceInfo.setDeviceName(deviceName);
+        dmpDeviceInfo.setInstallAddress(installAddress);
+        dmpDeviceInfo.setServiceStatus(serviceStatus);
+
+        dmpDeviceInfoService.add(dmpDeviceInfo);
+    }
+
+    @Override
+    public void deleteDeviceInfo(String deviceUuid){
+        LambdaQueryWrapper<DmpDeviceInfo> deviceQueryWrapper = Wrappers.lambdaQuery();
+        deviceQueryWrapper.eq(DmpDeviceInfo::getDeviceUuid,deviceUuid);
+        DmpDeviceInfo dmpDeviceInfo = dmpDeviceInfoService.getOne(deviceQueryWrapper);
+
+        dmpDeviceInfoService.remove(dmpDeviceInfo.getId());
+    }
 }

+ 2 - 2
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/DeviceHttpController.java

@@ -62,13 +62,13 @@ public class DeviceHttpController {
      */
     @GetMapping("/control")
     public ApiResult<Map<String,Object>> control(@RequestParam("productCode") String productCode,
-                                                 @RequestParam("deviceId") String deviceId,
+                                                 @RequestParam("deviceUuid") String deviceUuid,
                                                  @RequestParam("commandCode") String commandCode,
                                                  @RequestParam("commandValue") String commandValue,
                                                  @RequestParam(value = "domain",required = false) String domain,
                                                  @RequestParam(value = "userId",required = false) Long userId,
                                                  @RequestParam(value = "userName",required = false) String userName){
-        return ApiResult.success(dmpDeviceInfoService.control(productCode,deviceId,commandCode,commandValue,domain,userId,userName));
+        return ApiResult.success(dmpDeviceInfoService.control(productCode,deviceUuid,commandCode,commandValue,domain,userId,userName));
     }
 
 

+ 1 - 1
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/DmpDeviceInfoService.java

@@ -72,5 +72,5 @@ public interface DmpDeviceInfoService extends CrudService<DmpDeviceInfo> {
     List<DataAverageResponseVO> deviceDataAverage(DataAverageRequestVO requestVO);
     List<DataAverageExportVO> DataAverageExport(DataAverageRequestVO requestVO);
 
-    Map<String,Object> control(String productCode, String deviceId, String commandCode, String commandValue, String domain, Long userId, String userName);
+    Map<String,Object> control(String productCode, String deviceUuid, String commandCode, String commandValue, String domain, Long userId, String userName);
 }

+ 33 - 31
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/DmpDeviceInfoServiceImpl.java

@@ -82,7 +82,7 @@ public class DmpDeviceInfoServiceImpl extends AbstractCrudService<DmpDeviceInfoM
     private RemoteTransferService remoteTransferService;
 
     @Override
-    public Map<String,Object> control(String productCode, String deviceId, String commandCode, String commandValue, String domain, Long userId, String userName){
+    public Map<String,Object> control(String productCode, String deviceUuid, String commandCode, String commandValue, String domain, Long userId, String userName){
         Integer tenantId;
         long commandUserId;
         String commandUserName;
@@ -95,42 +95,40 @@ public class DmpDeviceInfoServiceImpl extends AbstractCrudService<DmpDeviceInfoM
             commandUserId = SecurityUtils.getUserId();
             commandUserName = SecurityUtils.getUsername();
         }
-
-        //人员设备权限校验,校验通过,可以下发命令控制设备
-        Integer fid = baseMapper.getMeetingFaceData(commandUserId);
-        if(fid == null){
-            throw new BusinessException("人脸卡号信息未注册");
-        }
-        Integer[] deviceFid = baseMapper.getMeetingFaceDeviceList(fid);
-        if(deviceFid.length == 0){
-            throw new BusinessException("人员未绑定设备,请检查");
-        }
-
-        LambdaQueryWrapper<DmpDeviceInfo> queryWrapper = Wrappers.lambdaQuery();
-        queryWrapper.select(DmpDeviceInfo::getId)
-                .eq(DmpDeviceInfo::getProductCode,productCode)
-                .eq(DmpDeviceInfo::getDeviceId,deviceId)
-                .eq(DmpDeviceInfo::getDeleteFlag,0);
-        DmpDeviceInfo one = this.getOne(queryWrapper);
-        if(one != null){
-            boolean exist = Arrays.asList(deviceFid).contains(one.getId());
-            if(!exist){
-                throw new BusinessException("暂无权限");
-            }
-        }else{
-            throw new BusinessException("设备未注册,请先注册");
-        }
+//
+//        //人员设备权限校验,校验通过,可以下发命令控制设备
+//        Integer fid = baseMapper.getMeetingFaceData(commandUserId);
+//        if(fid == null){
+//            throw new BusinessException("人脸卡号信息未注册");
+//        }
+//        Integer[] deviceFid = baseMapper.getMeetingFaceDeviceList(fid);
+//        if(deviceFid.length == 0){
+//            throw new BusinessException("人员未绑定设备,请检查");
+//        }
+//
+//        LambdaQueryWrapper<DmpDeviceInfo> queryWrapper = Wrappers.lambdaQuery();
+//        queryWrapper.select(DmpDeviceInfo::getId)
+//                .eq(DmpDeviceInfo::getDeviceId,deviceUuid)
+//                .eq(DmpDeviceInfo::getDeleteFlag,0);
+//        DmpDeviceInfo one = this.getOne(queryWrapper);
+//        if(one != null){
+//            boolean exist = Arrays.asList(deviceFid).contains(one.getId());
+//            if(!exist){
+//                throw new BusinessException("暂无权限");
+//            }
+//        }else{
+//            throw new BusinessException("设备未注册,请先注册");
+//        }
 
 
         Map<String,Object> map = new HashMap<>();
         map.put("method","control");
         Map<String,Object> map1 = new HashMap<>();
-        map1.put("deviceId",deviceId);
         map1.put("commandCode",commandCode);
         map1.put("commandValue",commandValue);
         map.put("params",map1);
 
-        return remoteTransferService.deviceControl(productCode,deviceId, JSON.toJSONString(map),tenantId,commandUserId,commandUserName);
+        return remoteTransferService.deviceControl(productCode,deviceUuid, JSON.toJSONString(map),tenantId,commandUserId,commandUserName);
     }
 
     @Override
@@ -145,8 +143,10 @@ public class DmpDeviceInfoServiceImpl extends AbstractCrudService<DmpDeviceInfoM
             dmpDeviceInfo.setCreatedBy(SecurityUtils.getUsername());
             dmpDeviceInfo.setCreatedTime(LocalDateTime.now());
             dmpDeviceInfo.setTenantId(SecurityUtils.getTenantId());
-            dmpDeviceInfo.setServiceStatus(1);
-            dmpDeviceInfo.setDeviceUuid(UUIDUtils.uuid());
+//            dmpDeviceInfo.setServiceStatus(1);
+            if(StringUtils.isBlank(dmpDeviceInfo.getDeviceUuid())){
+                dmpDeviceInfo.setDeviceUuid(UUIDUtils.uuid());
+            }
             this.save(dmpDeviceInfo);
 
             DmpDeviceStatus dmpDeviceStatus = new DmpDeviceStatus();
@@ -207,9 +207,10 @@ public class DmpDeviceInfoServiceImpl extends AbstractCrudService<DmpDeviceInfoM
         IPage<DmpDeviceInfo> page = new Page<>(pageCurrent,pageSize);
 
         if(diRequest.getDeviceStatus() != null){
-            if(StringUtils.isNotBlank(diRequest.getDeviceId()) || StringUtils.isNotBlank(diRequest.getDeviceName()) || diRequest.getProductId() != null || StringUtils.isNotBlank(diRequest.getProductCode()) || diRequest.getServiceStatus() != null){
+            if(StringUtils.isNotBlank(diRequest.getDeviceId()) || StringUtils.isNotBlank(diRequest.getDeviceUuid()) || StringUtils.isNotBlank(diRequest.getDeviceName()) || diRequest.getProductId() != null || StringUtils.isNotBlank(diRequest.getProductCode()) || diRequest.getServiceStatus() != null){
                 LambdaQueryWrapper<DmpDeviceInfo> queryWrapper = Wrappers.lambdaQuery();
                 queryWrapper.eq(StringUtils.isNotBlank(diRequest.getDeviceId()),DmpDeviceInfo::getDeviceId,diRequest.getDeviceId())
+                        .eq(StringUtils.isNotBlank(diRequest.getDeviceUuid()),DmpDeviceInfo::getDeviceUuid,diRequest.getDeviceUuid())
                         .like(StringUtils.isNotBlank(diRequest.getDeviceName()),DmpDeviceInfo::getDeviceName,diRequest.getDeviceName())
                         .eq(diRequest.getProductId() != null,DmpDeviceInfo::getProductId,diRequest.getProductId())
                         .like(StringUtils.isNotBlank(diRequest.getProductCode()),DmpDeviceInfo::getProductCode,diRequest.getProductCode())
@@ -319,6 +320,7 @@ public class DmpDeviceInfoServiceImpl extends AbstractCrudService<DmpDeviceInfoM
         }else{
             LambdaQueryWrapper<DmpDeviceInfo> queryWrapper = Wrappers.lambdaQuery();
             queryWrapper.eq(StringUtils.isNotBlank(diRequest.getDeviceId()),DmpDeviceInfo::getDeviceId,diRequest.getDeviceId())
+                    .eq(StringUtils.isNotBlank(diRequest.getDeviceUuid()),DmpDeviceInfo::getDeviceUuid,diRequest.getDeviceUuid())
                     .like(StringUtils.isNotBlank(diRequest.getDeviceName()),DmpDeviceInfo::getDeviceName,diRequest.getDeviceName())
                     .eq(diRequest.getProductId() != null,DmpDeviceInfo::getProductId,diRequest.getProductId())
                     .like(StringUtils.isNotBlank(diRequest.getProductCode()),DmpDeviceInfo::getProductCode,diRequest.getProductCode())

+ 5 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/DmpDeviceInfoRequest.java

@@ -51,4 +51,9 @@ public class DmpDeviceInfoRequest {
      */
     private String domain;
 
+    /**
+     * 设备Uuid
+     */
+    private String deviceUuid;
+
 }

+ 5 - 0
service-meeting/service-meeting-biz/pom.xml

@@ -22,6 +22,11 @@
             <artifactId>data-transfer-api</artifactId>
             <version>0.0.1</version>
         </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-iot-api</artifactId>
+            <version>0.0.1</version>
+        </dependency>
         <dependency>
             <groupId>com.usky</groupId>
             <artifactId>common-cloud-starter</artifactId>

+ 4 - 4
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/MybatisGenerator.java

@@ -42,10 +42,10 @@ public class MybatisGenerator {
         //2、数据源配置
         //修改数据源
         DataSourceConfig dsc = new DataSourceConfig();
-        dsc.setUrl("jdbc:mysql://172.16.120.165:3306/usky-cloud?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");
+        dsc.setUrl("jdbc:mysql://192.168.10.165:3306/usky-cloud?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");
         dsc.setDriverName("com.mysql.jdbc.Driver");
-        dsc.setUsername("usky");
-        dsc.setPassword("Yt#75Usky");
+        dsc.setUsername("root");
+        dsc.setPassword("yt123456");
         mpg.setDataSource(dsc);
 
         // 3、包配置
@@ -70,7 +70,7 @@ public class MybatisGenerator {
         // strategy.setTablePrefix("t_"); // 表名前缀
         strategy.setEntityLombokModel(true); //使用lombok
         //修改自己想要生成的表
-        strategy.setInclude("sys_dept","sys_role","sys_user","sys_user_role");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
+        strategy.setInclude("eg_device");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
         mpg.setStrategy(strategy);
 
         // 关闭默认 xml 生成,调整生成 至 根目录

+ 4 - 4
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/MeetingDeviceController.java

@@ -45,7 +45,7 @@ public class MeetingDeviceController {
      * @param meetingDevice
      * @return
      */
-    @Log(title = "新增-会议设备", businessType = BusinessType.INSERT)
+    @Log(title = "新增-会议设备", businessType = BusinessType.INSERT)
     @PostMapping
     public ApiResult<Void> add(@RequestBody MeetingDevice meetingDevice){
         meetingDeviceService.add(meetingDevice);
@@ -66,13 +66,13 @@ public class MeetingDeviceController {
 
     /**
      * 删除
-     * @param deviceId
+     * @param deviceUuid
      * @return
      */
     @Log(title = "删除-会议设备", businessType = BusinessType.DELETE)
     @DeleteMapping
-    public ApiResult<Void> remove(@RequestParam Long deviceId){
-        meetingDeviceService.remove(deviceId);
+    public ApiResult<Void> remove(@RequestParam Long deviceUuid){
+        meetingDeviceService.remove(deviceUuid);
         return ApiResult.success();
     }
 

+ 23 - 3
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/MeetingFaceController.java

@@ -2,12 +2,18 @@ package com.usky.meeting.controller.web;
 
 
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.bean.CommonPage;
+import com.usky.common.core.exception.BusinessException;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.meeting.annotation.FaceLog;
 import com.usky.meeting.domain.MeetingFace;
@@ -77,7 +83,7 @@ public class MeetingFaceController {
                 .eq("tenant_id", SecurityUtils.getTenantId()));
         if(page.getRecords().size() > 0){
             for (int i = 0; i < page.getRecords().size(); i++) {
-                if(Objects.nonNull(page.getRecords().get(i).getBindDevice())){
+                if(Objects.nonNull(page.getRecords().get(i).getBindDevice()) || StringUtils.isNotBlank(page.getRecords().get(i).getBindDevice())){
                     String[] deviceIdStr = page.getRecords().get(i).getBindDevice().split(",");
                     Integer[] deviceIds = Arrays.stream(deviceIdStr).map(Integer::parseInt).toArray(Integer[]::new);
                     List<DmpDeviceInfoVO> list = meetingFaceMapper.getDeviceInfo(Arrays.asList(deviceIds));
@@ -108,10 +114,21 @@ public class MeetingFaceController {
     @PostMapping("/save")
     @ApiOperation(value = "添加")
     public FaceResultVO save(@RequestBody MeetingFace face){
+        Long userId = face.getUserId();
+        LambdaQueryWrapper<MeetingFace> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(MeetingFace::getUserId,userId);
+        List<MeetingFace> list = faceService.list(queryWrapper);
+        if(CollectionUtils.isNotEmpty(list)){
+            throw new BusinessException("人员已绑定,请检查");
+        }
+
         face.setVefNum(0);
         face.setCreateTime(LocalDateTime.now());
         face.setTenantId(SecurityUtils.getTenantId());
-        String[] devicefids = face.getBindDevice().split(",");
+        String[] devicefids = new String[0];
+        if(Objects.nonNull(face.getBindDevice()) || StringUtils.isNotBlank(face.getBindDevice())){
+            devicefids = face.getBindDevice().split(",");
+        }
         faceService.save(face);
         if(devicefids.length > 0){
             for (int i = 0; i < devicefids.length; i++) {
@@ -126,7 +143,10 @@ public class MeetingFaceController {
     public FaceResultVO update(@RequestBody MeetingFace face){
         faceService.updateById(face);
         meetingInfoRepository.delMeetingFaceDevice(face.getFid());
-        String[] devicefids = face.getBindDevice().split(",");
+        String[] devicefids = new String[0];
+        if(Objects.nonNull(face.getBindDevice()) || StringUtils.isNotBlank(face.getBindDevice())){
+            devicefids = face.getBindDevice().split(",");
+        }
         if(devicefids.length > 0){
             for (int i = 0; i < devicefids.length; i++) {
                 meetingInfoRepository.insertMeetingFaceDevice(face.getFid(),Integer.parseInt(devicefids[i]));

+ 101 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/EgDevice.java

@@ -0,0 +1,101 @@
+package com.usky.meeting.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 门禁_设备信息表
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class EgDevice implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 设备uuid
+     */
+    private String deviceUuid;
+
+    /**
+     * 设备ID
+     */
+    private String deviceId;
+
+    /**
+     * 设备名称
+     */
+    private String deviceName;
+
+    /**
+     * 安装位置
+     */
+    private String installAddress;
+
+    /**
+     * 业务状态;1:未激活,2:已激活,3:禁用
+     */
+    private Integer serviceStatus;
+
+    /**
+     * IP
+     */
+    private String deviceIp;
+
+    /**
+     * 端口
+     */
+    private Integer devicePort;
+
+    /**
+     * 门禁号
+     */
+    private String egNumber;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 创建日期
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 组织机构ID
+     */
+    private Integer deptId;
+
+    /**
+     * 租户ID
+     */
+    private Integer tenantId;
+
+
+}

+ 21 - 3
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingDevice.java

@@ -2,6 +2,7 @@ package com.usky.meeting.domain;
 
 import java.time.LocalDateTime;
 import java.io.Serializable;
+import java.util.List;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -32,7 +33,7 @@ public class MeetingDevice implements Serializable {
     @Id
     @TableId
     @JsonFormat(shape = JsonFormat.Shape.STRING)
-    private Long deviceId;
+    private Long deviceUuid;
 
     /**
      * 设备名称
@@ -81,6 +82,11 @@ public class MeetingDevice implements Serializable {
      */
     private String remark;
 
+    /**
+     * 安装位置
+     */
+    private String installAddress;
+
     /**
      * 创建者
      */
@@ -112,11 +118,23 @@ public class MeetingDevice implements Serializable {
     private Integer tenantId;
 
     /**
-     * 会议室名称
+     * 门禁设备主键id
+     */
+    private Integer egDeviceId;
+
+    /**
+     * 会议室信息
+     */
+    @Transient
+    @TableField(exist = false)
+    private MeetingRoom meetingRoom;
+
+    /**
+     * 门禁设备信息
      */
     @Transient
     @TableField(exist = false)
-    private String roomName;
+    private EgDevice egDevice;
 
 
 }

+ 18 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/mapper/EgDeviceMapper.java

@@ -0,0 +1,18 @@
+package com.usky.meeting.mapper;
+
+import com.usky.meeting.domain.EgDevice;
+import com.usky.common.mybatis.core.CrudMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ * 门禁_设备信息表 Mapper 接口
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@Repository
+public interface EgDeviceMapper extends CrudMapper<EgDevice> {
+
+}

+ 2 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/mapper/MeetingFaceMapper.java

@@ -5,6 +5,7 @@ import com.usky.common.mybatis.core.CrudMapper;
 import com.usky.meeting.service.vo.DmpDeviceInfoVO;
 import io.swagger.models.auth.In;
 import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
 
 import java.util.List;
 
@@ -16,6 +17,7 @@ import java.util.List;
  * @author zyj
  * @since 2024-03-08
  */
+@Repository
 public interface MeetingFaceMapper extends CrudMapper<MeetingFace> {
     List<DmpDeviceInfoVO> getDeviceInfo(@Param("deviceIdList") List<Integer> deviceIdList);
 }

+ 87 - 20
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/MeetingDeviceServiceImpl.java

@@ -10,12 +10,17 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.usky.common.core.bean.CommonPage;
 import com.usky.common.core.exception.BusinessException;
+import com.usky.common.core.util.UUIDUtils;
 import com.usky.common.security.utils.SecurityUtils;
+import com.usky.iot.RemoteIotTaskService;
+import com.usky.meeting.domain.EgDevice;
 import com.usky.meeting.domain.MeetingDevice;
 import com.usky.meeting.domain.MeetingFloor;
 import com.usky.meeting.domain.MeetingRoom;
+import com.usky.meeting.mapper.EgDeviceMapper;
 import com.usky.meeting.mapper.MeetingDeviceMapper;
 import com.usky.meeting.mapper.MeetingRoomMapper;
+import com.usky.meeting.repository.MeetingRoomRepository;
 import com.usky.meeting.service.MeetingDeviceService;
 import com.usky.common.mybatis.core.AbstractCrudService;
 import com.usky.meeting.service.MeetingRoomService;
@@ -47,40 +52,100 @@ import java.util.stream.Collectors;
 public class MeetingDeviceServiceImpl extends AbstractCrudService<MeetingDeviceMapper, MeetingDevice> implements MeetingDeviceService {
     @Autowired
     private MeetingRoomMapper meetingRoomMapper;
+    @Autowired
+    private EgDeviceMapper egDeviceMapper;
+    @Autowired
+    private RemoteIotTaskService remoteIotTaskService;
+    @Autowired
+    private MeetingRoomRepository dmMeetingRoomRepository;
 
     @Override
     public CommonPage<MeetingDevice> meetingDeviceList(MeetingDeviceRequestVO requestVO){
         Integer current = requestVO.getCurrent();
         Integer size = requestVO.getSize();
         IPage<MeetingDevice> page = new Page<>(current,size);
-        LambdaQueryWrapper<MeetingDevice> queryWrapper = Wrappers.lambdaQuery();
-        queryWrapper.like(StringUtils.isNotBlank(requestVO.getDeviceName()),MeetingDevice::getDeviceName,requestVO.getDeviceName())
+        Integer tenantId ;
+
+        if(StringUtils.isNotBlank(requestVO.getDomain())){
+            tenantId = dmMeetingRoomRepository.getTenantIdByDomain(requestVO.getDomain());
+        }else{
+            tenantId = SecurityUtils.getTenantId();
+        }
+
+        //根据输入所属会议室名称刷选
+        List<Long> roomIdList = new ArrayList<>();
+        List<MeetingRoom> meetingRoomsList = null;
+        LambdaQueryWrapper<MeetingRoom> queryWrapper = Wrappers.lambdaQuery();
+        if(StringUtils.isNotBlank(requestVO.getRoomName())){
+            queryWrapper.like(MeetingRoom::getRoomName,requestVO.getRoomName()).eq(MeetingRoom::getTenantId,tenantId);
+            meetingRoomsList = meetingRoomMapper.selectList(queryWrapper);
+            if(CollectionUtils.isNotEmpty(meetingRoomsList)){
+                for (int i = 0; i < meetingRoomsList.size(); i++) {
+                    roomIdList.add(meetingRoomsList.get(i).getRoomId());
+                }
+            }
+        }else{
+            queryWrapper.eq(MeetingRoom::getTenantId,tenantId);
+            meetingRoomsList = meetingRoomMapper.selectList(queryWrapper);
+        }
+        //根据输入所属门禁设备名称刷选
+        List<Integer> egDeviceIdList = new ArrayList<>();
+        List<EgDevice> egDeviceList = null;
+        LambdaQueryWrapper<EgDevice> queryWrapper1 = Wrappers.lambdaQuery();
+        if(StringUtils.isNotBlank(requestVO.getEgDeviceName())){
+            queryWrapper1.like(EgDevice::getDeviceName,requestVO.getEgDeviceName()).eq(EgDevice::getTenantId,tenantId);
+            egDeviceList = egDeviceMapper.selectList(queryWrapper1);
+            if(CollectionUtils.isNotEmpty(egDeviceList)){
+                for (int i = 0; i < egDeviceList.size(); i++) {
+                    egDeviceIdList.add(egDeviceList.get(i).getId());
+                }
+            }
+        }else{
+            queryWrapper1.eq(EgDevice::getTenantId,tenantId);
+            egDeviceList = egDeviceMapper.selectList(queryWrapper1);
+        }
+
+        LambdaQueryWrapper<MeetingDevice> queryWrapper3 = Wrappers.lambdaQuery();
+        queryWrapper3.like(StringUtils.isNotBlank(requestVO.getDeviceName()),MeetingDevice::getDeviceName,requestVO.getDeviceName())
                 .like(StringUtils.isNotBlank(requestVO.getNameplate()),MeetingDevice::getNameplate,requestVO.getNameplate())
                 .like(StringUtils.isNotBlank(requestVO.getMaintainer()),MeetingDevice::getMaintainer,requestVO.getMaintainer())
                 .like(StringUtils.isNotBlank(requestVO.getContacts()),MeetingDevice::getContacts,requestVO.getContacts())
                 .like(StringUtils.isNotBlank(requestVO.getRemark()),MeetingDevice::getRemark,requestVO.getRemark())
-                .eq(MeetingDevice::getTenantId,SecurityUtils.getTenantId())
-                .orderByAsc(MeetingDevice::getDeviceId);
-        page = this.page(page,queryWrapper);
+                .like(requestVO.getRoomId() != null,MeetingDevice::getRoomId,requestVO.getRoomId())
+                .in(CollectionUtils.isNotEmpty(roomIdList),MeetingDevice::getRoomId,roomIdList)
+                .in(CollectionUtils.isNotEmpty(egDeviceIdList),MeetingDevice::getEgDeviceId,egDeviceIdList)
+                .eq(MeetingDevice::getTenantId,tenantId)
+                .orderByAsc(MeetingDevice::getDeviceUuid);
+        page = this.page(page,queryWrapper3);
         if(page.getRecords().size()>0){
-            List<Long> roomIdList = new ArrayList<>();
-            for (int i = 0; i < page.getRecords().size(); i++) {
-                roomIdList.add(Long.valueOf(page.getRecords().get(i).getRoomId()));
+
+            if(CollectionUtils.isNotEmpty(meetingRoomsList)){
+                for (int i = 0; i < page.getRecords().size(); i++) {
+                    if(Objects.nonNull(page.getRecords().get(i).getRoomId())){
+                        Long RId = Long.valueOf(page.getRecords().get(i).getRoomId());
+                        for (int j = 0; j < meetingRoomsList.size(); j++) {
+                            if(RId.equals(meetingRoomsList.get(j).getRoomId())){
+                                page.getRecords().get(i).setMeetingRoom(meetingRoomsList.get(j));
+                                break;
+                            }
+                        }
+                    }
+
+                }
             }
-            List<Long> list = roomIdList.stream().distinct().collect(Collectors.toList());
 
-            LambdaQueryWrapper<MeetingRoom> queryWrapper1 = Wrappers.lambdaQuery();
-            queryWrapper1.in(MeetingRoom::getRoomId,list).eq(MeetingRoom::getTenantId,SecurityUtils.getTenantId());
-            List<MeetingRoom> meetingRoomList = meetingRoomMapper.selectList(queryWrapper1);
-            if(CollectionUtils.isNotEmpty(meetingRoomList)){
+            if(CollectionUtils.isNotEmpty(egDeviceList)){
                 for (int i = 0; i < page.getRecords().size(); i++) {
-                    Long RId = Long.valueOf(page.getRecords().get(i).getRoomId());
-                    for (int j = 0; j < meetingRoomList.size(); j++) {
-                        if(RId.equals(meetingRoomList.get(j).getRoomId())){
-                            page.getRecords().get(i).setRoomName(meetingRoomList.get(j).getRoomName());
-                            break;
+                    if(Objects.nonNull(page.getRecords().get(i).getEgDeviceId())){
+                        Integer egDeviceId = page.getRecords().get(i).getEgDeviceId();
+                        for (int j = 0; j < egDeviceList.size(); j++) {
+                            if(egDeviceId.equals(egDeviceList.get(j).getId())){
+                                page.getRecords().get(i).setEgDevice(egDeviceList.get(j));
+                                break;
+                            }
                         }
                     }
+
                 }
             }
         }
@@ -100,6 +165,7 @@ public class MeetingDeviceServiceImpl extends AbstractCrudService<MeetingDeviceM
         meetingDevice.setTenantId(SecurityUtils.getTenantId());
         this.save(meetingDevice);
 
+        remoteIotTaskService.addDeviceInfo("505_USKY", meetingDevice.getDeviceUuid().toString(),"",meetingDevice.getDeviceName(),meetingDevice.getInstallAddress(),1);
     }
 
     @Override
@@ -119,14 +185,15 @@ public class MeetingDeviceServiceImpl extends AbstractCrudService<MeetingDeviceM
         Optional.ofNullable(meetingDevice).orElseThrow(() -> new BusinessException("该会议室设备不存在"));
         this.removeById(deviceId);
 
+        remoteIotTaskService.deleteDeviceInfo(deviceId.toString());
     }
 
     public boolean checkNameUnique(MeetingDevice meetingDevice){
-        Long deviceId = null == meetingDevice.getDeviceId()?-1:meetingDevice.getDeviceId();
+        Long deviceId = null == meetingDevice.getDeviceUuid()?-1:meetingDevice.getDeviceUuid();
         LambdaQueryWrapper<MeetingDevice> queryWrapper = Wrappers.lambdaQuery();
         queryWrapper.eq(MeetingDevice::getDeviceName,meetingDevice.getDeviceName())
                 .eq(MeetingDevice::getTenantId,SecurityUtils.getTenantId());
         MeetingDevice one = this.getOne(queryWrapper);
-        return null != one && !Objects.equals(one.getDeviceId(),deviceId);
+        return null != one && !Objects.equals(one.getDeviceUuid(),deviceId);
     }
 }

+ 25 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/vo/MeetingDeviceRequestVO.java

@@ -1,5 +1,8 @@
 package com.usky.meeting.service.vo;
 
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.ToStringSerializer;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 @Data
@@ -38,4 +41,26 @@ public class MeetingDeviceRequestVO {
      * 备注
      */
     private String remark;
+
+    /**
+     * 所属会议室room_Id
+     */
+    @JSONField(serializeUsing = ToStringSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long roomId;
+
+    /**
+     * 所属会议室名称
+     */
+    private String roomName;
+
+    /**
+     * 所属门禁设备名称
+     */
+    private String egDeviceName;
+
+    /**
+     * 域名
+     */
+    private String domain;
 }

+ 24 - 0
service-meeting/service-meeting-biz/src/main/resources/mapper/meeting/EgDeviceMapper.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.meeting.mapper.EgDeviceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.meeting.domain.EgDevice">
+        <id column="id" property="id" />
+        <result column="device_uuid" property="deviceUuid" />
+        <result column="device_id" property="deviceId" />
+        <result column="device_name" property="deviceName" />
+        <result column="install_address" property="installAddress" />
+        <result column="service_status" property="serviceStatus" />
+        <result column="device_ip" property="deviceIp" />
+        <result column="device_port" property="devicePort" />
+        <result column="eg_number" property="egNumber" />
+        <result column="create_by" property="createBy" />
+        <result column="update_by" property="updateBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="dept_id" property="deptId" />
+        <result column="tenant_id" property="tenantId" />
+    </resultMap>
+
+</mapper>

+ 2 - 1
service-meeting/service-meeting-biz/src/main/resources/mapper/meeting/MeetingDeviceMapper.xml

@@ -4,7 +4,7 @@
 
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.usky.meeting.domain.MeetingDevice">
-        <id column="device_id" property="deviceId" />
+        <id column="device_uuid" property="deviceUuid" />
         <result column="device_name" property="deviceName" />
         <result column="storage_id" property="storageId" />
         <result column="img_path" property="imgPath" />
@@ -13,6 +13,7 @@
         <result column="register_date" property="registerDate" />
         <result column="maintainer" property="maintainer" />
         <result column="contacts" property="contacts" />
+        <result column="install_address" property="installAddress" />
         <result column="remark" property="remark" />
         <result column="create_by" property="createBy" />
         <result column="update_by" property="updateBy" />