Browse Source

Merge branch 'server-165' of uskycloud/usky-modules into master

gez 1 year ago
parent
commit
ad0abfa961
87 changed files with 4239 additions and 315 deletions
  1. 3 1
      pom.xml
  2. 20 0
      service-agbox/pom.xml
  3. 27 0
      service-agbox/service-agbox-api/pom.xml
  4. 28 0
      service-agbox/service-agbox-api/src/main/java/com/usky/agbox/RemoteUserService.java
  5. 105 0
      service-agbox/service-agbox-api/src/main/java/com/usky/agbox/domain/SysUserVO.java
  6. 48 0
      service-agbox/service-agbox-api/src/main/java/com/usky/agbox/factory/RemoteUserFallbackFactory.java
  7. 89 0
      service-agbox/service-agbox-biz/pom.xml
  8. 45 0
      service-agbox/service-agbox-biz/src/main/java/com/usky/agbox/RuoYiSystemApplication.java
  9. 109 0
      service-agbox/service-agbox-biz/src/main/java/com/usky/agbox/controller/MybatisGeneratorUtils.java
  10. 65 0
      service-agbox/service-agbox-biz/src/main/java/com/usky/agbox/controller/web/patrolAgboxController.java
  11. 81 0
      service-agbox/service-agbox-biz/src/main/java/com/usky/agbox/service/job/patrolAgbox.java
  12. 137 0
      service-agbox/service-agbox-biz/src/main/java/com/usky/agbox/service/util/HttpClientUtils.java
  13. 34 0
      service-agbox/service-agbox-biz/src/main/java/com/usky/agbox/service/vo/EventVO.java
  14. 25 0
      service-agbox/service-agbox-biz/src/main/resources/bootstrap.yml
  15. 108 0
      service-agbox/service-agbox-biz/src/main/resources/doc/index.adoc
  16. 94 0
      service-agbox/service-agbox-biz/src/main/resources/logback.xml
  17. 15 0
      service-agbox/service-agbox-biz/src/main/resources/smart-doc.json
  18. 43 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/BaseAppInfoController.java
  19. 106 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/BaseAppInfo.java
  20. 16 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/mapper/BaseAppInfoMapper.java
  21. 22 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/BaseAppInfoService.java
  22. 62 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/BaseAppInfoServiceImpl.java
  23. 25 0
      service-iot/service-iot-biz/src/main/resources/mapper/iot/BaseAppInfoMapper.xml
  24. 20 0
      service-meeting/service-meeting-biz/pom.xml
  25. 1 1
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/MybatisGenerator.java
  26. 34 2
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/MeetingFileController.java
  27. 87 2
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/MeetingInfoController.java
  28. 41 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/MeetingRoomController.java
  29. 27 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/SignOnOutRequestVO.java
  30. 21 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/SysDeptController.java
  31. 21 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/SysRoleController.java
  32. 21 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/SysUserController.java
  33. 21 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/SysUserRoleController.java
  34. 20 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/TaskController.java
  35. 5 1
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingApprove.java
  36. 5 2
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingApproveUser.java
  37. 10 3
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingAttendee.java
  38. 5 2
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingDevice.java
  39. 2 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingFace.java
  40. 9 1
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingFile.java
  41. 46 12
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingInfo.java
  42. 22 5
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingRoom.java
  43. 101 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/SysDept.java
  44. 101 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/SysRole.java
  45. 143 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/SysUser.java
  46. 32 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/SysUserRole.java
  47. 2 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/mapper/MeetingFloorMapper.java
  48. 16 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/mapper/SysDeptMapper.java
  49. 16 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/mapper/SysRoleMapper.java
  50. 16 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/mapper/SysUserMapper.java
  51. 16 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/mapper/SysUserRoleMapper.java
  52. 117 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/repository/DmUserRepository.java
  53. 16 19
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/repository/MeetingDeviceRepository.java
  54. 65 59
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/repository/MeetingInfoRepository.java
  55. 20 8
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/repository/MeetingRoomRepository.java
  56. 196 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/repository/UserRepository.java
  57. 9 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/MeetingFileService.java
  58. 37 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/MeetingInfoService.java
  59. 8 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/MeetingRoomService.java
  60. 16 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/SysDeptService.java
  61. 16 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/SysRoleService.java
  62. 16 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/SysUserRoleService.java
  63. 16 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/SysUserService.java
  64. 133 125
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/dto/DmMeetingDto.java
  65. 58 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/dto/DmMeetingDtoV2.java
  66. 14 9
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/dto/DmMeetingRoomDto.java
  67. 5 5
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/MeetingFaceServiceImpl.java
  68. 48 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/MeetingFileServiceImpl.java
  69. 12 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/MeetingFloorServiceImpl.java
  70. 727 3
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/MeetingInfoServiceImpl.java
  71. 202 53
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/MeetingRoomServiceImpl.java
  72. 20 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/SysDeptServiceImpl.java
  73. 20 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/SysRoleServiceImpl.java
  74. 20 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/SysUserRoleServiceImpl.java
  75. 20 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/SysUserServiceImpl.java
  76. 26 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/vo/MeetingFileListVO.java
  77. 28 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/vo/MeetingFileRequestVO.java
  78. 45 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/vo/MeetingInfoRequestVO.java
  79. 2 2
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/vo/MeetingRoomRequestVO.java
  80. 22 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/vo/MeetingRoomReservationVO.java
  81. 45 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/vo/MyMeetingInfoRequestVO.java
  82. 1 0
      service-meeting/service-meeting-biz/src/main/resources/mapper/meeting/MeetingAttendeeMapper.xml
  83. 1 0
      service-meeting/service-meeting-biz/src/main/resources/mapper/meeting/MeetingFileMapper.xml
  84. 24 0
      service-meeting/service-meeting-biz/src/main/resources/mapper/meeting/SysDeptMapper.xml
  85. 24 0
      service-meeting/service-meeting-biz/src/main/resources/mapper/meeting/SysRoleMapper.xml
  86. 31 0
      service-meeting/service-meeting-biz/src/main/resources/mapper/meeting/SysUserMapper.xml
  87. 11 0
      service-meeting/service-meeting-biz/src/main/resources/mapper/meeting/SysUserRoleMapper.xml

+ 3 - 1
pom.xml

@@ -76,9 +76,11 @@
     <module>service-issue</module>
 
 
-
     <module>service-meeting</module>
 
+
+    <module>service-agbox</module>
+
   </modules>
           
   

+ 20 - 0
service-agbox/pom.xml

@@ -0,0 +1,20 @@
+<?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-agbox</artifactId>
+
+    <packaging>pom</packaging>
+    <version>0.0.1</version>
+
+    <modules>
+        <module>service-agbox-biz</module>
+        <module>service-agbox-api</module>
+    </modules>
+</project>

+ 27 - 0
service-agbox/service-agbox-api/pom.xml

@@ -0,0 +1,27 @@
+<?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-agbox</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>service-agbox-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>

+ 28 - 0
service-agbox/service-agbox-api/src/main/java/com/usky/agbox/RemoteUserService.java

@@ -0,0 +1,28 @@
+package com.usky.agbox;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.agbox.domain.SysUserVO;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+@FeignClient(contextId = "remoteUserService", value = "usky-demo")
+public interface RemoteUserService {
+
+
+
+    @GetMapping("/byUserName")
+    ApiResult<List<SysUserVO>> getByUserName(@RequestParam("userName") String userName);
+
+
+    @PostMapping("/byUserName")
+    ApiResult<List<SysUserVO>> add(@RequestBody SysUserVO sysUserVO);
+
+
+    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    ApiResult<String> upload(@RequestPart(value = "file") MultipartFile file);
+}

+ 105 - 0
service-agbox/service-agbox-api/src/main/java/com/usky/agbox/domain/SysUserVO.java

@@ -0,0 +1,105 @@
+package com.usky.agbox.domain;
+
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class SysUserVO {
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+
+    /**
+     * 用户账号
+     */
+    private String userName;
+
+    /**
+     * 用户昵称
+     */
+    private String nickName;
+
+    /**
+     * 用户类型(00系统用户)
+     */
+    private String userType;
+
+    /**
+     * 用户邮箱
+     */
+    private String email;
+
+    /**
+     * 手机号码
+     */
+    private String phonenumber;
+
+    /**
+     * 用户性别(0男 1女 2未知)
+     */
+    private String sex;
+
+    /**
+     * 头像地址
+     */
+    private String avatar;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 帐号状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    private String delFlag;
+
+    /**
+     * 最后登录IP
+     */
+    private String loginIp;
+
+    /**
+     * 最后登录时间
+     */
+    private LocalDateTime loginDate;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 48 - 0
service-agbox/service-agbox-api/src/main/java/com/usky/agbox/factory/RemoteUserFallbackFactory.java

@@ -0,0 +1,48 @@
+package com.usky.agbox.factory;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.exception.BusinessException;
+import com.usky.agbox.RemoteUserService;
+import com.usky.agbox.domain.SysUserVO;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+
+/**
+ * 用户服务降级处理
+ *
+ * @author ruoyi
+ */
+@Component
+public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserService>
+{
+    private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class);
+
+    @Override
+    public RemoteUserService create(Throwable throwable)
+    {
+        log.error("用户服务调用失败:{}", throwable.getMessage());
+        return new RemoteUserService() {
+            @Override
+            public ApiResult<List<SysUserVO>> getByUserName(String userName) {
+                throw new BusinessException(throwable.getMessage());
+            }
+
+            @Override
+            public ApiResult<List<SysUserVO>> add(SysUserVO sysUserVO) {
+                throw new BusinessException(throwable.getMessage());
+            }
+
+            @Override
+            public ApiResult<String> upload(MultipartFile file) {
+                throw new BusinessException(throwable.getMessage());
+            }
+        };
+    }
+}

+ 89 - 0
service-agbox/service-agbox-biz/pom.xml

@@ -0,0 +1,89 @@
+<?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-agbox</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>service-agbox-biz</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>common-cloud-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-spring-boot-starter</artifactId>
+            <version>4.1.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-core</artifactId>
+            <version>4.5.16</version>
+        </dependency>
+
+        <!--语音依赖-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-dyvmsapi</artifactId>
+            <version>1.2.2</version>
+        </dependency>
+
+        <!--短信依赖-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+            <version>1.1.0</version>
+        </dependency>
+
+        <!--MQTT依赖-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-integration</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.integration</groupId>
+            <artifactId>spring-integration-mqtt</artifactId>
+        </dependency>
+        <!--websocket依赖-->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-websocket</artifactId>
+            <version>5.2.8.RELEASE</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <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>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 45 - 0
service-agbox/service-agbox-biz/src/main/java/com/usky/agbox/RuoYiSystemApplication.java

@@ -0,0 +1,45 @@
+package com.usky.agbox;
+
+
+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.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.core.env.Environment;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * 系统模块
+ * 
+ * @author ruoyi
+ */
+
+
+@EnableFeignClients(basePackages = "com.usky")
+@MapperScan(value = "com.usky.agbox.mapper")
+@ComponentScan("com.usky")
+@SpringBootApplication
+public class RuoYiSystemApplication
+{
+    private static final Logger LOGGER = LoggerFactory.getLogger(RuoYiSystemApplication.class);
+
+    public static void main(String[] args) throws UnknownHostException {
+        ConfigurableApplicationContext application = SpringApplication.run(RuoYiSystemApplication.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" +
+                "----------------------------------------------------------");
+    }
+}

+ 109 - 0
service-agbox/service-agbox-biz/src/main/java/com/usky/agbox/controller/MybatisGeneratorUtils.java

@@ -0,0 +1,109 @@
+package com.usky.agbox.controller;//package com.usky.iot.controller;//package com.usky.dm.controller.web.business;
+// package com.usky.dm.controller.web;
+
+
+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;
+
+/**
+ * @author yq
+ * @date 2021/7/6 11:42
+ */
+public class MybatisGeneratorUtils {
+    public static void main(String[] args) {
+
+            shell("service-agbox","service-agbox-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("han"); //设置作者
+        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://172.16.120.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");
+        mpg.setDataSource(dsc);
+
+        // 3、包配置
+        PackageConfig pc = new PackageConfig();
+        pc.setParent("com.usky.agbox");
+        pc.setController("controller.web");
+        pc.setEntity("domain");
+        pc.setMapper("mapper");
+        pc.setService("service");
+        pc.setServiceImpl("service.impl");
+//        pc.setXml("mapper.demo");
+        //pc.setModuleName("test");
+        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("sys_user");  // 逆向工程使用的表   如果要生成多个,这里可以传入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/agbox" + "/"
+                        + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
+            }
+        });
+        cfg.setFileOutConfigList(focList);
+        mpg.setCfg(cfg);
+        tc.setXml(null);
+        mpg.setTemplate(tc);
+        //5、执行
+        mpg.execute();
+    }
+}

+ 65 - 0
service-agbox/service-agbox-biz/src/main/java/com/usky/agbox/controller/web/patrolAgboxController.java

@@ -0,0 +1,65 @@
+package com.usky.agbox.controller.web;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.JsonObject;
+import com.usky.agbox.service.job.patrolAgbox;
+import com.usky.agbox.service.vo.EventVO;
+import com.usky.common.core.bean.ApiResult;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author han
+ * @date 2024/03/22 16:20
+ */
+@RestController
+@RequestMapping("/patrolAgbox")
+public class patrolAgboxController {
+    /**
+     * 获取事件编码信息
+     * @return
+     */
+    @PostMapping("/getEventCode")
+    public ApiResult<JSONObject> getEventCode(){
+        return ApiResult.success(patrolAgbox.getEventCode());
+    }
+
+    /**
+     * 获取设备列表信息
+     * @return
+     */
+    @PostMapping("/getDeviceList")
+    public ApiResult<JSONObject> getDeviceList(){
+        return ApiResult.success(patrolAgbox.getDeviceList());
+    }
+
+    /**
+     * 添加事件信息
+     * @return
+     */
+    @PostMapping("/addEvent")
+    public ApiResult<JSONObject> addEvent(@RequestBody EventVO eventVO){
+        return ApiResult.success(patrolAgbox.addEvent(eventVO));
+    }
+
+    /**
+     * 更新心跳信息
+     * @return
+     */
+    @PostMapping("/updateHeart")
+    public ApiResult<JSONObject> updateHeart(@RequestBody EventVO eventVO){
+        return ApiResult.success(patrolAgbox.updateHeart(eventVO));
+    }
+
+    /**
+     * 获取事件信息
+     * @return
+     */
+    @PostMapping("/getEvent")
+    public ApiResult<JSONObject> getEvent(){
+        return ApiResult.success(patrolAgbox.getEvent());
+    }
+}

+ 81 - 0
service-agbox/service-agbox-biz/src/main/java/com/usky/agbox/service/job/patrolAgbox.java

@@ -0,0 +1,81 @@
+package com.usky.agbox.service.job;
+
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.JsonObject;
+import com.usky.agbox.service.util.HttpClientUtils;
+import com.usky.agbox.service.vo.EventVO;
+
+import java.util.HashMap;
+
+public class patrolAgbox {
+
+    private static String KEY = "44c2710b-f7ff-4487-a556-bfae08232a09";
+    private static String URL = "http://172.16.120.245/agbox/device/patrol";
+
+    /**
+     * 获取事件编码信息
+     * @return
+     */
+    public static JSONObject getEventCode() {
+        HashMap map = new HashMap();
+        map.put("key", KEY);
+        map.put("json", "{\"jsonrpc\":\"2.0\",\"method\":\"getPatrolEventCode\"}");
+        String resultString = HttpClientUtils.doPost(URL,map);
+        JSONObject resultVO = JSONObject.parseObject(resultString);
+        return resultVO;
+    }
+
+    /**
+     * 获取设备列表信息
+     * @return
+     */
+    public static JSONObject getDeviceList() {
+        HashMap map = new HashMap();
+        map.put("key", KEY);
+        map.put("json", "{\"jsonrpc\":\"2.0\",\"method\":\"getDeviceList\"}");
+        String resultString = HttpClientUtils.doPost(URL,map);
+        JSONObject resultVO = JSONObject.parseObject(resultString);
+        return resultVO;
+    }
+
+    /**
+     * 添加事件信息
+     * @return
+     */
+    public static JSONObject addEvent(EventVO eventVO) {
+        HashMap map = new HashMap();
+        map.put("key", KEY);
+        map.put("json", "{\"jsonrpc\":\"2.0\",\"method\":\"addEvent\",\"params\":{\"deviceId\":\""+eventVO.getDeviceId()+"\"," +
+                "\"triggerTime\":\""+eventVO.getTriggerTime()+"\",\"eventCode\":"+eventVO.getEventCode()+",\"name" +
+                "\":\""+eventVO.getName()+"\",\"certifiedNo\":\""+eventVO.getCertifiedNo()+"\"}}");
+        String resultString = HttpClientUtils.doPost(URL,map);
+        JSONObject resultVO = JSONObject.parseObject(resultString);
+        return resultVO;
+    }
+
+    /**
+     * 更新心跳信息
+     * @return
+     */
+    public static JSONObject updateHeart(EventVO eventVO) {
+        HashMap map = new HashMap();
+        map.put("key", KEY);
+        map.put("json", "{\"jsonrpc\":\"2.0\",\"method\":\"updateHeart\",\"params\":{\"deviceId\":\""+eventVO.getDeviceId()+"\"}}");
+        String resultString = HttpClientUtils.doPost(URL,map);
+        JSONObject resultVO = JSONObject.parseObject(resultString);
+        return resultVO;
+    }
+
+    /**
+     * 获取事件信息
+     * @return
+     */
+    public static JSONObject getEvent() {
+        HashMap map = new HashMap();
+        map.put("key", KEY);
+        map.put("json", "{\"jsonrpc\":\"2.0\",\"method\":\"getEvent\",\"params\":{\"eventId\":\"3af67e73-c393-42da-ab4c-96ad5dfb946d\"}}");
+        String resultString = HttpClientUtils.doPost(URL,map);
+        JSONObject resultVO = JSONObject.parseObject(resultString);
+        return resultVO;
+    }
+}

+ 137 - 0
service-agbox/service-agbox-biz/src/main/java/com/usky/agbox/service/util/HttpClientUtils.java

@@ -0,0 +1,137 @@
+package com.usky.agbox.service.util;
+
+import org.apache.http.NameValuePair;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ 1. 跨域请求工具类
+ */
+public class HttpClientUtils {
+
+    public static String doGet(String url, Map<String, String> param) {
+
+        // 创建Httpclient对象
+        CloseableHttpClient httpclient = HttpClients.createDefault();
+
+        String resultString = "";
+        CloseableHttpResponse response = null;
+        try {
+            // 创建uri
+            URIBuilder builder = new URIBuilder(url);
+            if (param != null) {
+                for (String key : param.keySet()) {
+                    builder.addParameter(key, param.get(key));
+                }
+            }
+            URI uri = builder.build();
+
+            // 创建http GET请求
+            HttpGet httpGet = new HttpGet(uri);
+
+            // 执行请求
+            response = httpclient.execute(httpGet);
+            // 判断返回状态是否为200
+            if (response.getStatusLine().getStatusCode() == 200) {
+                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (response != null) {
+                    response.close();
+                }
+                httpclient.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return resultString;
+    }
+
+    public static String doGet(String url) {
+        return doGet(url, null);
+    }
+
+    public static String doPost(String url, Map<String, String> param) {
+        // 创建Httpclient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String resultString = "";
+        try {
+            // 创建Http Post请求
+            HttpPost httpPost = new HttpPost(url);
+            httpPost.setHeader("Content-Type", "charset=utf-8");
+            // 创建参数列表
+            if (param != null) {
+                List<NameValuePair> paramList = new ArrayList<>();
+                for (String key : param.keySet()) {
+                    paramList.add(new BasicNameValuePair(key, param.get(key)));
+                }
+                // 模拟表单
+                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
+                httpPost.setEntity(entity);
+            }
+            // 执行http请求
+            response = httpClient.execute(httpPost);
+            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                response.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return resultString;
+    }
+
+    public static String doPost(String url) {
+        return doPost(url, null);
+    }
+
+    public static String doPostJson(String url, String json) {
+        // 创建Httpclient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String resultString = "";
+        try {
+            // 创建Http Post请求
+            HttpPost httpPost = new HttpPost(url);
+            // 创建请求内容
+            StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
+            httpPost.setEntity(entity);
+            // 执行http请求
+            response = httpClient.execute(httpPost);
+            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                response.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return resultString;
+    }
+}

+ 34 - 0
service-agbox/service-agbox-biz/src/main/java/com/usky/agbox/service/vo/EventVO.java

@@ -0,0 +1,34 @@
+package com.usky.agbox.service.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class EventVO {
+    /**
+     * 设备ID
+     */
+    private String deviceId;
+
+    /**
+     * 事件时间
+     */
+    private String triggerTime;
+
+    /**
+     * 事件编码
+     */
+    private Integer eventCode;
+
+    /**
+     * 人员姓名
+     */
+    private String name;
+
+    /**
+     * 证件编号
+     */
+    private String certifiedNo;
+
+}

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

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

+ 108 - 0
service-agbox/service-agbox-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;
+

+ 94 - 0
service-agbox/service-agbox-biz/src/main/resources/logback.xml

@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!-- 日志存放路径 -->
+    <property name="log.path" value="/var/log/uskycloud/service-alarm" />
+    <!-- 日志输出格式 -->
+    <property name="log.pattern" value="%d{MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{26}:%line: %msg%n" />
+    <!--    	<property name="log.pattern" value="%gray(%d{MM-dd HH:mm:ss.SSS}) %highlight(%-5level) &#45;&#45; [%gray(%thread)] %cyan(%logger{26}:%line): %msg%n" />-->
+
+
+    <property name="SQL_PACKAGE" value="com.usky.alarm.mapper"/>
+
+    <!-- 控制台输出 -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="file_sql" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/sql.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/sql.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>3</maxHistory>
+        </rollingPolicy>
+        <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>3</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" />-->
+
+    <logger name="${SQL_PACKAGE}" additivity="false" level="debug">
+        <appender-ref ref="console"/>
+        <appender-ref ref="file_sql"/>
+    </logger>
+
+    <!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="file_info" />
+        <appender-ref ref="file_error" />
+        <appender-ref ref="console" />
+    </root>
+</configuration>

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

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

+ 43 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/BaseAppInfoController.java

@@ -0,0 +1,43 @@
+package com.usky.iot.controller.web;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.iot.domain.BaseAlarmType;
+import com.usky.iot.domain.BaseAppInfo;
+import com.usky.iot.service.BaseAlarmTypeService;
+import com.usky.iot.service.BaseAppInfoService;
+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.stereotype.Controller;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * APP用户心跳信息 前端控制器
+ * </p>
+ *
+ * @author han
+ * @since 2024-03-29
+ */
+@RestController
+@RequestMapping("/baseAppInfo")
+public class BaseAppInfoController {
+    @Autowired
+    private BaseAppInfoService baseAppInfoService;
+
+    /**
+     * 新增
+     * @param baseAppInfo
+     * @return
+     */
+    @PostMapping("add")
+    public ApiResult<Void> add(@RequestBody BaseAppInfo baseAppInfo){
+        baseAppInfoService.add(baseAppInfo);
+        return ApiResult.success();
+    }
+
+}
+

+ 106 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/BaseAppInfo.java

@@ -0,0 +1,106 @@
+package com.usky.iot.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>
+ * APP用户心跳信息
+ * </p>
+ *
+ * @author han
+ * @since 2024-03-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class BaseAppInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 设备ID
+     */
+    private String deviceId;
+
+    /**
+     * 用户账号
+     */
+    private String userName;
+
+    /**
+     * 设备型号
+     */
+    private String deviceModel;
+
+    /**
+     * 访问IP
+     */
+    private String accessIp;
+
+    /**
+     * 网络类型
+     */
+    private String networkType;
+
+    /**
+     * 网络服务商
+     */
+    private String networkService;
+
+    /**
+     * 操作系统
+     */
+    private String operateSystem;
+
+    /**
+     * 经度
+     */
+    private String longitude;
+
+    /**
+     * 纬度
+     */
+    private String latitude;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 更新人
+     */
+    private String updateBy;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * 组织机构ID
+     */
+    private Integer deptId;
+
+    /**
+     * 租户ID
+     */
+    private Integer tenantId;
+
+
+}

+ 16 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/mapper/BaseAppInfoMapper.java

@@ -0,0 +1,16 @@
+package com.usky.iot.mapper;
+
+import com.usky.iot.domain.BaseAppInfo;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * APP用户心跳信息 Mapper 接口
+ * </p>
+ *
+ * @author han
+ * @since 2024-03-29
+ */
+public interface BaseAppInfoMapper extends CrudMapper<BaseAppInfo> {
+
+}

+ 22 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/BaseAppInfoService.java

@@ -0,0 +1,22 @@
+package com.usky.iot.service;
+
+import com.usky.iot.domain.BaseAlarmType;
+import com.usky.iot.domain.BaseAppInfo;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ * APP用户心跳信息 服务类
+ * </p>
+ *
+ * @author han
+ * @since 2024-03-29
+ */
+public interface BaseAppInfoService extends CrudService<BaseAppInfo> {
+    /**
+     * 新增
+     * @param baseAppInfo
+     * @return
+     */
+    void add(BaseAppInfo baseAppInfo);
+}

+ 62 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/BaseAppInfoServiceImpl.java

@@ -0,0 +1,62 @@
+package com.usky.iot.service.impl;
+
+import com.usky.common.core.exception.BusinessException;
+import com.usky.common.security.utils.SecurityUtils;
+import com.usky.iot.domain.BaseAlarmType;
+import com.usky.iot.domain.BaseAppInfo;
+import com.usky.iot.mapper.BaseAppInfoMapper;
+import com.usky.iot.service.BaseAppInfoService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * APP用户心跳信息 服务实现类
+ * </p>
+ *
+ * @author han
+ * @since 2024-03-29
+ */
+@Service
+public class BaseAppInfoServiceImpl extends AbstractCrudService<BaseAppInfoMapper, BaseAppInfo> implements BaseAppInfoService {
+
+    public String getIpAddress(HttpServletRequest request) {
+        String ip = request.getHeader("X-Forwarded-For");
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddr();
+        }
+        return ip;
+    }
+
+    public static HttpServletRequest getHttpServletRequest() {
+        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
+        if(requestAttributes == null){
+            return null;
+        }
+
+        return ((ServletRequestAttributes) requestAttributes).getRequest();
+    }
+
+    @Override
+    public void add(BaseAppInfo baseAppInfo){
+        HttpServletRequest request = getHttpServletRequest();
+        String accessIp = getIpAddress(request);
+        baseAppInfo.setAccessIp(accessIp);
+        baseAppInfo.setCreateBy(SecurityUtils.getUsername());
+        baseAppInfo.setCreateTime(LocalDateTime.now());
+        baseAppInfo.setTenantId(SecurityUtils.getTenantId());
+        this.save(baseAppInfo);
+    }
+}

+ 25 - 0
service-iot/service-iot-biz/src/main/resources/mapper/iot/BaseAppInfoMapper.xml

@@ -0,0 +1,25 @@
+<?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.iot.mapper.BaseAppInfoMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.iot.domain.BaseAppInfo">
+        <id column="id" property="id" />
+        <result column="device_id" property="deviceId" />
+        <result column="user_name" property="userName" />
+        <result column="device_model" property="deviceModel" />
+        <result column="access_ip" property="accessIp" />
+        <result column="network_type" property="networkType" />
+        <result column="network_service" property="networkService" />
+        <result column="operate_system" property="operateSystem" />
+        <result column="longitude" property="longitude" />
+        <result column="latitude" property="latitude" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="create_by" property="createBy" />
+        <result column="dept_id" property="deptId" />
+        <result column="tenant_id" property="tenantId" />
+    </resultMap>
+
+</mapper>

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

@@ -27,6 +27,26 @@
             <artifactId>pagehelper-spring-boot-starter</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-core</artifactId>
+            <version>4.5.16</version>
+        </dependency>
+
+        <!--语音依赖-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-dyvmsapi</artifactId>
+            <version>1.2.2</version>
+        </dependency>
+
+        <!--短信依赖-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+            <version>1.1.0</version>
+        </dependency>
+
         <dependency>
             <groupId>com.usky</groupId>
             <artifactId>ruoyi-common-swagger</artifactId>

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

@@ -70,7 +70,7 @@ public class MybatisGenerator {
         // strategy.setTablePrefix("t_"); // 表名前缀
         strategy.setEntityLombokModel(true); //使用lombok
         //修改自己想要生成的表
-        strategy.setInclude("meeting_approve","meeting_approve_user","meeting_attendee","meeting_device","meeting_face","meeting_face_vef_log","meeting_file","meeting_floor","meeting_info","meeting_room");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
+        strategy.setInclude("sys_dept","sys_role","sys_user","sys_user_role");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
         mpg.setStrategy(strategy);
 
         // 关闭默认 xml 生成,调整生成 至 根目录

+ 34 - 2
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/MeetingFileController.java

@@ -1,10 +1,19 @@
 package com.usky.meeting.controller.web;
 
 
-import org.springframework.web.bind.annotation.RequestMapping;
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.meeting.domain.MeetingFile;
+import com.usky.meeting.service.MeetingFileService;
+import com.usky.meeting.service.vo.MeetingFileListVO;
+import com.usky.meeting.service.vo.MeetingFileRequestVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
 
 import org.springframework.stereotype.Controller;
 
+import java.util.List;
+
 /**
  * <p>
  * 会议文件 前端控制器
@@ -13,9 +22,32 @@ import org.springframework.stereotype.Controller;
  * @author zyj
  * @since 2024-03-08
  */
-@Controller
+@RestController
 @RequestMapping("/meetingFile")
 public class MeetingFileController {
+    @Autowired
+    private MeetingFileService meetingFileService;
+
+    /**
+     * 添加会议文件
+     * @param requestVO
+     * @return
+     */
+    @PostMapping("insertMeetingFile")
+    public ApiResult<Void> insertMeetingFile(@RequestBody List<MeetingFileRequestVO> requestVOList){
+        meetingFileService.insertMeetingFile(requestVOList);
+        return ApiResult.success();
+    }
+
+    /**
+     * 查询会议文件
+     * @param meetingFileListVO
+     * @return
+     */
+    @PostMapping("meetingFileList")
+    public ApiResult<CommonPage<MeetingFile>> meetingFileList(@RequestBody MeetingFileListVO meetingFileListVO){
+        return ApiResult.success(meetingFileService.meetingFileList(meetingFileListVO));
+    }
 
 }
 

+ 87 - 2
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/MeetingInfoController.java

@@ -1,10 +1,23 @@
 package com.usky.meeting.controller.web;
 
 
-import org.springframework.web.bind.annotation.RequestMapping;
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.security.annotation.InnerAuth;
+import com.usky.meeting.domain.MeetingInfo;
+import com.usky.meeting.service.MeetingInfoService;
+import com.usky.meeting.service.dto.DmMeetingDto;
+import com.usky.meeting.service.dto.DmMeetingDtoV2;
+import com.usky.meeting.service.vo.MeetingInfoRequestVO;
+import com.usky.meeting.service.vo.MyMeetingInfoRequestVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -17,6 +30,78 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping("/meetingInfo")
 public class MeetingInfoController {
+    @Autowired
+    private MeetingInfoService meetingInfoService;
+
+    /**
+     * 新增会议
+     * @param resources
+     * @return
+     */
+    @PostMapping("add")
+    public ApiResult<DmMeetingDto> add(@Validated @RequestBody DmMeetingDto resources){
+        return ApiResult.success(meetingInfoService.add(resources));
+    }
+
+    /**
+     * 查询会议记录
+     * @param requestVO
+     * @return
+     */
+    @PostMapping("meetingInfoList")
+    public ApiResult<CommonPage<MeetingInfo>> meetingInfoList(@RequestBody MeetingInfoRequestVO requestVO){
+        return ApiResult.success(meetingInfoService.meetingInfoList(requestVO));
+    }
+
+    /**
+     * 取消会议预约申请
+     * @param meetingId
+     * @return
+     */
+    @PostMapping("cancel")
+    public ApiResult<Void> cancel(@RequestParam Long meetingId){
+        meetingInfoService.cancel(meetingId);
+        return ApiResult.success();
+    }
+
+    /**
+     * 我的会议列表
+     * @param requestVO
+     * @return
+     */
+    @PostMapping("myMeetingList")
+    public ApiResult<CommonPage<MeetingInfo>> myMeetingList(@RequestBody MyMeetingInfoRequestVO requestVO){
+        return ApiResult.success(meetingInfoService.myMeetingList(requestVO));
+    }
+
+    /**
+     * 查询会议签到信息
+     * @param meetingId
+     * @return
+     */
+    @GetMapping("meetingSignList")
+    public ApiResult<List<Map<String,Object>>> meetingSignList(@RequestParam(value = "meetingId") Long meetingId){
+        return ApiResult.success(meetingInfoService.meetingSignList(meetingId));
+    }
+
+    /**
+     * 人员签到/人员签退
+     * @param requestVO
+     * @return
+     */
+    @PostMapping("signOnOut")
+    public ApiResult<Void> signOnOut(@RequestBody SignOnOutRequestVO requestVO){
+        meetingInfoService.signOnOut(requestVO);
+        return ApiResult.success();
+    }
+
+
 
 }
 
+
+
+
+
+
+

+ 41 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/MeetingRoomController.java

@@ -4,12 +4,16 @@ package com.usky.meeting.controller.web;
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.bean.CommonPage;
 import com.usky.meeting.domain.MeetingRoom;
+import com.usky.meeting.repository.MeetingDeviceRepository;
 import com.usky.meeting.service.MeetingRoomService;
+import com.usky.meeting.service.dto.DmMeetingRoomDto;
 import com.usky.meeting.service.vo.MeetingRoomRequestVO;
+import com.usky.meeting.service.vo.MeetingRoomReservationVO;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.text.ParseException;
 import java.util.List;
 import java.util.Map;
 
@@ -103,5 +107,42 @@ public class MeetingRoomController {
     public ApiResult<Map<String,Object>> attendee(Long meetingId, Long userId, String userName){
         return ApiResult.success(meetingRoomService.attendee(meetingId,userId,userName));
     }
+
+    /**
+     * 会议室预约情况列表
+     * @param reservationVO
+     * @return
+     */
+    @PostMapping("getMeetingRoomReservationList")
+    public ApiResult<List<DmMeetingRoomDto>> getMeetingRoomReservationList(@RequestBody MeetingRoomReservationVO reservationVO)  throws ParseException {
+        return ApiResult.success(meetingRoomService.getMeetingRoomReservationList(reservationVO));
+
+    }
+
+    /**
+     * 会议室详情
+     * @param roomId
+     * @return
+     */
+    @GetMapping("meetingRoomDetails")
+    public ApiResult<MeetingRoom> meetingRoomDetails(@RequestParam Long roomId){
+        return ApiResult.success(meetingRoomService.meetingRoomDetails(roomId));
+    }
 }
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 27 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/SignOnOutRequestVO.java

@@ -0,0 +1,27 @@
+package com.usky.meeting.controller.web;
+
+import lombok.Data;
+
+@Data
+public class SignOnOutRequestVO {
+    /**
+     * 会议Id
+     */
+    private Long meetingId;
+
+    /**
+     * 参会人Id
+     */
+    private Long userId;
+
+    /**
+     * 签到签退类别(0.签到 1.签退)
+     */
+    private Integer mothodType;
+
+    /**
+     * 签到签退方式(0.人工 1.人脸)
+     */
+    private Integer signType;
+
+}

+ 21 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/SysDeptController.java

@@ -0,0 +1,21 @@
+package com.usky.meeting.controller.web;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ * 部门表 前端控制器
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-18
+ */
+@Controller
+@RequestMapping("/sysDept")
+public class SysDeptController {
+
+}
+

+ 21 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/SysRoleController.java

@@ -0,0 +1,21 @@
+package com.usky.meeting.controller.web;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ * 角色信息表 前端控制器
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-18
+ */
+@Controller
+@RequestMapping("/sysRole")
+public class SysRoleController {
+
+}
+

+ 21 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/SysUserController.java

@@ -0,0 +1,21 @@
+package com.usky.meeting.controller.web;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ * 用户信息表 前端控制器
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-18
+ */
+@Controller
+@RequestMapping("/sysUser")
+public class SysUserController {
+
+}
+

+ 21 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/SysUserRoleController.java

@@ -0,0 +1,21 @@
+package com.usky.meeting.controller.web;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ * 用户和角色关联表 前端控制器
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-18
+ */
+@Controller
+@RequestMapping("/sysUserRole")
+public class SysUserRoleController {
+
+}
+

+ 20 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/TaskController.java

@@ -0,0 +1,20 @@
+package com.usky.meeting.controller.web;
+
+import com.usky.meeting.service.MeetingInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+@EnableScheduling
+@Component
+public class TaskController {
+    @Autowired
+    private MeetingInfoService meetingInfoService;
+
+    @Scheduled(cron = "0 1,31 * * * ? ") //每小时第1分钟和第31分钟各执行一次
+    public void task(){
+        System.out.println(Thread.currentThread().getName()+"定时任务执行中");
+        meetingInfoService.updateMeetingInfoStatus();
+    }
+}

+ 5 - 1
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingApprove.java

@@ -2,6 +2,9 @@ package com.usky.meeting.domain;
 
 import java.time.LocalDateTime;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.squareup.moshi.Json;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -24,6 +27,7 @@ public class MeetingApprove implements Serializable {
     /**
      * 会议室预约id
      */
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
     private Long meetingId;
 
     /**
@@ -34,7 +38,7 @@ public class MeetingApprove implements Serializable {
     /**
      * 审批人
      */
-    private Long approveUserId;
+    private String approveUserId;
 
     /**
      * 审批结果

+ 5 - 2
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingApproveUser.java

@@ -3,6 +3,8 @@ package com.usky.meeting.domain;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -21,17 +23,18 @@ public class MeetingApproveUser implements Serializable {
     private static final long serialVersionUID = 1L;
 
     @TableId(value = "id", type = IdType.AUTO)
-    private Long id;
+    private Integer id;
 
     /**
      * 会议id
      */
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
     private Long meetingId;
 
     /**
      * 审批用户id
      */
-    private String dmUserId;
+    private Long dmUserId;
 
     /**
      * 组织机构ID

+ 10 - 3
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingAttendee.java

@@ -6,6 +6,7 @@ import java.time.LocalDateTime;
 import java.io.Serializable;
 
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -35,6 +36,7 @@ public class MeetingAttendee implements Serializable {
     /**
      * 会议id
      */
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
     private Long meetingId;
 
     /**
@@ -45,7 +47,7 @@ public class MeetingAttendee implements Serializable {
     /**
      * 是否签到(0-否 1-是)
      */
-    private Long isSign;
+    private Integer isSign;
 
     /**
      * 签到时间
@@ -55,7 +57,7 @@ public class MeetingAttendee implements Serializable {
     /**
      * 是否签退(0-否 1-是)
      */
-    private Long isSignOut;
+    private Integer isSignOut;
 
     /**
      * 签退时间
@@ -65,7 +67,7 @@ public class MeetingAttendee implements Serializable {
     /**
      * 签到方式(0.人工签到 1.人脸签到)
      */
-    private Long signType;
+    private Integer signType;
 
     /**
      * 组织机构ID
@@ -77,5 +79,10 @@ public class MeetingAttendee implements Serializable {
      */
     private Integer tenantId;
 
+    /**
+     * 签退方式(0.人工签退 1.人脸签退)
+     */
+    private Integer signOutType;
+
 
 }

+ 5 - 2
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingDevice.java

@@ -12,6 +12,7 @@ import lombok.EqualsAndHashCode;
 
 import javax.persistence.Entity;
 import javax.persistence.Id;
+import javax.persistence.Transient;
 
 /**
  * <p>
@@ -23,7 +24,6 @@ import javax.persistence.Id;
  */
 @Data
 @Entity
-@TableName("meeting_device")
 @EqualsAndHashCode(callSuper = false)
 public class MeetingDevice implements Serializable {
 
@@ -42,6 +42,7 @@ public class MeetingDevice implements Serializable {
     /**
      * 文件存储id(tool_local_storage)
      */
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
     private Long storageId;
 
     /**
@@ -57,7 +58,8 @@ public class MeetingDevice implements Serializable {
     /**
      * 所属会议室
      */
-    private String roomId;
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long roomId;
 
     /**
      * 登记时间
@@ -112,6 +114,7 @@ public class MeetingDevice implements Serializable {
     /**
      * 会议室名称
      */
+    @Transient
     @TableField(exist = false)
     private String roomName;
 

+ 2 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingFace.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.time.LocalDateTime;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 

+ 9 - 1
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingFile.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.time.LocalDateTime;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -27,11 +29,13 @@ public class MeetingFile implements Serializable {
     /**
      * 会议id
      */
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
     private Long meetingId;
 
     /**
      * 文件存储id(tool_local_storage)
      */
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
     private Long storageId;
 
     /**
@@ -42,7 +46,7 @@ public class MeetingFile implements Serializable {
     /**
      * 文件类型(0-会议所需文件,1-会议记录文件,2-高层会议文件)
      */
-    private Long fileType;
+    private Integer fileType;
 
     /**
      * 上传用户(dm_user)
@@ -64,5 +68,9 @@ public class MeetingFile implements Serializable {
      */
     private Integer tenantId;
 
+    /**
+     * 文件名称
+     */
+    private String fileName;
 
 }

+ 46 - 12
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingInfo.java

@@ -2,11 +2,21 @@ package com.usky.meeting.domain;
 
 import java.time.LocalDateTime;
 import java.io.Serializable;
+import java.util.List;
+import java.util.Set;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.usky.meeting.service.dto.DmMeetingRoomDto;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
 
-import javax.persistence.Entity;
-import javax.persistence.Id;
+import javax.persistence.*;
+import javax.xml.bind.annotation.XmlType;
 
 /**
  * <p>
@@ -24,6 +34,8 @@ public class MeetingInfo implements Serializable {
     private static final long serialVersionUID = 1L;
 
     @Id
+    @TableId
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
     private Long meetingId;
 
     /**
@@ -31,9 +43,17 @@ public class MeetingInfo implements Serializable {
      */
     private String meetingName;
 
+    /**
+     * 会议室房间
+     */
+    @Transient
+    @TableField(exist = false)
+    private MeetingRoom roomInfo;
+
     /**
      * 会议室id
      */
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
     private Long roomId;
 
     /**
@@ -61,6 +81,20 @@ public class MeetingInfo implements Serializable {
      */
     private String initiatorId;
 
+    /**
+     * 发起人信息
+     */
+    @Transient
+    @TableField(exist = false)
+    private SysUser initiatorUser;
+
+    /**
+     * 参与人信息
+     */
+    @Transient
+    @TableField(exist = false)
+    private List<SysUser> users;
+
     /**
      * 开始时间
      */
@@ -74,7 +108,7 @@ public class MeetingInfo implements Serializable {
     /**
      * 审批状态(0-审批中 1-审批通过 2-审批驳回)
      */
-    private Long approveStatus;
+    private Integer approveStatus;
 
     /**
      * 审批者意见
@@ -92,9 +126,9 @@ public class MeetingInfo implements Serializable {
     private Integer planCount;
 
     /**
-     * 是否延期(会议是否需要延期30分钟)
+     * 是否延期(会议是否需要延期30分钟)(0-否 1-是)
      */
-    private Long isDelay;
+    private Integer isDelay;
 
     /**
      * 备注
@@ -102,9 +136,9 @@ public class MeetingInfo implements Serializable {
     private String remark;
 
     /**
-     * 会议状态(未开始/进行中/已结束)
+     * 会议状态(0-未开始 1-进行中 2-已结束)
      */
-    private Long meetingStatus;
+    private Integer meetingStatus;
 
     /**
      * 创建者
@@ -137,9 +171,9 @@ public class MeetingInfo implements Serializable {
     private String procInstId;
 
     /**
-     * 是否取消
+     * 是否取消(0-否 1-是)
      */
-    private Long isCancel;
+    private Integer isCancel;
 
     /**
      * 通知类型(APP/Email/MSG短信)
@@ -149,12 +183,12 @@ public class MeetingInfo implements Serializable {
     /**
      * 会议性质(1-高层会议/0-普通会议)
      */
-    private String meetingProp;
+    private Integer meetingProp;
 
     /**
      * 是否需要审批(0-否 1-是)
      */
-    private Long isApprove;
+    private Integer isApprove;
 
     /**
      * 高层会议-指定用户
@@ -164,7 +198,7 @@ public class MeetingInfo implements Serializable {
     /**
      * 会议模式(0-线下会议 1-线上会议 2-线下同步线上会议)
      */
-    private String meetingMode;
+    private Integer meetingMode;
 
     /**
      * 租户ID

+ 22 - 5
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingRoom.java

@@ -2,16 +2,16 @@ 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;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
+import javax.persistence.*;
 
 /**
  * <p>
@@ -31,6 +31,8 @@ public class MeetingRoom implements Serializable {
 
     @Id
     @TableId
+    @JoinColumn(name = "room_id")
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
     private Long roomId;
 
     /**
@@ -41,7 +43,8 @@ public class MeetingRoom implements Serializable {
     /**
      * 所在楼层
      */
-    private String floorId;
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long floorId;
 
     /**
      * 会议室简介
@@ -131,10 +134,24 @@ public class MeetingRoom implements Serializable {
     /**
      * 楼层信息
      */
-    @ManyToOne
+    @Transient
     @TableField(exist = false)
     private MeetingFloor meetingFloor;
 
+    /**
+     * 设备信息
+     */
+    @Transient
+    @TableField(exist = false)
+    private List<MeetingDevice> meetingDevice;
+
+    /**
+     * 会议信息
+     */
+    @Transient
+    @TableField(exist = false)
+    private List<MeetingInfo> meetingInfo;
+
     /**
      * 组织机构ID
      */

+ 101 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/SysDept.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-03-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class SysDept implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 部门id
+     */
+    @TableId(value = "dept_id", type = IdType.AUTO)
+    private Long deptId;
+
+    /**
+     * 父部门id
+     */
+    private Long parentId;
+
+    /**
+     * 祖级列表
+     */
+    private String ancestors;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 显示顺序
+     */
+    private Integer orderNum;
+
+    /**
+     * 负责人
+     */
+    private String leader;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 邮箱
+     */
+    private String email;
+
+    /**
+     * 部门状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    private String delFlag;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 租户ID
+     */
+    private Integer tenantId;
+
+
+}

+ 101 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/SysRole.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-03-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class SysRole implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 角色ID
+     */
+    @TableId(value = "role_id", type = IdType.AUTO)
+    private Long roleId;
+
+    /**
+     * 角色名称
+     */
+    private String roleName;
+
+    /**
+     * 角色权限字符串
+     */
+    private String roleKey;
+
+    /**
+     * 显示顺序
+     */
+    private Integer roleSort;
+
+    /**
+     * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)
+     */
+    private String dataScope;
+
+    /**
+     * 菜单树选择项是否关联显示
+     */
+    private Boolean menuCheckStrictly;
+
+    /**
+     * 部门树选择项是否关联显示
+     */
+    private Boolean deptCheckStrictly;
+
+    /**
+     * 角色状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    private String delFlag;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 租户ID
+     */
+    private Integer tenantId;
+
+
+}

+ 143 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/SysUser.java

@@ -0,0 +1,143 @@
+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 com.usky.common.core.bean.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * <p>
+ * 用户信息表
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-18
+ */
+@Entity
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class SysUser implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户ID
+     */
+    @Id
+    @TableId(value = "user_id", type = IdType.AUTO)
+    private Long userId;
+
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+
+    /**
+     * 用户账号
+     */
+    private String userName;
+
+    /**
+     * 用户昵称
+     */
+    private String nickName;
+
+    /**
+     * 用户类型(00系统用户, 01 租户管理员)
+     */
+    private String userType;
+
+    /**
+     * 用户邮箱
+     */
+    private String email;
+
+    /**
+     * 手机号码
+     */
+    private String phonenumber;
+
+    /**
+     * 用户性别(0男 1女 2未知)
+     */
+    private String sex;
+
+    /**
+     * 姓名
+     */
+    private String fullName;
+
+    /**
+     * 头像地址
+     */
+    private String avatar;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 帐号状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    private String delFlag;
+
+    /**
+     * 最后登录IP
+     */
+    private String loginIp;
+
+    /**
+     * 最后登录时间
+     */
+    private LocalDateTime loginDate;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 租户ID
+     */
+    private Integer tenantId;
+
+    /**
+     * 地址
+     */
+    private String address;
+
+
+}

+ 32 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/SysUserRole.java

@@ -0,0 +1,32 @@
+package com.usky.meeting.domain;
+
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 用户和角色关联表
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class SysUserRole implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 角色ID
+     */
+    private Long roleId;
+
+
+}

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

@@ -2,6 +2,7 @@ package com.usky.meeting.mapper;
 
 import com.usky.meeting.domain.MeetingFloor;
 import com.usky.common.mybatis.core.CrudMapper;
+import org.springframework.stereotype.Repository;
 
 /**
  * <p>
@@ -11,6 +12,7 @@ import com.usky.common.mybatis.core.CrudMapper;
  * @author zyj
  * @since 2024-03-08
  */
+@Repository
 public interface MeetingFloorMapper extends CrudMapper<MeetingFloor> {
 
 }

+ 16 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/mapper/SysDeptMapper.java

@@ -0,0 +1,16 @@
+package com.usky.meeting.mapper;
+
+import com.usky.meeting.domain.SysDept;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 部门表 Mapper 接口
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-18
+ */
+public interface SysDeptMapper extends CrudMapper<SysDept> {
+
+}

+ 16 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/mapper/SysRoleMapper.java

@@ -0,0 +1,16 @@
+package com.usky.meeting.mapper;
+
+import com.usky.meeting.domain.SysRole;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 角色信息表 Mapper 接口
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-18
+ */
+public interface SysRoleMapper extends CrudMapper<SysRole> {
+
+}

+ 16 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/mapper/SysUserMapper.java

@@ -0,0 +1,16 @@
+package com.usky.meeting.mapper;
+
+import com.usky.meeting.domain.SysUser;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 用户信息表 Mapper 接口
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-18
+ */
+public interface SysUserMapper extends CrudMapper<SysUser> {
+
+}

+ 16 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/mapper/SysUserRoleMapper.java

@@ -0,0 +1,16 @@
+package com.usky.meeting.mapper;
+
+import com.usky.meeting.domain.SysUserRole;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 用户和角色关联表 Mapper 接口
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-18
+ */
+public interface SysUserRoleMapper extends CrudMapper<SysUserRole> {
+
+}

+ 117 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/repository/DmUserRepository.java

@@ -0,0 +1,117 @@
+/*
+*  Copyright 2019-2020 Zheng Jie
+*
+*  Licensed under the Apache License, Version 2.0 (the "License");
+*  you may not use this file except in compliance with the License.
+*  You may obtain a copy of the License at
+*
+*  http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing, software
+*  distributed under the License is distributed on an "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+*  See the License for the specific language governing permissions and
+*  limitations under the License.
+*/
+package com.usky.meeting.repository;
+
+import com.usky.meeting.domain.SysUser;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+* @website https://el-admin.vip
+* @author shiguangji
+* @date 2021-03-09
+**/
+public interface DmUserRepository extends JpaRepository<SysUser, String>, JpaSpecificationExecutor<SysUser> {
+
+//    /**
+//     * 查询未绑定账户的用户
+//     * @param userId
+//     * @return
+//     */
+//    @Query(value = "SELECT u.* FROM dm_user u WHERE " +
+//            "u.id not in (select dm_user_id from sys_user where dm_user_id is not null and if(:userId != '',user_id != :userId,1=1))",nativeQuery = true)
+//    List<SysUser> findNotBindUser(@Param("userId") String userId);
+//
+//    /**
+//     * 根据邮箱查询
+//     * @param email 邮箱
+//     * @return /
+//     */
+//    SysUser findByEmail(String email);
+//
+//    @Modifying
+//    @Query(value = "update dm_user set email = ?2 where id = ?1",nativeQuery = true)
+//    void updateEmail(String id, String email);
+//
+//    /**
+//     * 根据联系方式查询
+//     * @param contracts 联系方式
+//     * @return /
+//     */
+//    SysUser findByContacts(String contracts);
+//
+//    /**
+//     * 查询所有是审批者的用户id
+//     * @param isApprover
+//     * @return
+//     */
+//    @Query(value = "select id from DmUser where is_approver = :isApprover and if(:deptId != '',dept_id = :deptId,1=1)",nativeQuery = true)
+//    List<Long> findIdsByIsApprover(@Param("isApprover")Boolean isApprover,@Param("deptId") String deptId);
+//
+//    /**
+//     * 根据部门查询
+//     * @param deptIds /
+//     * @return /
+//     */
+//    @Query(value = "SELECT count(1) FROM dm_user u WHERE u.dept_id IN ?1", nativeQuery = true)
+//    int countByDepts(Set<String> deptIds);
+//
+//    /**
+//     * 根据角色查询
+//     * @param ids /
+//     * @return /
+//     */
+//    @Query(value = "SELECT count(1) FROM dm_user u, dm_users_roles r WHERE " +
+//            "u.id = r.user_id AND r.role_id in ?1", nativeQuery = true)
+//    int countByRoles(Set<Long> ids);
+//
+//    /**
+//     * 根据岗位查询
+//     * @param ids /
+//     * @return /
+//     */
+//    @Query(value = "SELECT count(1) FROM dm_user u, dm_users_jobs j WHERE u.id = j.user_id AND j.job_id IN ?1", nativeQuery = true)
+//    int countByJobs(Set<Long> ids);
+//
+//    /**
+//     * 根据部门获取用户
+//     * @param deptId
+//     * @return
+//     */
+//    @Query(value = "SELECT id,name from dm_user where dept_id=:deptId",nativeQuery = true)
+//    List<Map<String, Object>> getUserByDept(@Param("deptId") String deptId);
+//
+//    /**
+//     * 查询所有用户
+//     * @return /
+//     */
+//    @Query(value = "select du.id,du.name,du.dept_id as deptId,du.email,su.username,su.phone from dm_user as du left join sys_user as su on du.id = su.user_id where su.enabled=1",nativeQuery = true)
+//    List<Map<String,String>> getAllDmUser();
+//
+//    /**
+//     * 查询所有用户
+//     * @return /
+//     */
+//    @Query(value = "select du.id,du.name,du.dept_id as deptId,du.email,su.username,su.phone from dm_user as du left join sys_user as su on du.id = su.user_id where su.enabled=1 and du.name like CONCAT('%',:userName,'%')",nativeQuery = true)
+//    List<Map<String,String>> getAllDmUser(@Param("userName")String userName);
+}

+ 16 - 19
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/repository/MeetingDeviceRepository.java

@@ -15,27 +15,24 @@
 */
 package com.usky.meeting.repository;
 
+import com.usky.meeting.domain.MeetingDevice;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
+import java.util.Map;
+
 /**
 * @website https://el-admin.vip
 * @author shiguangji
 * @date 2021-03-12
 **/
-//public interface DmDeviceRepository extends JpaRepository<DmDevice, String>, JpaSpecificationExecutor<DmDevice> {
-//
-//    @Modifying
-//    @Query(value = "select device_id as deviceId," +
-//            "device_name as deviceName," +
-//            "storage_id as storageId," +
-//            "img_path as imgPath," +
-//            "nameplate as nameplate," +
-//            "room_id as roomId," +
-//            "register_date as registerDate," +
-//            "maintainer as maintainer," +
-//            "contacts as contacts," +
-//            "remark as remark," +
-//            "create_by as creatBy," +
-//            "update_by as updateBy " +
-//            "from dm_device where room_id = :roomId",nativeQuery = true)
-//    List<Map<String,Object>> getDeviceListByRoomId(@Param("roomId") Long roomId);
-//
-//}
+public interface MeetingDeviceRepository extends JpaRepository<MeetingDevice, Long>, JpaSpecificationExecutor<MeetingDevice> {
+
+    @Query(value = "select * from meeting_device where room_id = :roomId",nativeQuery = true)
+    List<MeetingDevice> getDeviceListByRoomId(@Param("roomId") Long roomId);
+
+}

+ 65 - 59
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/repository/MeetingInfoRepository.java

@@ -144,31 +144,29 @@ public interface MeetingInfoRepository extends JpaRepository<MeetingInfo, Long>,
 //                                           @Param("searchDate") String searchDate,
 //                                           @Param("roomId") Long roomId);
 //
-//
-//
-//    /**
-//     * 判断预约时间是否与别的预约单冲突
-//     * @param roomId
-//     * @return
-//     */
-//    @Query(value = "select" +
-//            " a.meeting_id as meetingId," +
-//            " a.meeting_name as meetingName," +
-//            " a.room_id as roomId," +
-//            " a.meeting_describe as meetingDescribe," +
-//            " date_format(a.start_date,'%Y-%m-%d %H:%i:%s') as startDate," +
-//            " date_format(a.end_date,'%Y-%m-%d %H:%i:%s') as endDate" +
-//            " from dm_meeting as a" +
-//            " where a.room_id = :roomId" +
-//            " and ((start_date <= :startDate and end_date >= :startDate and end_date != :startDate) or (start_date <= :endDate and end_date >= :endDate and start_date != :endDate))" +
-//            " and if(:meetingId != '',a.meeting_id != :meetingId,1=1)" +
-//            " and a.is_cancel = 0 and a.meeting_status != 2 and a.approve_status != 2",nativeQuery = true)
-//    List<Map<String,String>> checkDmRoomMeetingDate(@Param("roomId") Long roomId,
-//                                           /*@Param("startDate") Timestamp startDate,
-//                                           @Param("endDate") Timestamp endDate,*/
-//                                           @Param("startDate") String startDate,
-//                                           @Param("endDate") String endDate,
-//                                           @Param("meetingId") Long meetingId);
+
+
+    /**
+     * 判断预约时间是否与别的预约单冲突
+     * @param roomId
+     * @return
+     */
+    @Query(value = "select" +
+            " a.meeting_id as meetingId," +
+            " a.meeting_name as meetingName," +
+            " a.room_id as roomId," +
+            " a.meeting_describe as meetingDescribe," +
+            " date_format(a.start_date,'%Y-%m-%d %H:%i:%s') as startDate," +
+            " date_format(a.end_date,'%Y-%m-%d %H:%i:%s') as endDate" +
+            " from meeting_info as a" +
+            " where a.room_id = :roomId" +
+            " and ((start_date <= :startDate and end_date >= :startDate and end_date != :startDate) or (start_date <= :endDate and end_date >= :endDate and start_date != :endDate))" +
+            " and if(:meetingId != '',a.meeting_id != :meetingId,1=1)" +
+            " and a.is_cancel = 0 and a.meeting_status != 2 and a.approve_status != 2",nativeQuery = true)
+    List<Map<String,String>> checkDmRoomMeetingDate(@Param("roomId") Long roomId,
+                                           @Param("startDate") String startDate,
+                                           @Param("endDate") String endDate,
+                                           @Param("meetingId") Long meetingId);
 //
 //
 //    /**
@@ -291,14 +289,22 @@ public interface MeetingInfoRepository extends JpaRepository<MeetingInfo, Long>,
 //            " and m.is_cancel = 0" +
 //            " and m.start_date BETWEEN DATE_FORMAT(NOW(),'%Y-%m-%d') AND DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 3 DAY),'%Y-%m-%d')",nativeQuery = true)
 //    List<Map<String,String>> selectRoomThreeDaysReserveList(@Param("roomID") Long roomId);
-//
-//    /**
-//     * 查询会议室当天所有的会议预约记录
-//     * @param roomId
-//     * @return
-//     */
-//    @Query(value = "select * from dm_meeting where TO_DAYS(start_date) = TO_DAYS(NOW()) and room_id = :roomId",nativeQuery = true)
-//    List<DmMeeting> queryAllMeetingByRoomId(@Param("roomId") Long roomId);
+
+    /**
+     * 查询会议室当天所有的会议预约记录
+     * @param roomId
+     * @return
+     */
+    @Query(value = "select * from meeting_info where TO_DAYS(start_date) = TO_DAYS(NOW()) and room_id = :roomId",nativeQuery = true)
+    List<MeetingInfo> queryTodayMeetingByRoomId(@Param("roomId") Long roomId);
+
+    /**
+     * 查询会议室所有的会议预约记录
+     * @param roomId
+     * @return
+     */
+    @Query(value = "select * from meeting_info where room_id = :roomId",nativeQuery = true)
+    List<MeetingInfo> queryAllMeetingByRoomId(@Param("roomId") Long roomId);
 //
 //
 //    /**
@@ -341,15 +347,15 @@ public interface MeetingInfoRepository extends JpaRepository<MeetingInfo, Long>,
 //                    " and r.room_status = 1"+
 //                    " and DATE_FORMAT(m.end_date,'%Y-%m-%d %H:%i') <= DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i')",nativeQuery = true)
 //    void autoCloseMeetingAndRoom(@Param("updateDate") String updateDate);
-//
-//    @Query(value = "select u.`id` as userId,u.`name` as userName,u.sex AS sex,u.contacts AS phone,u.dept_id as dept,a.is_sign as isSign," +
-//            " CASE a.is_sign WHEN 0 THEN '否' WHEN 1 THEN '是' END as type,CASE a.sign_type WHEN 0 THEN '人工签到' WHEN 1 THEN '人脸签到' END as signType," +
-//            " a.sign_date as `date`,a.meeting_id as meetingId,m.approve_status as approveStatus,m.meeting_status as meetingStatus" +
-//            " from dm_meeting_attendee as a " +
-//            " left join dm_user as u on a.user_id = u.`id` " +
-//            " left join dm_meeting as m on m.meeting_id = a.meeting_id "+
-//            " where a.meeting_id = :meetingId",nativeQuery = true,countQuery = "select COUNT(DISTINCT a.id ) as subcount from dm_meeting_attendee as a left join dm_user as u on a.user_id = u.`id` left join dm_meeting as m on m.meeting_id = a.meeting_id where a.meeting_id = :meetingId")
-//    List<Map<String,Object>> meetingSignList(@Param("meetingId") Long meetingId,Pageable pageable);
+
+    @Query(value = "select u.`user_id` as userId,u.`nick_name` as userName,u.sex AS sex,u.phonenumber AS phone,u.dept_id as dept," +
+            " (CASE a.is_sign WHEN 0 THEN '否' WHEN 1 THEN '是' END) as isSign,(CASE a.sign_type WHEN 0 THEN '人工签到' WHEN 1 THEN '人脸签到' END) as signType," +
+            " a.sign_date as `date`,a.meeting_id as meetingId,m.approve_status as approveStatus,m.meeting_status as meetingStatus" +
+            " from meeting_attendee as a " +
+            " left join sys_user as u on a.user_id = u.user_id " +
+            " left join meeting_info as m on m.meeting_id = a.meeting_id "+
+            " where a.meeting_id = :meetingId and a.tenant_id = :tenantId",nativeQuery = true,countQuery = "select COUNT(DISTINCT a.id ) as subcount from meeting_attendee as a left join sys_user as u on a.user_id = u.user_id left join meeting_info as m on m.meeting_id = a.meeting_id where a.meeting_id = :meetingId")
+    List<Map<String,Object>> meetingSignList(@Param("meetingId") Long meetingId,@Param("tenantId") Integer tenantId);
 //
 //    /**
 //     * 查询已完成的会议(根据会议室id)
@@ -448,18 +454,18 @@ public interface MeetingInfoRepository extends JpaRepository<MeetingInfo, Long>,
 //            "left join ( select mf.meeting_id,CONCAT(\"[\",GROUP_CONCAT(CONCAT(ls.storage_id)),\"]\") as fileList from dm_meeting_file as mf left join tool_local_storage as ls on mf.storage_id = ls.storage_id where mf.meeting_id = :meetingId group by mf.meeting_id ) as file on file.meeting_id = m.meeting_id " +
 //            "where m.meeting_id = :meetingId",nativeQuery = true)
 //    Map<String,Object> getMeetingDetails(@Param("meetingId") Long meetingId);
-//
-//    /**
-//     * 根据会议开始时间的年和月,查询出所有数据
-//     */
-//    @Query(value = "select * from dm_meeting where (month(start_date) <= :month and month(end_date)>=:month) and (YEAR(start_date) <= :year and YEAR(end_date)>=:year) and (day(start_date) <= :day and day(end_date)>=:day) and room_id = :roomId and is_cancel = 0 and approve_status!=2",nativeQuery = true)
-//    List<DmMeeting> getDmMeetingByStartDatDay(@Param("roomId") Long roomId, @Param("year") Integer year, @Param("month") Integer month, @Param("day") Integer day);
-//
-//    /**
-//     * 根据会议开始时间的年和月,查询出所有数据
-//     */
-//    @Query(value = "select * from dm_meeting where month(start_date) = :month and YEAR(start_date) = :year and room_id = :roomId and is_cancel = 0 and approve_status!=2 ",nativeQuery = true)
-//    List<Map<String,Object>> getDmMeetingByStartDateYearAndMonth(@Param("roomId") Long roomId,@Param("year") Integer year, @Param("month") Integer month);
+
+    /**
+     * 根据会议开始时间的年和月,查询出所有数据
+     */
+    @Query(value = "select * from meeting_info where (month(start_date) <= :month and month(end_date)>=:month) and (YEAR(start_date) <= :year and YEAR(end_date)>=:year) and (day(start_date) <= :day and day(end_date)>=:day) and room_id = :roomId and is_cancel = 0 and approve_status!=2 and tenant_id = :tenantId ORDER BY start_date ASC",nativeQuery = true)
+    List<MeetingInfo> getDmMeetingByStartDatDay(@Param("roomId") Long roomId, @Param("year") Integer year, @Param("month") Integer month, @Param("day") Integer day, @Param("tenantId") Integer tenantId);
+
+    /**
+     * 根据会议开始时间的年和月,查询出所有数据
+     */
+    @Query(value = "select * from meeting_info where month(start_date) = :month and YEAR(start_date) = :year and room_id = :roomId and is_cancel = 0 and approve_status!=2 and tenant_id = :tenantId ORDER BY start_date ASC",nativeQuery = true)
+    List<Map<String,Object>> getDmMeetingByStartDateYearAndMonth(@Param("roomId") Long roomId,@Param("year") Integer year, @Param("month") Integer month, @Param("tenantId") Integer tenantId);
 //
 //    /**
 //     * 提供根据会议室和会议时间查询会议发起人信息
@@ -495,9 +501,9 @@ public interface MeetingInfoRepository extends JpaRepository<MeetingInfo, Long>,
     @Query(value = "select sum(MONTH(start_date)=1) as one,sum(MONTH(start_date)=2) as two,sum(MONTH(start_date)=3) as three,sum(MONTH(start_date)=4) as four,sum(MONTH(start_date)=5) as five,sum(MONTH(start_date)=6) as six,sum(MONTH(start_date)=7) as seven,sum(MONTH(start_date)=8) as eight,sum(MONTH(start_date)=9) as nine,sum(MONTH(start_date)=10) as ten,sum(MONTH(start_date)=11) as eleven,sum(MONTH(start_date)=12) as twelve from meeting_info where tenant_id=:tenantId and YEAR(start_date)=:year and approve_status=1 and is_cancel != 1" ,nativeQuery = true)
     Map<String,Object> meetingSummaryByYear(@Param("year") String year,@Param("tenantId") Integer tenantId);
 
-//    @Query(value = "select meeting_id as meetingId from dm_meeting_attendee where user_id = :userId" , nativeQuery = true)
-//    List<BigInteger> queryMeetingIdsByUserId(@Param("userId") String userId);
-//
-//    @Query(value = "select meeting_id as meetingId from dm_meeting where initiator_id  = :initiatorId" , nativeQuery = true)
-//    List<BigInteger> queryMeetingIdsByInitiatorId(@Param("initiatorId") String initiatorId);
+    @Query(value = "select meeting_id as meetingId from meeting_attendee where user_id = :userId" , nativeQuery = true)
+    List<BigInteger> queryMeetingIdsByUserId(@Param("userId") Long userId);
+
+    @Query(value = "select meeting_id as meetingId from meeting_info where initiator_id  = :initiatorId" , nativeQuery = true)
+    List<BigInteger> queryMeetingIdsByInitiatorId(@Param("initiatorId") Long initiatorId);
 }

+ 20 - 8
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/repository/MeetingRoomRepository.java

@@ -25,6 +25,7 @@ import org.springframework.data.repository.query.Param;
 import javax.transaction.Transactional;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
 * @website https://el-admin.vip
@@ -95,14 +96,25 @@ public interface MeetingRoomRepository extends JpaRepository<MeetingRoom, Long>,
 //            "r.is_approve as isApprove " +
 //            "from dm_meeting_room as r where if(:floorId IS NOT NULL,r.floor_id = :floorId,1=1)" ,nativeQuery = true)
 //    List<Map<String,String>> getAllMeetingRoom(@Param("floorId") Long floorId);
-//
-//    /**
-//     * 根据会议室id更改会议室状态
-//     */
-//    @Transactional
-//    @Modifying
-//    @Query(value = "update dm_meeting_room set room_status = :roomStatus where room_id = :roomId  ",nativeQuery = true)
-//    void updateMeetingRoomStatus(@Param("roomId") Long roomId,@Param("roomStatus") Long roomStatus);
+
+    /**
+     * 根据会议室id更改会议室状态为 1-使用中
+     */
+    @Transactional
+    @Modifying
+    @Query(value = "update meeting_room set room_status = 1 where room_id in ?1  ",nativeQuery = true)
+    void updateMeetingRoomStatusOnUse(Set<Long> ids);
+
+    /**
+     * 根据会议室id更改会议室状态为 0-未使用
+     */
+    @Transactional
+    @Modifying
+    @Query(value = "update meeting_room set room_status = 0 where room_id in ?1  ",nativeQuery = true)
+    void updateMeetingRoomStatusFreeUse(Set<Long> ids);
+
+    @Query(value = "select * from meeting_room where floor_id = :floorId",nativeQuery = true)
+    List<MeetingRoom> getMeetingRoomList(@Param("floorId") Long floorId);
 //
 //    /**
 //     * 会议室列表(运营)

+ 196 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/repository/UserRepository.java

@@ -0,0 +1,196 @@
+/*
+ *  Copyright 2019-2020 Zheng Jie
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package com.usky.meeting.repository;
+
+import com.usky.meeting.domain.SysUser;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Zheng Jie
+ * @date 2018-11-22
+ */
+public interface UserRepository extends JpaRepository<SysUser, String>, JpaSpecificationExecutor<SysUser> {
+//
+//    /**
+//     * 根据用户名查询
+//     * @param username 用户名
+//     * @return /
+//     */
+//    SysUser findByUsername(String username);
+//
+//    /**
+//     * 根据工号查询
+//     * @param userNumber 工号
+//     * @return /
+//     */
+//    SysUser findByUserNumber(String userNumber);
+//
+//    /**
+//     * 根据邮箱查询
+//     * @param email 邮箱
+//     * @return /
+//     */
+//    SysUser findByEmail(String email);
+//
+//    /**
+//     * 根据手机号查询
+//     * @param phone 手机号
+//     * @return /
+//     */
+//    SysUser findByPhone(String phone);
+//
+//    /**
+//     * 修改密码
+//     * @param username 用户名
+//     * @param pass 密码
+//     * @param lastPasswordResetTime /
+//     */
+//    @Modifying
+//    @Query(value = "update sys_user set password = ?2 , pwd_reset_time = ?3 where username = ?1",nativeQuery = true)
+//    void updatePass(String username, String pass, Date lastPasswordResetTime);
+//
+//    @Modifying
+//    @Query(value = "update sys_user set password = ?2 , pwd_reset_time = ?3, org_password = ?4, extends = ?5 where username = ?1",nativeQuery = true)
+//    void updatePass(String username, String pass, Date lastPasswordResetTime,String orgPass,String extend);
+//
+//    /**
+//     * 修改邮箱
+//     * @param username 用户名
+//     * @param email 邮箱
+//     */
+//    @Modifying
+//    @Query(value = "update sys_user set email = ?2 where username = ?1",nativeQuery = true)
+//    void updateEmail(String username, String email);
+//
+//    /**
+//     * 根据角色查询用户
+//     * @param roleId /
+//     * @return /
+//     */
+//    @Query(value = "SELECT u.* FROM sys_user u, sys_users_roles r WHERE" +
+//            " u.user_id = r.user_id AND r.role_id = ?1", nativeQuery = true)
+//    List<SysUser> findByRoleId(Long roleId);
+//
+//    /**
+//     * 根据角色查询用户
+//     * @param roleId /
+//     * @return /
+//     */
+//    @Query(value = "SELECT u.user_id as userId,u.username FROM sys_user u, sys_users_roles r WHERE" +
+//            " u.user_id = r.user_id AND r.role_id = ?1", nativeQuery = true)
+//    List<Map<String,Object>> findByRoleId2(Long roleId);
+//
+//    /**
+//     * 根据角色中的部门查询
+//     * @param deptId /
+//     * @return /
+//     */
+//    @Query(value = "SELECT u.* FROM sys_user u, sys_users_roles r, sys_roles_depts d WHERE " +
+//            "u.user_id = r.user_id AND r.role_id = d.role_id AND d.dept_id = ?1 group by u.user_id", nativeQuery = true)
+//    List<SysUser> findByRoleDeptId(String deptId);
+//
+//    /**
+//     * 根据菜单查询
+//     * @param id 菜单ID
+//     * @return /
+//     */
+//    @Query(value = "SELECT u.* FROM sys_user u, sys_users_roles ur, sys_roles_menus rm WHERE\n" +
+//            "u.user_id = ur.user_id AND ur.role_id = rm.role_id AND rm.menu_id = ?1 group by u.user_id", nativeQuery = true)
+//    List<SysUser> findByMenuId(Long id);
+//
+//    /**
+//     * 根据Id删除
+//     * @param ids /
+//     */
+//    void deleteAllByIdIn(Set<String> ids);
+//
+//    /**
+//     * 根据岗位查询
+//     * @param ids /
+//     * @return /
+//     */
+//    @Query(value = "SELECT count(1) FROM sys_user u, sys_users_jobs j WHERE u.user_id = j.user_id AND j.job_id IN ?1", nativeQuery = true)
+//    int countByJobs(Set<Long> ids);
+//
+//    /**
+//     * 根据部门查询
+//     * @param deptIds /
+//     * @return /
+//     */
+//    @Query(value = "SELECT count(1) FROM sys_user u WHERE u.dept_id IN ?1", nativeQuery = true)
+//    int countByDepts(Set<String> deptIds);
+//
+//    /**
+//     * 根据角色查询
+//     * @param ids /
+//     * @return /
+//     */
+//    @Query(value = "SELECT count(1) FROM sys_user u, sys_users_roles r WHERE " +
+//            "u.user_id = r.user_id AND r.role_id in ?1", nativeQuery = true)
+//    int countByRoles(Set<Long> ids);
+//
+//    @Query(value = "SELECT u.* FROM sys_user u WHERE " +
+//            "u.dm_user_id = :dmUserId AND if(:userId != '',u.user_id != :userId,1=1)",nativeQuery = true)
+//    List<SysUser> findByDmUserId(@Param("dmUserId")String dmUserId, @Param("userId") String userId);
+//
+//
+//    /**
+//     * 根据单位查询
+//     * @param ids /
+//     * @return /
+//     */
+//    @Query(value = "SELECT count(1) FROM sys_user u WHERE u.company_id IN ?1", nativeQuery = true)
+//    int countByCompanies(Set<Long> ids);
+
+    /**
+     * 根据单位查询
+     * @param dmUserId /
+     * @return /
+     */
+    @Query(value = "SELECT u.* FROM sys_user u WHERE " +
+            "u.user_id = :dmUserId",nativeQuery = true)
+    SysUser getUserByDmUserId(@Param("dmUserId")String dmUserId);
+//
+//    /**
+//     * 根据会议id查询所有参会人的账号
+//     * @return /
+//     */
+//    @Query(value = "select su.username from dm_meeting_attendee as ma left join sys_user as su on ma.user_id = su.user_id where ma.meeting_id = :meetingId",nativeQuery = true)
+//    List<String> findUsernameByMeetingId(@Param("meetingId")Long meetingId);
+//
+//    /**
+//     * 根据会议id查询所有参会人的账号
+//     * @return /
+//     */
+//    @Query(value = "select su.email from dm_meeting_attendee as ma left join sys_user as su on ma.user_id = su.user_id where ma.meeting_id = :meetingId",nativeQuery = true)
+//    List<String> findEmailByMeetingId(@Param("meetingId")Long meetingId);
+//
+//    /**
+//     * 根据会议id查询所有参会人的账号
+//     * @return /
+//     */
+//    @Query(value = "select su.phone from dm_meeting_attendee as ma left join sys_user as su on ma.user_id = su.user_id where ma.meeting_id = :meetingId",nativeQuery = true)
+//    List<String> findPhoneByMeetingId(@Param("meetingId")Long meetingId);
+}

+ 9 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/MeetingFileService.java

@@ -1,7 +1,13 @@
 package com.usky.meeting.service;
 
+import com.usky.common.core.bean.CommonPage;
 import com.usky.meeting.domain.MeetingFile;
 import com.usky.common.mybatis.core.CrudService;
+import com.usky.meeting.service.vo.MeetingFileListVO;
+import com.usky.meeting.service.vo.MeetingFileRequestVO;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +19,7 @@ import com.usky.common.mybatis.core.CrudService;
  */
 public interface MeetingFileService extends CrudService<MeetingFile> {
 
+    void insertMeetingFile(List<MeetingFileRequestVO> requestVOList);
+
+    CommonPage<MeetingFile> meetingFileList(MeetingFileListVO meetingFileListVO);
 }

+ 37 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/MeetingInfoService.java

@@ -1,9 +1,21 @@
 package com.usky.meeting.service;
 
+import com.alibaba.fastjson.JSONObject;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.meeting.controller.web.SignOnOutRequestVO;
 import com.usky.meeting.domain.MeetingInfo;
 import com.usky.common.mybatis.core.CrudService;
+import com.usky.meeting.service.dto.DmMeetingDto;
+import com.usky.meeting.service.dto.DmMeetingDtoV2;
+import com.usky.meeting.service.vo.MeetingInfoRequestVO;
+import com.usky.meeting.service.vo.MyMeetingInfoRequestVO;
 import org.springframework.data.repository.query.Param;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
 
+import java.text.ParseException;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -27,4 +39,29 @@ public interface MeetingInfoService extends CrudService<MeetingInfo> {
      * @return  Map<String,Object>
      */
     Map<String,Object> meetingSummaryByYear(String year, Integer tenantId);
+
+
+    JSONObject getMeetingRoomUsageByDayV2(Long roomId, String dayTime) throws ParseException;
+
+    /**
+     * 获取当月会议室得使用情况
+     * @param roomId 会议室id
+     * @param monthTime 获取会议室情况得日期
+     * @return  JSONArray
+     */
+    List<Integer> getMeetingRoomUsageByMonth(Long roomId, String monthTime) throws ParseException;
+
+    DmMeetingDto add(DmMeetingDto resources);
+
+    CommonPage<MeetingInfo> meetingInfoList(MeetingInfoRequestVO requestVO);
+
+    void cancel(Long meetingId);
+
+    CommonPage<MeetingInfo> myMeetingList(MyMeetingInfoRequestVO requestVO);
+
+    List<Map<String,Object>> meetingSignList(Long meetingId);
+
+    void signOnOut(SignOnOutRequestVO requestVO);
+
+    void updateMeetingInfoStatus();
 }

+ 8 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/MeetingRoomService.java

@@ -3,9 +3,13 @@ package com.usky.meeting.service;
 import com.usky.common.core.bean.CommonPage;
 import com.usky.meeting.domain.MeetingRoom;
 import com.usky.common.mybatis.core.CrudService;
+import com.usky.meeting.service.dto.DmMeetingRoomDto;
 import com.usky.meeting.service.vo.MeetingRoomRequestVO;
+import com.usky.meeting.service.vo.MeetingRoomReservationVO;
 import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
 
+import java.text.ParseException;
 import java.util.List;
 import java.util.Map;
 
@@ -33,4 +37,8 @@ public interface MeetingRoomService extends CrudService<MeetingRoom> {
     void remove(Long roomId);
 
     Map<String,Object> attendee(Long meetingId, Long userId, String userName);
+
+    List<DmMeetingRoomDto> getMeetingRoomReservationList(MeetingRoomReservationVO reservationVO)  throws ParseException;
+
+    MeetingRoom meetingRoomDetails(Long roomId);
 }

+ 16 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/SysDeptService.java

@@ -0,0 +1,16 @@
+package com.usky.meeting.service;
+
+import com.usky.meeting.domain.SysDept;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ * 部门表 服务类
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-18
+ */
+public interface SysDeptService extends CrudService<SysDept> {
+
+}

+ 16 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/SysRoleService.java

@@ -0,0 +1,16 @@
+package com.usky.meeting.service;
+
+import com.usky.meeting.domain.SysRole;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ * 角色信息表 服务类
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-18
+ */
+public interface SysRoleService extends CrudService<SysRole> {
+
+}

+ 16 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/SysUserRoleService.java

@@ -0,0 +1,16 @@
+package com.usky.meeting.service;
+
+import com.usky.meeting.domain.SysUserRole;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ * 用户和角色关联表 服务类
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-18
+ */
+public interface SysUserRoleService extends CrudService<SysUserRole> {
+
+}

+ 16 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/SysUserService.java

@@ -0,0 +1,16 @@
+package com.usky.meeting.service;
+
+import com.usky.meeting.domain.SysUser;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ * 用户信息表 服务类
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-18
+ */
+public interface SysUserService extends CrudService<SysUser> {
+
+}

+ 133 - 125
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/dto/DmMeetingDto.java

@@ -1,125 +1,133 @@
-///*
-//*  Copyright 2019-2020 Zheng Jie
-//*
-//*  Licensed under the Apache License, Version 2.0 (the "License");
-//*  you may not use this file except in compliance with the License.
-//*  You may obtain a copy of the License at
-//*
-//*  http://www.apache.org/licenses/LICENSE-2.0
-//*
-//*  Unless required by applicable law or agreed to in writing, software
-//*  distributed under the License is distributed on an "AS IS" BASIS,
-//*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//*  See the License for the specific language governing permissions and
-//*  limitations under the License.
-//*/
-//package com.usky.meeting.service.dto;
-//
-//import com.alibaba.fastjson.annotation.JSONField;
-//import com.alibaba.fastjson.serializer.ToStringSerializer;
-//import com.usky.meeting.service.dto.DmMeetingRoomDto;
-//import com.usky.meeting.domain.DmDevice;
-//import com.usky.meeting.domain.SysUser;
-//import com.usky.meeting.domain.ToolLocalStorage;
-//import lombok.Data;
-//
-//import java.io.Serializable;
-//import java.sql.Timestamp;
-//import java.util.Set;
-//
-///**
-//* @website https://el-admin.vip
-//* @description /
-//* @author shiguangji
-//* @date 2021-03-15
-//**/
-//@Data
-//public class DmMeetingDto implements Serializable {
-//
-//    /** 防止精度丢失 */
-//    @JSONField(serializeUsing = ToStringSerializer.class)
-//    private Long meetingId;
-//
-//    /** 会议议题 */
-//    private String meetingName;
-//
-//    /** 会议室id */
-//    private DmMeetingRoomDto room;
-//
-//    private String roomName;
-//    /** 会议介绍 */
-//    private String meetingDescribe;
-//
-//    /** 会议类型(如研讨会、部门会议等) */
-//    private String meetingType;
-//
-//    /** 参与部门 */
-//    private DeptDto dept;
-//
-//    /** 发起人id */
-//    private DmUserDto initiatorUser;
-//
-//    private Set<SysUser> users;
-//
-//    private Set<ToolLocalStorage> localStorages;
-//
-//    private Set<DmDevice> dmDevices;
-//
-//    /** 开始时间 */
-//    private Timestamp startDate;
-//
-//    /** 结束时间 */
-//    private Timestamp endDate;
-//
-//    /** 审批状态(0-审批中 1-审批通过 2-审批驳回) */
-//    private Long approveStatus;
-//
-//    /** 审批者意见 */
-//    private String approveSuggest;
-//
-//    /** 实际签到人数 */
-//    private Integer actualCount;
-//
-//    /** 应到人数/计划人数 */
-//    private Integer planCount;
-//
-//    /** 是否延期(会议是否需要延期30分钟) */
-//    private Boolean isDelay;
-//
-//    /** 备注 */
-//    private String remark;
-//
-//    /** 会议状态(未开始/进行中/已结束) */
-//    private Long meetingStatus;
-//
-//    /** 关联任务id */
-//    private String taskId;
-//
-//    /** 任务实例id */
-//    private String procInstId;
-//
-//    /** 是否取消 */
-//    private Boolean isCancel;
-//
-//    /** 通知类型(APP/Email/短信) */
-//    private String sendType;
-//
-//    /** 会议性质(1-高层会议/0-普通会议) */
-//    private String meetingProp;
-//
-//    /** 是否需要审批(0-否 1-是) */
-//    private Boolean isApprove;
-//
-//    /** 高层会议-指定用户 */
-//    private Long gcAssignUser;
-//
-//    /** 会议模式 */
-//    private String meetingMode;
-//
-//    private Set<Long> gcAssignUsers;
-//
-//    private Set<Long> approveUsers;
-//
-//    private Set<DmUserDto> userList;
-//
-//}
+/*
+*  Copyright 2019-2020 Zheng Jie
+*
+*  Licensed under the Apache License, Version 2.0 (the "License");
+*  you may not use this file except in compliance with the License.
+*  You may obtain a copy of the License at
+*
+*  http://www.apache.org/licenses/LICENSE-2.0
+*
+*  Unless required by applicable law or agreed to in writing, software
+*  distributed under the License is distributed on an "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+*  See the License for the specific language governing permissions and
+*  limitations under the License.
+*/
+package com.usky.meeting.service.dto;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.ToStringSerializer;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.usky.meeting.domain.MeetingDevice;
+import com.usky.meeting.domain.MeetingFile;
+import com.usky.meeting.service.dto.DmMeetingRoomDto;
+import com.usky.meeting.domain.SysUser;
+import lombok.Data;
+import org.apache.catalina.LifecycleState;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+import java.time.LocalDateTime;
+import java.util.Set;
+
+/**
+* @website https://el-admin.vip
+* @description /
+* @author shiguangji
+* @date 2021-03-15
+**/
+@Data
+public class DmMeetingDto implements Serializable {
+
+    /** 防止精度丢失 */
+    @JSONField(serializeUsing = ToStringSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long meetingId;
+
+    /** 会议议题 */
+    private String meetingName;
+
+    /** 会议室id */
+    private DmMeetingRoomDto room;
+
+    private Long roomId;
+
+    private String roomName;
+    /** 会议介绍 */
+    private String meetingDescribe;
+
+    /** 会议类型(如研讨会、部门会议等) */
+    private String meetingType;
+
+    /** 参与部门 */
+    private DeptDto dept;
+
+    /** 发起人id */
+    private DmUserDto initiatorUser;
+
+    private Set<SysUser> users;
+
+
+    private Set<MeetingDevice> dmDevices;
+
+    /** 开始时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private String startDate;
+
+    /** 结束时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private String endDate;
+
+    /** 审批状态(0-审批中 1-审批通过 2-审批驳回) */
+    private Integer approveStatus;
+
+    /** 审批者意见 */
+    private String approveSuggest;
+
+    /** 实际签到人数 */
+    private Integer actualCount;
+
+    /** 应到人数/计划人数 */
+    private Integer planCount;
+
+    /** 是否延期(会议是否需要延期30分钟)(0-否 1-是) */
+    private Integer isDelay;
+
+    /** 备注 */
+    private String remark;
+
+    /** 会议状态(0-未开始 1-进行中 2-已结束) */
+    private Integer meetingStatus;
+
+    /** 关联任务id */
+    private String taskId;
+
+    /** 任务实例id */
+    private String procInstId;
+
+    /** 是否取消(0-否 1-是) */
+    private Integer isCancel;
+
+    /** 通知类型(APP/Email/短信) */
+    private String sendType;
+
+    /** 会议性质(1-高层会议/0-普通会议) */
+    private String meetingProp;
+
+    /** 是否需要审批(0-否 1-是) */
+    private Integer isApprove;
+
+    /** 高层会议-指定用户 */
+    private Long gcAssignUser;
+
+    /** 会议模式 */
+    private Integer meetingMode;
+
+    private Set<Long> gcAssignUsers;
+
+    private Set<Long> approveUsers;
+
+    private Set<DmUserDto> userList;
+
+    private Set<MeetingFile> meetingFileList;
+}

+ 58 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/dto/DmMeetingDtoV2.java

@@ -0,0 +1,58 @@
+package com.usky.meeting.service.dto;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.ToStringSerializer;
+import lombok.Data;
+
+@Data
+public class DmMeetingDtoV2 {
+
+    @JSONField(serializeUsing = ToStringSerializer.class)
+    private Long meetingId;
+
+    private String meetingName;
+
+    private String meetingMode;
+
+    private String roomName;
+
+    private String meetingDescribe;
+
+    private String meetingType;
+
+    private String deptId;
+
+    private String deptName;
+
+    private String initiatorId;
+
+    private String initiatorName;
+
+    private String startDate;
+
+    private String endDate;
+
+    private Integer actualCount = 0;
+
+    private Integer planCount = 0;
+
+    private Boolean isDelay;
+
+    private String remark;
+
+    private Long meetingStatus;
+
+    private Long approveStatus = 0L;
+
+    private String meetingProp;
+
+    private String sendType;
+
+    private Boolean isApprove;
+
+    private String attendeeUserIds;
+
+    private String attendeeUserNames;
+
+
+}

+ 14 - 9
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/dto/DmMeetingRoomDto.java

@@ -18,10 +18,14 @@ package com.usky.meeting.service.dto;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.annotation.JSONField;
 import com.alibaba.fastjson.serializer.ToStringSerializer;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.squareup.moshi.Json;
+import com.usky.meeting.domain.MeetingFloor;
 import lombok.Data;
 
 import java.io.Serializable;
 import java.sql.Timestamp;
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -36,13 +40,14 @@ public class DmMeetingRoomDto implements Serializable {
     /** 主键 */
     /** 防止精度丢失 */
     @JSONField(serializeUsing = ToStringSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
     private Long roomId;
 
     /** 会议室名称 */
     private String roomName;
 
     /** 所在楼层 */
-    private DmFloorDto dmFloor;
+    private MeetingFloor dmFloor;
 
 //    //    审批人
 //    private DmUserDto dmUser;
@@ -69,23 +74,23 @@ public class DmMeetingRoomDto implements Serializable {
     /** 备注 */
     private String remark;
 
-    /** 会议室使用状态 */
-    private Long roomStatus;
+    /** 会议室使用状态(0-未使用 1-使用中) */
+    private Integer roomStatus;
 
-    /** 会议室预约状态 */
-    private Long reserveStatus;
+    /** 会议室预约状态(0-未预约 1-已预约) */
+    private Integer reserveStatus;
 
-    /** 会议室状态 */
-    private String status;
+    /** 会议室状态(0.启用 1.停用) */
+    private Integer status;
 
     /** 会议室环境 */
     private String environmental;
 
     /** 最近一次使用时间(正在使用的会议室,在预约时间外延后一小时开发预约) */
-    private Timestamp lastUseTime;
+    private LocalDateTime lastUseTime;
 
     /** 是否需要审批(0-否 1-是) */
-    private Boolean isApprove;
+    private Integer isApprove;
 
     private String approver;
 

+ 5 - 5
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/MeetingFaceServiceImpl.java

@@ -61,10 +61,10 @@ public class MeetingFaceServiceImpl extends AbstractCrudService<MeetingFaceMappe
                         }else {
                             // 失败 人脸被禁用
                             lambdaUpdate().set(MeetingFace::getVefNum,face.getVefNum()+1).eq(MeetingFace::getFid,face.getFid()).update();
-                            faceState1.setMsg(face.getFaceName()+MeetingFaceVO.FORBIDDEN_FACE+"当前人脸被禁用");
+                            faceState1.setMsg("当前人脸被禁用");
                             faceState1.setFaceName(face.getFaceName());
                             faceState1.setUserId(face.getUserId());
-                            faceState1.setCode(MeetingFaceVO.SUCCESS_CODE);
+                            faceState1.setCode(MeetingFaceVO.FORBIDDEN_FACE);
                             // 就算上一张人脸被禁用还得往下执行
                             // 可能当前用户存在多张人脸,
                             if (faceLength == 1){
@@ -77,8 +77,8 @@ public class MeetingFaceServiceImpl extends AbstractCrudService<MeetingFaceMappe
                         if (faceLength == 1){
                             // 判断当前人脸是否被禁用,如被禁用,提示被禁用
                             // 禁用优先级大于 没有检测到人脸
-                            faceState.setMsg(MeetingFaceVO.NOT_FOUND_FACE+"人脸库不存在该人脸");
-                            faceState.setCode(MeetingFaceVO.SUCCESS_CODE);
+                            faceState.setMsg("人脸不匹配,请联系管理员");
+                            faceState.setCode(MeetingFaceVO.NOT_FOUND_FACE);
                             return faceState;
                         }
                         faceLength --;
@@ -92,7 +92,7 @@ public class MeetingFaceServiceImpl extends AbstractCrudService<MeetingFaceMappe
             }
         }
         // 空异常
-        faceState.setMsg(MeetingFaceVO.NULL_ERROR+"空指针异常");
+        faceState.setMsg("人脸不存在,请联系管理员");
         faceState.setCode(MeetingFaceVO.NULL_ERROR);
         return faceState;
     }

+ 48 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/MeetingFileServiceImpl.java

@@ -1,11 +1,24 @@
 package com.usky.meeting.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.security.utils.SecurityUtils;
+import com.usky.meeting.domain.MeetingFace;
 import com.usky.meeting.domain.MeetingFile;
 import com.usky.meeting.mapper.MeetingFileMapper;
 import com.usky.meeting.service.MeetingFileService;
 import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.meeting.service.vo.MeetingFileListVO;
+import com.usky.meeting.service.vo.MeetingFileRequestVO;
+import org.springframework.beans.factory.wiring.BeanWiringInfo;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
+import java.util.List;
+
 /**
  * <p>
  * 会议文件 服务实现类
@@ -17,4 +30,39 @@ import org.springframework.stereotype.Service;
 @Service
 public class MeetingFileServiceImpl extends AbstractCrudService<MeetingFileMapper, MeetingFile> implements MeetingFileService {
 
+    @Override
+    public void insertMeetingFile(List<MeetingFileRequestVO> requestVOList){
+        if(requestVOList.size() > 0){
+            for (int i = 0; i < requestVOList.size(); i++) {
+                MeetingFile meetingFile = new MeetingFile();
+                meetingFile.setMeetingId(requestVOList.get(i).getMeetingId());
+                meetingFile.setFileUrl(requestVOList.get(i).getFileUrl());
+                meetingFile.setFileType(requestVOList.get(i).getFileType());
+                meetingFile.setUploadUser(SecurityUtils.getUsername());
+                meetingFile.setUploadTime(LocalDateTime.now());
+                meetingFile.setTenantId(SecurityUtils.getTenantId());
+                meetingFile.setFileName(requestVOList.get(i).getFileName());
+
+                this.save(meetingFile);
+            }
+        }
+
+    }
+
+    @Override
+    public CommonPage<MeetingFile> meetingFileList(MeetingFileListVO meetingFileListVO){
+        Integer current = meetingFileListVO.getCurrent();
+        Integer size = meetingFileListVO.getSize();
+
+        Page<MeetingFile> page = new Page<>(current,size);
+
+        LambdaQueryWrapper<MeetingFile> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(null != meetingFileListVO.getMeetingId(),MeetingFile::getMeetingId,meetingFileListVO.getMeetingId())
+                .like(StringUtils.isNotBlank(meetingFileListVO.getFileName()),MeetingFile::getFileName,meetingFileListVO.getFileName())
+                .eq(MeetingFile::getTenantId,SecurityUtils.getTenantId())
+                .orderByDesc(MeetingFile::getFileId);
+        page = this.page(page,queryWrapper);
+
+        return new CommonPage<>(page.getRecords(),page.getTotal(),size,current);
+    }
 }

+ 12 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/MeetingFloorServiceImpl.java

@@ -11,14 +11,18 @@ 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.domain.MeetingFloor;
+import com.usky.meeting.domain.MeetingRoom;
 import com.usky.meeting.mapper.MeetingFloorMapper;
+import com.usky.meeting.repository.MeetingRoomRepository;
 import com.usky.meeting.service.MeetingFloorService;
 import com.usky.common.mybatis.core.AbstractCrudService;
 import com.usky.meeting.service.vo.MeetingFloorRequestVO;
 import net.bytebuddy.implementation.bytecode.Throw;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
+import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
 
@@ -33,6 +37,9 @@ import java.util.Optional;
 @Service
 public class MeetingFloorServiceImpl extends AbstractCrudService<MeetingFloorMapper, MeetingFloor> implements MeetingFloorService {
 
+    @Autowired
+    private MeetingRoomRepository meetingRoomRepository;
+
     @Override
     public CommonPage<MeetingFloor> meetingFloorList(MeetingFloorRequestVO requestVO){
         Integer current = requestVO.getCurrent();
@@ -77,6 +84,11 @@ public class MeetingFloorServiceImpl extends AbstractCrudService<MeetingFloorMap
 
     @Override
     public void remove(Long floorId){
+        List<MeetingRoom> list = meetingRoomRepository.getMeetingRoomList(floorId);
+        if(list.size() > 0){
+            throw new BusinessException("当前楼层有关联会议室,不可删除");
+        }
+
         MeetingFloor meetingFloor = this.getById(floorId);
         Optional.ofNullable(meetingFloor).orElseThrow(() -> new BusinessException("该楼层信息不存在"));
 

+ 727 - 3
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/MeetingInfoServiceImpl.java

@@ -1,15 +1,64 @@
 package com.usky.meeting.service.impl;
 
-import com.usky.meeting.domain.MeetingInfo;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.http.HttpRequest;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.profile.DefaultProfile;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+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.google.common.base.Joiner;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.core.exception.BusinessException;
+import com.usky.common.core.util.DateUtils;
+import com.usky.common.security.utils.SecurityUtils;
+import com.usky.meeting.controller.web.SignOnOutRequestVO;
+import com.usky.meeting.domain.*;
+import com.usky.meeting.mapper.MeetingFloorMapper;
 import com.usky.meeting.mapper.MeetingInfoMapper;
-import com.usky.meeting.repository.MeetingInfoRepository;
+import com.usky.meeting.mapper.MeetingRoomMapper;
+import com.usky.meeting.repository.*;
+import com.usky.meeting.service.MeetingAttendeeService;
+import com.usky.meeting.service.MeetingFileService;
 import com.usky.meeting.service.MeetingInfoService;
 import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.meeting.service.SysUserService;
+import com.usky.meeting.service.dto.DmMeetingDto;
+import com.usky.meeting.service.dto.DmMeetingDtoV2;
+import com.usky.meeting.service.dto.DmUserDto;
+import com.usky.meeting.service.vo.MeetingInfoRequestVO;
+import com.usky.meeting.service.vo.MyMeetingInfoRequestVO;
+import io.swagger.models.auth.In;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import net.bytebuddy.dynamic.scaffold.MethodRegistry;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ObjectUtils;
 
-import java.util.Map;
+import java.math.BigInteger;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -20,11 +69,28 @@ import java.util.Map;
  * @since 2024-03-08
  */
 @Service
+@Slf4j
 @RequiredArgsConstructor
 public class MeetingInfoServiceImpl extends AbstractCrudService<MeetingInfoMapper, MeetingInfo> implements MeetingInfoService {
 
     @Autowired
     private MeetingInfoRepository dmMeetingRepository;
+    @Autowired
+    private MeetingAttendeeRepository meetingAttendeeRepository;
+    @Autowired
+    private MeetingRoomRepository meetingRoomRepository;
+    @Autowired
+    private SysUserService sysUserService;
+    @Autowired
+    private UserRepository userRepository;
+    @Autowired
+    private MeetingAttendeeService meetingAttendeeService;
+    @Autowired
+    private MeetingRoomMapper meetingRoomMapper;
+    @Autowired
+    private MeetingFloorMapper meetingFloorMapper;
+    @Autowired
+    private MeetingFileService meetingFileService;
 
     @Override
     public Map<String, Object> meetingSummary(Integer tenantId) {
@@ -35,4 +101,662 @@ public class MeetingInfoServiceImpl extends AbstractCrudService<MeetingInfoMappe
     public Map<String, Object> meetingSummaryByYear(String year,Integer tenantId) {
         return dmMeetingRepository.meetingSummaryByYear(year,tenantId);
     }
+
+    @Override
+    public JSONObject getMeetingRoomUsageByDayV2(Long roomId, String dayTime) throws ParseException {
+        JSONObject jsonObject = new JSONObject();
+        JSONArray array = new JSONArray();
+        JSONArray dmMeetingList = new JSONArray();
+
+        SimpleDateFormat dtf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date date = dtf.parse(dayTime);
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        //获取日期中得年
+        Integer year= cal.get(Calendar.YEAR);
+        System.out.println("year:"+year);
+        //获取日期中得月
+        Integer month= (cal.get(Calendar.MONTH) + 1);
+        System.out.println("month:"+month);
+        //获取日期中得日
+        Integer day= Integer.valueOf(String.format("%td", date));
+        List<MeetingInfo> dmMeetings = dmMeetingRepository.getDmMeetingByStartDatDay(roomId,year,month,day,SecurityUtils.getTenantId());
+        LambdaQueryWrapper<SysUser> sysUserQuery = Wrappers.lambdaQuery();
+        sysUserQuery.eq(SysUser::getTenantId,SecurityUtils.getTenantId());
+        List<SysUser> userList = sysUserService.list(sysUserQuery);
+        if(userList.size() <= 0){
+            throw new BusinessException("用户信息不能为空");
+        }
+
+        if(!ObjectUtil.isEmpty(dmMeetings)){
+            for(MeetingInfo dmMeeting : dmMeetings){
+                //参会人员信息
+                List<SysUser> attendeeUserList = new ArrayList<>();
+                List<MeetingAttendee> attendeeList = meetingAttendeeRepository.findMeetingAttendeeList(dmMeeting.getMeetingId(),null, SecurityUtils.getTenantId());
+                if(attendeeList.size() > 0){
+                    for (int i = 0; i < attendeeList.size(); i++) {
+                        Long uid = attendeeList.get(i).getUserId();
+                        for (int j = 0; j < userList.size(); j++) {
+                            if(uid.equals(userList.get(j).getUserId())){
+                                attendeeUserList.add(userList.get(j));
+                                break;
+                            }
+                        }
+                    }
+                }
+                dmMeeting.setUsers(attendeeUserList);
+                //发起人信息
+                for (int i = 0; i < userList.size(); i++) {
+                    if(userList.get(i).getUserId().equals(Long.valueOf(dmMeeting.getInitiatorId()))){
+                        dmMeeting.setInitiatorUser(userList.get(i));
+                        break;
+                    }
+                }
+
+                dmMeetingList.add(dmMeeting);
+                JSONArray dateArray = new JSONArray();
+                double meetingStartNumber = 0.0;
+                double meetingEndNumber = 0.0;
+                Timestamp meetingStartTimestamp = Timestamp.valueOf(dmMeeting.getStartDate());
+                Date meetingStartDate = new Date(meetingStartTimestamp.getTime());
+                Calendar meetingStartCal = Calendar.getInstance();
+                meetingStartCal.setTime(meetingStartDate);
+                if(cal.get(Calendar.YEAR) == meetingStartCal.get(Calendar.YEAR) && cal.get(Calendar.DAY_OF_YEAR) == meetingStartCal.get(Calendar.DAY_OF_YEAR)) {
+                    int meetingStartHours = meetingStartDate.getHours();
+                    meetingStartNumber = meetingStartNumber + meetingStartHours;
+                    int meetingStartMinutes = meetingStartDate.getMinutes();
+                    if (meetingStartMinutes >= 30) {
+                        meetingStartNumber = meetingStartNumber + 0.5;
+                    }
+                    dateArray.add(meetingStartNumber);
+                } else {
+                    meetingStartNumber = 0.0;
+                    dateArray.add(meetingStartNumber);
+                }
+                Timestamp meetingEndTimestamp = Timestamp.valueOf(dmMeeting.getEndDate());
+                Date meetingEndDate = new Date(meetingEndTimestamp.getTime());
+                Calendar meetingEndCal = Calendar.getInstance();
+                meetingEndCal.setTime(meetingEndDate);
+                if(cal.get(Calendar.YEAR) == meetingEndCal.get(Calendar.YEAR) && cal.get(Calendar.DAY_OF_YEAR) == meetingEndCal.get(Calendar.DAY_OF_YEAR)) {
+                    int meetingEndHours = meetingEndDate.getHours();
+                    meetingEndNumber = meetingEndNumber + meetingEndHours;
+                    int meetingEndMinutes = meetingEndDate.getMinutes();
+                    if (meetingEndMinutes >= 30) {
+                        meetingEndNumber = meetingEndNumber + 0.5;
+                        if (meetingEndMinutes == 59) {
+                            meetingEndNumber = meetingEndNumber + 0.5;
+                        }
+                    }
+                    dateArray.add(meetingEndNumber);
+                } else {
+                    meetingEndNumber = 24.0;
+                    dateArray.add(meetingEndNumber);
+                }
+                array.add(dateArray);
+            }
+        }
+        jsonObject.put("timeRange", array);
+        jsonObject.put("dmMeeting", dmMeetingList);
+        return jsonObject;
+    }
+
+    @Override
+    public List<Integer> getMeetingRoomUsageByMonth(Long roomId, String monthTime) throws ParseException {
+        SimpleDateFormat dtf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date date = dtf.parse(monthTime);
+        System.out.println("date:" + date);
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        //获取日期中得年
+        Integer year = cal.get(Calendar.YEAR);
+        System.out.println("year:" + year);
+        //获取日期中得月
+        Integer month = (cal.get(Calendar.MONTH) + 1);
+        System.out.println("month:" + month);
+
+        List<Map<String, Object>> dmMeetings = dmMeetingRepository.getDmMeetingByStartDateYearAndMonth(roomId, year, month, SecurityUtils.getTenantId());
+        if (!ObjectUtils.isEmpty(dmMeetings)) {
+            List<Integer> list = new ArrayList<>();
+            Set<Integer> set = new HashSet<>();
+            for (Map<String, Object> map : dmMeetings) {
+                Date startDate = dtf.parse(map.get("start_date").toString());
+                Date endDate = dtf.parse(map.get("end_date").toString());
+                Calendar calendar = Calendar.getInstance();
+                while (startDate.getTime() <= endDate.getTime()) {
+                    // 把日期添加到集合
+                    Integer startDay = Integer.valueOf(String.format("%td", startDate));
+                    set.add(startDay);
+                    // 设置日期
+                    calendar.setTime(startDate);
+                    //把日期增加一天
+                    calendar.add(Calendar.DATE, 1);
+                    // 获取增加后的日期
+                    startDate = calendar.getTime();
+                }
+
+            }
+            list.addAll(set);
+            return list;
+        }
+        return new ArrayList<>();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public DmMeetingDto add(DmMeetingDto resources) {
+        String meetingMode = resources.getMeetingMode().toString();
+        SysUser user = userRepository.getUserByDmUserId(resources.getInitiatorUser().getId());
+        if (meetingMode.equals("1")) {
+
+        } else if (meetingMode.equals("0") || meetingMode.equals("2")) {
+            //判断指定会议室预约的时间是否与存在的预约单冲突
+            List<Map<String, String>> dmMeetingList = dmMeetingRepository.checkDmRoomMeetingDate(resources.getRoom().getRoomId(), resources.getStartDate(), resources.getEndDate(), resources.getMeetingId());
+            if (dmMeetingList != null && dmMeetingList.size() > 0) {
+                throw new BusinessException("预约时间段冲突,请重设预约时间");
+            }
+            if (!ObjectUtils.isEmpty(resources.getRoom())) {
+                if (resources.getRoom().getStatus().equals("1")) {
+                    throw new BusinessException("该会议室已停用");
+                }
+                resources.setRoomName(resources.getRoom().getRoomName());
+            }
+            if (resources.getRoom().getIsApprove() == 1) {
+
+            } else {
+                resources.setApproveStatus(1);
+
+                try {
+                    send(resources);
+                } catch (ClientException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        resources.setIsDelay(0);
+        resources.setIsCancel(0);
+        resources.setMeetingStatus(0);
+        MeetingInfo meeting = this.toEntity(resources);
+        this.save(meeting);
+
+        //循环保存会议id和会议文件记录到会议文件表中
+        Long meetingId = meeting.getMeetingId();
+        if(!ObjectUtils.isEmpty(resources.getMeetingFileList())){
+            for (MeetingFile meetingFile : resources.getMeetingFileList()) {
+                meetingFile.setMeetingId(meetingId);
+                meetingFile.setUploadUser(SecurityUtils.getUsername());
+                meetingFile.setUploadTime(LocalDateTime.now());
+                meetingFile.setTenantId(SecurityUtils.getTenantId());
+                meetingFileService.save(meetingFile);
+            }
+        }
+
+        if (!ObjectUtils.isEmpty(resources.getUsers())) {
+            for(SysUser dmUser : resources.getUsers()){
+                MeetingAttendee meetingAttendee = new MeetingAttendee();
+                meetingAttendee.setMeetingId(meeting.getMeetingId());
+                meetingAttendee.setUserId(dmUser.getUserId());
+                meetingAttendee.setTenantId(SecurityUtils.getTenantId());
+                meetingAttendeeService.save(meetingAttendee);
+            }
+
+        }
+        return resources;
+    }
+
+    @Override
+    public CommonPage<MeetingInfo> meetingInfoList(MeetingInfoRequestVO requestVO){
+        Page<MeetingInfo> page = new Page<>(requestVO.getCurrent(),requestVO.getSize());
+
+        List<String> initiatorIdList = new ArrayList<>();
+        if(StringUtils.isNotBlank(requestVO.getName())){
+            LambdaQueryWrapper<SysUser> sysUserQuery = Wrappers.lambdaQuery();
+            sysUserQuery.like(SysUser::getNickName,requestVO.getName())
+                        .eq(SysUser::getTenantId,SecurityUtils.getTenantId());
+            List<SysUser> userList = sysUserService.list(sysUserQuery);
+            if(userList.size() > 0){
+                for (int i = 0; i < userList.size(); i++) {
+                    initiatorIdList.add(userList.get(i).getUserId().toString());
+                }
+            }
+        }
+
+        LambdaQueryWrapper<MeetingInfo> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.like(StringUtils.isNotBlank(requestVO.getRoomName()),MeetingInfo::getRoomName,requestVO.getRoomName())
+                .in(CollectionUtils.isNotEmpty(initiatorIdList),MeetingInfo::getInitiatorId,initiatorIdList)
+                .eq(null != requestVO.getMeetingStatus(),MeetingInfo::getMeetingStatus,requestVO.getMeetingStatus())
+                .eq(null != requestVO.getApproveStatus(),MeetingInfo::getApproveStatus,requestVO.getApproveStatus())
+                .between(StringUtils.isNotBlank(requestVO.getStartDate()) && StringUtils.isNotBlank(requestVO.getEndDate()),MeetingInfo::getStartDate,requestVO.getStartDate(),requestVO.getEndDate())
+                .between(StringUtils.isNotBlank(requestVO.getStartDate()) && StringUtils.isNotBlank(requestVO.getEndDate()),MeetingInfo::getEndDate,requestVO.getStartDate(),requestVO.getEndDate())
+                .eq(MeetingInfo::getTenantId,SecurityUtils.getTenantId())
+                .orderByDesc(MeetingInfo::getMeetingId);
+        page = this.page(page,queryWrapper);
+        if(page.getRecords().size() > 0){
+            List<Long> roomIdList = new ArrayList<>();
+            List<Long> initIdList = new ArrayList<>();
+            for (int i = 0; i < page.getRecords().size(); i++) {
+                if(!roomIdList.contains(page.getRecords().get(i).getRoomId())){
+                    roomIdList.add(page.getRecords().get(i).getRoomId());
+                }
+                if(!initIdList.contains(page.getRecords().get(i).getInitiatorId())){
+                    initIdList.add(Long.valueOf(page.getRecords().get(i).getInitiatorId()));
+                }
+            }
+            //房间以及对应楼层信息
+            if(roomIdList.size() > 0){
+                LambdaQueryWrapper<MeetingRoom> meetingRoomQuery = Wrappers.lambdaQuery();
+                meetingRoomQuery.in(MeetingRoom::getRoomId,roomIdList)
+                        .eq(MeetingRoom::getTenantId,SecurityUtils.getTenantId())
+                        .eq(MeetingRoom::getStatus,0);
+                List<MeetingRoom> meetingRoomList = meetingRoomMapper.selectList(meetingRoomQuery);
+
+                List<Long> floorIdList = new ArrayList<>();
+                if(meetingRoomList.size() > 0){
+                    for (int i = 0; i < meetingRoomList.size(); i++) {
+                        if(!floorIdList.contains(meetingRoomList.get(i).getFloorId())){
+                            floorIdList.add(meetingRoomList.get(i).getFloorId());
+                        }
+                    }
+                    LambdaQueryWrapper<MeetingFloor> floorWrapper = Wrappers.lambdaQuery();
+                    floorWrapper.in(MeetingFloor::getFloorId,floorIdList)
+                            .eq(MeetingFloor::getTenantId,SecurityUtils.getTenantId());
+                    List<MeetingFloor> meetingFloorList = meetingFloorMapper.selectList(floorWrapper);
+                    for (int i = 0; i < page.getRecords().size(); i++) {
+                        for (int j = 0; j < meetingRoomList.size(); j++) {
+                            if(page.getRecords().get(i).getRoomId().equals(meetingRoomList.get(j).getRoomId())){
+                                page.getRecords().get(i).setRoomInfo(meetingRoomList.get(j));
+                                break;
+                            }
+                        }
+                        for (int j = 0; j < meetingFloorList.size(); j++) {
+                            if(page.getRecords().get(i).getRoomInfo().getFloorId().equals(meetingFloorList.get(j).getFloorId())){
+                                page.getRecords().get(i).getRoomInfo().setMeetingFloor(meetingFloorList.get(j));
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+            //发起人信息
+            if(initIdList.size() > 0){
+                LambdaQueryWrapper<SysUser> initIdQuery = Wrappers.lambdaQuery();
+                initIdQuery.in(SysUser::getUserId,initIdList)
+                        .eq(SysUser::getTenantId,SecurityUtils.getTenantId());
+                List<SysUser> userList = sysUserService.list(initIdQuery);
+                if(userList.size() > 0){
+                    for (int i = 0; i < page.getRecords().size(); i++) {
+                        for (int j = 0; j < userList.size(); j++) {
+                            if(page.getRecords().get(i).getInitiatorId().equals(userList.get(j).getUserId().toString())){
+                                page.getRecords().get(i).setInitiatorUser(userList.get(j));
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+
+
+        }
+
+        return new CommonPage<>(page.getRecords(),page.getTotal(),requestVO.getSize(),requestVO.getCurrent());
+    }
+
+    @Override
+    public void cancel(Long meetingId){
+        MeetingInfo one = this.getById(meetingId);
+        one.setIsCancel(1);
+        this.updateById(one);
+    }
+
+    @Override
+    public CommonPage<MeetingInfo> myMeetingList(MyMeetingInfoRequestVO requestVO){
+        Integer current = requestVO.getCurrent();
+        Integer size = requestVO.getSize();
+        Page<MeetingInfo> page = new Page<>(current,size);
+
+        Long userId = SecurityUtils.getUserId();
+        List<BigInteger> meetingIdList = new ArrayList<>();
+        List<BigInteger> meetingIds1 = dmMeetingRepository.queryMeetingIdsByUserId(userId);
+        List<BigInteger> bigIntegers = dmMeetingRepository.queryMeetingIdsByInitiatorId(userId);
+        meetingIdList.addAll(meetingIds1);
+        meetingIdList.addAll(bigIntegers);
+        List<Long> meetingIds = new ArrayList<>();
+        for (BigInteger bigInteger : meetingIdList) {
+            meetingIds.add(bigInteger.longValue());
+        }
+        LambdaQueryWrapper<MeetingInfo> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.in(CollectionUtils.isNotEmpty(meetingIds),MeetingInfo::getMeetingId,meetingIds)
+                .eq(MeetingInfo::getIsCancel,0)
+                .like(StringUtils.isNotBlank(requestVO.getMeetingName()),MeetingInfo::getMeetingName,requestVO.getMeetingName())
+                .like(StringUtils.isNotBlank(requestVO.getMeetingDescribe()),MeetingInfo::getMeetingDescribe,requestVO.getMeetingDescribe())
+                .eq(null != requestVO.getMeetingMode(),MeetingInfo::getMeetingMode,requestVO.getMeetingMode())
+                .eq(null != requestVO.getMeetingStatus(),MeetingInfo::getMeetingStatus,requestVO.getMeetingStatus())
+                .between(StringUtils.isNotBlank(requestVO.getStartDate()) && StringUtils.isNotBlank(requestVO.getEndDate()),MeetingInfo::getStartDate,requestVO.getStartDate(),requestVO.getEndDate())
+                .between(StringUtils.isNotBlank(requestVO.getStartDate()) && StringUtils.isNotBlank(requestVO.getEndDate()),MeetingInfo::getEndDate,requestVO.getStartDate(),requestVO.getEndDate())
+                .eq(MeetingInfo::getTenantId,SecurityUtils.getTenantId())
+                .orderByDesc(MeetingInfo::getMeetingId);
+        page = this.page(page,queryWrapper);
+        if(page.getRecords().size() > 0){
+            List<Long> initIdList = new ArrayList<>();
+            for (int i = 0; i < page.getRecords().size(); i++) {
+                if(!initIdList.contains(page.getRecords().get(i).getInitiatorId())){
+                    initIdList.add(Long.valueOf(page.getRecords().get(i).getInitiatorId()));
+                }
+            }
+            //发起人信息
+            if(initIdList.size() > 0){
+                LambdaQueryWrapper<SysUser> initIdQuery = Wrappers.lambdaQuery();
+                initIdQuery.in(SysUser::getUserId,initIdList)
+                        .eq(SysUser::getTenantId,SecurityUtils.getTenantId());
+                List<SysUser> userList = sysUserService.list(initIdQuery);
+                if(userList.size() > 0){
+                    for (int i = 0; i < page.getRecords().size(); i++) {
+                        for (int j = 0; j < userList.size(); j++) {
+                            if(page.getRecords().get(i).getInitiatorId().equals(userList.get(j).getUserId().toString())){
+                                page.getRecords().get(i).setInitiatorUser(userList.get(j));
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+
+
+        }
+
+        return new CommonPage<>(page.getRecords(),page.getTotal(),size,current);
+    }
+
+    @Override
+    public List<Map<String,Object>> meetingSignList(Long meetingId){
+        Integer tenantId = SecurityUtils.getTenantId();
+        List<Map<String, Object>> signList = dmMeetingRepository.meetingSignList(meetingId,tenantId);
+        return signList;
+    }
+
+    @Override
+    public void signOnOut(SignOnOutRequestVO requestVO){
+        LambdaQueryWrapper<MeetingAttendee> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(MeetingAttendee::getMeetingId,requestVO.getMeetingId())
+                .eq(MeetingAttendee::getUserId,requestVO.getUserId())
+                .eq(MeetingAttendee::getTenantId,SecurityUtils.getTenantId());
+        MeetingAttendee one = meetingAttendeeService.getOne(queryWrapper);
+        //签到签退类别(0.签到 1.签退)
+        if(requestVO.getMothodType().equals(0)){
+            one.setIsSign(1);
+            one.setSignDate(LocalDateTime.now());
+            //签到签退方式(0.人工 1.人脸)
+            one.setSignType(requestVO.getSignType());
+
+        }else{
+            one.setIsSignOut(1);
+            one.setSignOutDate(LocalDateTime.now());
+            one.setSignOutType(requestVO.getSignType());
+        }
+        meetingAttendeeService.updateById(one);
+
+    }
+
+    //UPDATE meeting_info SET meeting_status = 0 WHERE is_cancel = 0 AND meeting_status != 2 AND start_date > SYSDATE;
+    //UPDATE meeting_info SET meeting_status = 1 WHERE is_cancel = 0 AND meeting_status != 2 AND start_date <= SYSDATE AND end_date >= SYSDATE;
+    //UPDATE meeting_info SET meeting_status = 2 WHERE is_cancel = 0 AND meeting_status != 2 AND end_date < SYSDATE;
+    @Override
+    public void updateMeetingInfoStatus(){
+        //根据使用中的会议id去更新对应会议室的状态
+        //更新会议室使用状态为 1-使用中
+        LambdaQueryWrapper<MeetingInfo> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(MeetingInfo::getIsCancel,0)
+                .ne(MeetingInfo::getMeetingStatus,2)
+                .le(MeetingInfo::getStartDate,LocalDateTime.now())
+                .ge(MeetingInfo::getEndDate,LocalDateTime.now());
+        List<MeetingInfo> list = this.list(queryWrapper);
+        Set<Long> roomIdList = new HashSet<>();
+        if(list.size() > 0){
+            for (int i = 0; i < list.size(); i++) {
+                roomIdList.add(list.get(i).getRoomId());
+            }
+        }
+        meetingRoomRepository.updateMeetingRoomStatusOnUse(roomIdList);
+        //更新将会议室使用状态恢复为 0-未使用
+        LambdaQueryWrapper<MeetingInfo> queryWrapper1 = Wrappers.lambdaQuery();
+        queryWrapper1.eq(MeetingInfo::getIsCancel,0)
+                .ne(MeetingInfo::getMeetingStatus,2)
+                .lt(MeetingInfo::getEndDate,LocalDateTime.now());
+        List<MeetingInfo> list1 = this.list(queryWrapper1);
+        Set<Long> roomIdList1 = new HashSet<>();
+        if(list1.size() > 0){
+            for (int i = 0; i < list1.size(); i++) {
+                if(!roomIdList.contains(list1.get(i).getRoomId())){
+                    roomIdList1.add(list1.get(i).getRoomId());
+                }
+            }
+        }
+        meetingRoomRepository.updateMeetingRoomStatusFreeUse(roomIdList1);
+
+
+        UpdateWrapper<MeetingInfo> updateWrapper = Wrappers.update();
+        updateWrapper.set("meeting_status",1)
+                .eq("is_cancel",0)
+                .ne("meeting_status",2)
+                .le("start_date",LocalDateTime.now())
+                .ge("end_date",LocalDateTime.now());
+        this.update(updateWrapper);
+        UpdateWrapper<MeetingInfo> updateWrapper1 = Wrappers.update();
+        updateWrapper1.set("meeting_status",2)
+                .eq("is_cancel",0)
+                .ne("meeting_status",2)
+                .lt("end_date",LocalDateTime.now());
+        this.update(updateWrapper1);
+    }
+
+    public void send(DmMeetingDto resources) throws ClientException {
+
+        if (StringUtils.isNotBlank(resources.getSendType())) {
+            String[] typeList = resources.getSendType().split(",");
+            if(typeList.length > 0){
+                for (int i = 0; i < typeList.length; i++) {
+                    String sendType = typeList[i];
+
+                    if (sendType.equals("短信")) {
+                        for (SysUser dmUser : resources.getUsers()) {
+                            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                            String sj = resources.getStartDate();
+                            DefaultProfile profile = DefaultProfile.getProfile("cn-beijing", "LTAI5tH3VvRL5BUkovCokHJX", "SaaWUouNqvcA0C746gcNOH9m6SRYN4");
+                            IAcsClient client = new DefaultAcsClient(profile);
+                            SendSmsRequest request = new SendSmsRequest();
+                            request.setPhoneNumbers(dmUser.getPhonenumber());//接收短信的手机号码
+                            request.setSignName("上海永天科技股份有限公司");//短信签名名称
+                            request.setTemplateCode("SMS_465362899");//短信模板CODE
+                            request.setTemplateParam("{\"meet\":\""+resources.getMeetingName()+"\","+"\"time\":\""+resources.getStartDate()+"\","+
+                                    "\"room\":\""+resources.getRoomName()+"\"}");
+                            SendSmsResponse code = client.getAcsResponse(request);
+                            if(code.getCode() != null && code.getCode().equals("OK")) {
+                                //请求成功
+                            }else {
+                                throw new BusinessException("发送短信失败");
+                            }
+                        }
+
+
+                    } else if (sendType.equals("Email")) {
+//                List<String> emailList = new ArrayList<>();
+//                if (!ObjectUtils.isEmpty(resources.getUserList())) {
+//                    for (DmUserDto dmUserDto : resources.getUserList()) {
+//                        if (!ObjectUtils.isEmpty(dmUserDto.getEmail()) && !StringUtils.equals(dmUserDto.getId(), resources.getInitiatorUser().getId())) {
+//                            emailList.add(dmUserDto.getEmail());
+//                        }
+//                    }
+//                } else {
+//                    for (User dmUser : resources.getUsers()) {
+//                        if (!ObjectUtils.isEmpty(dmUser.getEmail()) && !StringUtils.equals(dmUser.getId(), resources.getInitiatorUser().getId())) {
+//                            emailList.add(dmUser.getEmail());
+//                        }
+//                    }
+//                }
+//                log.info("emailList:" + emailList);
+//                SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//                String sj = sf.format(resources.getStartDate());
+//                String sendContent2 = "您已受邀参加会议:" + resources.getMeetingName() + ",该会议将于" + sj + " 在" + resources.getRoomName() + "举行。请您及时准备相关参会材料,并请准时出席。";
+//                sendEmail(user.getEmail(), emailList, "会议预约通知", sendContent2);
+                    }
+                }
+            }
+        }
+    }
+
+//    //邮箱通知
+//    public void sendEmail(String recipientMailbox, List<String> recipientMailbox1, String emailSubject, String messageBody) {
+//        // 发送人的邮件和密码
+//        String myEmailAccount = EmailProperties.myEmailAccount;
+//        String myEmailPassword = EmailProperties.myEmailPassword;
+//        SendMailUtils.sendMail(myEmailAccount, myEmailPassword, recipientMailbox, recipientMailbox1, null, emailSubject, messageBody, false);
+//    }
+
+//    public JSONObject reserveMeetingData(DmMeetingDto resources) {
+//        String reserveMeetingUrl = UrlProperties.erpYyUrl + "/api-im-logic/busi/meeting/reserveMeeting";
+//        JSONObject reserveMeetingJson = new JSONObject();
+//        reserveMeetingJson.put("originatorId", resources.getInitiatorUser().getId());
+//        reserveMeetingJson.put("originatorName", resources.getInitiatorUser().getName());
+//        reserveMeetingJson.put("meetingTitle", resources.getMeetingName());
+//        reserveMeetingJson.put("meetingType", "video");
+//        reserveMeetingJson.put("meetingStartTime", resources.getStartDate().getTime());
+//        long diff = resources.getEndDate().getTime() - resources.getStartDate().getTime();
+//        long min = diff / (1000 * 60);
+//        reserveMeetingJson.put("appointmentDuration", min * 60);
+//        reserveMeetingJson.put("appointmentRemindDuration", 60);
+//        reserveMeetingJson.put("advanceTime", null);
+//        reserveMeetingJson.put("remarks", resources.getMeetingDescribe());
+//        JSONArray invitedUserList = new JSONArray();
+//        if (ObjectUtils.isEmpty(resources.getUserList())) {
+//            Set<User> userList = resources.getUsers();
+//            for (User dmUserDto : userList) {
+//                DmUserDto dmUserDto1 = dmUserService.findById(dmUserDto.getId());
+//                JSONObject invitedUser = new JSONObject();
+//                invitedUser.put("userId", dmUserDto1.getId());
+//                invitedUser.put("userName", dmUserDto1.getName());
+//                invitedUser.put("jobName", dmUserDto1.getDept().getName());
+//                invitedUser.put("mobile", dmUserDto1.getContacts());
+//                invitedUserList.add(invitedUser);
+//            }
+//        } else {
+//            Set<DmUserDto> userList = resources.getUserList();
+//            for (DmUserDto dmUserDto : userList) {
+//                DmUserDto dmUserDto1 = dmUserService.findById(dmUserDto.getId());
+//                JSONObject invitedUser = new JSONObject();
+//                invitedUser.put("userId", dmUserDto1.getId());
+//                invitedUser.put("userName", dmUserDto1.getName());
+//                invitedUser.put("jobName", dmUserDto1.getDept().getName());
+//                invitedUser.put("mobile", dmUserDto1.getContacts());
+//                invitedUserList.add(invitedUser);
+//            }
+//        }
+//        reserveMeetingJson.put("invitedUserList", invitedUserList);
+//        Map<String, String> headersMap = new HashMap<String, String>();
+//        headersMap.put("Content-Type", "application/json; charset=utf-8");
+//        headersMap.put("serviceId", "USky");
+//        headersMap.put("serviceUserId", resources.getInitiatorUser().getId());
+//        log.info("reserveMeetingJson:" + reserveMeetingJson.toJSONString());
+//        String reserveMeetingData = HttpClientUtil.sendPost(reserveMeetingUrl, "POST", headersMap, reserveMeetingJson.toString());
+//        log.info("reserveMeetingData:" + reserveMeetingData);
+//        try {
+//            JSONObject reserveMeetingDataJson = JSONObject.parseObject(reserveMeetingData);
+//            String code = reserveMeetingDataJson.getString("code");
+//            if (!StringUtils.equals(code, "0000")) {
+//                saveLog("ERP系统预约会议接口返回失败!", reserveMeetingData, reserveMeetingJson.toJSONString(), UrlProperties.erpYyUrl, "/api-im-logic/busi/meeting/reserveMeeting");
+//            }
+//            return reserveMeetingDataJson;
+//        } catch (Exception ex) {
+//            saveLog("ERP系统预约会议接口返回失败!", reserveMeetingData, reserveMeetingJson.toJSONString(), UrlProperties.erpYyUrl, "/api-im-logic/busi/meeting/reserveMeeting");
+//            throw new BadRequestException("ERP系统预约会议接口返回失败!");
+//        }
+//    }
+
+    public MeetingInfo toEntity(DmMeetingDto dto) {
+        if ( dto == null ) {
+            return null;
+        }
+
+        MeetingInfo dmMeeting = new MeetingInfo();
+
+        dmMeeting.setCreateBy(SecurityUtils.getUsername());
+        dmMeeting.setCreateTime(LocalDateTime.now());
+        dmMeeting.setTenantId(SecurityUtils.getTenantId());
+        dmMeeting.setMeetingName( dto.getMeetingName() );
+        dmMeeting.setRoomId(dto.getRoomId());
+        dmMeeting.setRoomName( dto.getRoomName() );
+        dmMeeting.setMeetingDescribe( dto.getMeetingDescribe() );
+        dmMeeting.setMeetingType( dto.getMeetingType() );
+        dmMeeting.setInitiatorId(dto.getInitiatorUser().getId());
+        dmMeeting.setStartDate(LocalDateTime.parse(dto.getStartDate(),DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) );
+        dmMeeting.setEndDate(LocalDateTime.parse(dto.getEndDate(),DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) );
+        dmMeeting.setApproveStatus( dto.getApproveStatus() );
+        dmMeeting.setApproveSuggest( dto.getApproveSuggest() );
+        dmMeeting.setActualCount( dto.getActualCount() );
+        dmMeeting.setPlanCount( dto.getPlanCount() );
+        dmMeeting.setIsDelay( dto.getIsDelay() );
+        dmMeeting.setRemark( dto.getRemark() );
+        dmMeeting.setMeetingStatus( dto.getMeetingStatus() );
+        dmMeeting.setTaskId( dto.getTaskId() );
+        dmMeeting.setProcInstId( dto.getProcInstId() );
+        dmMeeting.setIsCancel( dto.getIsCancel() );
+        dmMeeting.setSendType( dto.getSendType() );
+        dmMeeting.setIsApprove( dto.getIsApprove() );
+        dmMeeting.setMeetingMode( dto.getMeetingMode() );
+
+        return dmMeeting;
+    }
+//
+//    @Override
+//    public DmMeetingDto toDto(MeetingInfo entity) {
+//        if ( entity == null ) {
+//            return null;
+//        }
+//
+//        DmMeetingDto dmMeetingDto = new DmMeetingDto();
+//
+//        dmMeetingDto.setCreateBy( entity.getCreateBy() );
+//        dmMeetingDto.setUpdateBy( entity.getUpdateBy() );
+//        dmMeetingDto.setCreateTime( entity.getCreateTime() );
+//        dmMeetingDto.setUpdateTime( entity.getUpdateTime() );
+//        dmMeetingDto.setMeetingId( entity.getMeetingId() );
+//        dmMeetingDto.setMeetingName( entity.getMeetingName() );
+//        dmMeetingDto.setRoom( dmMeetingRoomToDmMeetingRoomDto( entity.getRoom() ) );
+//        dmMeetingDto.setRoomName( entity.getRoomName() );
+//        dmMeetingDto.setMeetingDescribe( entity.getMeetingDescribe() );
+//        dmMeetingDto.setMeetingType( entity.getMeetingType() );
+//        dmMeetingDto.setDept( deptToDeptDto( entity.getDept() ) );
+//        dmMeetingDto.setInitiatorUser( dmUserToDmUserDto( entity.getInitiatorUser() ) );
+//        Set<User> set = entity.getUsers();
+//        if ( set != null ) {
+//            dmMeetingDto.setUsers( new HashSet<User>( set ) );
+//        }
+//        Set<LocalStorage> set1 = entity.getLocalStorages();
+//        if ( set1 != null ) {
+//            dmMeetingDto.setLocalStorages( new HashSet<LocalStorage>( set1 ) );
+//        }
+//        Set<DmDevice> set2 = entity.getDmDevices();
+//        if ( set2 != null ) {
+//            dmMeetingDto.setDmDevices( new HashSet<DmDevice>( set2 ) );
+//        }
+//        dmMeetingDto.setStartDate( entity.getStartDate() );
+//        dmMeetingDto.setEndDate( entity.getEndDate() );
+//        dmMeetingDto.setApproveStatus( entity.getApproveStatus() );
+//        dmMeetingDto.setApproveSuggest( entity.getApproveSuggest() );
+//        dmMeetingDto.setActualCount( entity.getActualCount() );
+//        dmMeetingDto.setPlanCount( entity.getPlanCount() );
+//        dmMeetingDto.setIsDelay( entity.getIsDelay() );
+//        dmMeetingDto.setRemark( entity.getRemark() );
+//        dmMeetingDto.setMeetingStatus( entity.getMeetingStatus() );
+//        dmMeetingDto.setTaskId( entity.getTaskId() );
+//        dmMeetingDto.setProcInstId( entity.getProcInstId() );
+//        dmMeetingDto.setIsCancel( entity.getIsCancel() );
+//        dmMeetingDto.setSendType( entity.getSendType() );
+//        dmMeetingDto.setMeetingProp( entity.getMeetingProp() );
+//        dmMeetingDto.setIsApprove( entity.getIsApprove() );
+//        if ( entity.getGcAssignUser() != null ) {
+//            dmMeetingDto.setGcAssignUser( Long.parseLong( entity.getGcAssignUser() ) );
+//        }
+//        dmMeetingDto.setMeetingMode( entity.getMeetingMode() );
+//
+//        return dmMeetingDto;
+//    }
 }

+ 202 - 53
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/MeetingRoomServiceImpl.java

@@ -1,5 +1,8 @@
 package com.usky.meeting.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -7,27 +10,32 @@ 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.fasterxml.jackson.databind.type.CollectionLikeType;
 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.domain.MeetingAttendee;
-import com.usky.meeting.domain.MeetingFloor;
-import com.usky.meeting.domain.MeetingRoom;
+import com.usky.meeting.domain.*;
 import com.usky.meeting.mapper.MeetingRoomMapper;
 import com.usky.meeting.repository.MeetingAttendeeRepository;
+import com.usky.meeting.repository.MeetingDeviceRepository;
+import com.usky.meeting.repository.MeetingInfoRepository;
 import com.usky.meeting.repository.MeetingRoomRepository;
-import com.usky.meeting.service.MeetingFloorService;
-import com.usky.meeting.service.MeetingInfoService;
-import com.usky.meeting.service.MeetingRoomService;
+import com.usky.meeting.service.*;
 import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.meeting.service.dto.DmMeetingRoomDto;
 import com.usky.meeting.service.vo.MeetingRoomRequestVO;
+import com.usky.meeting.service.vo.MeetingRoomReservationVO;
 import lombok.RequiredArgsConstructor;
 import org.apache.tomcat.jni.Local;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
 
 import java.math.BigInteger;
+import java.sql.Timestamp;
+import java.text.ParseException;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 
 /**
@@ -50,62 +58,70 @@ public class MeetingRoomServiceImpl extends AbstractCrudService<MeetingRoomMappe
     private MeetingInfoService dmMeetingService;
     @Autowired
     private MeetingFloorService dmFloorService;
+    @Autowired
+    private MeetingDeviceRepository meetingDeviceRepository;
+    @Autowired
+    private MeetingInfoRepository meetingInfoRepository;
+    @Autowired
+    private SysUserService sysUserService;
 
     @Override
-    public Map<String,Object> FirstPageStatistic(String year){
-        Map<String,Object> map = new HashMap<>();
+    public Map<String, Object> FirstPageStatistic(String year) {
+        Map<String, Object> map = new HashMap<>();
         Integer tenantId = SecurityUtils.getTenantId();
-        Map<String,Object> roomSummary = dmMeetingRoomRepository.roomSummary(tenantId);
-        map.put("roomSummary",roomSummary);
-        Map<String,Object> meetingSummary = dmMeetingService.meetingSummary(tenantId);
-        map.put("meetingSummary",meetingSummary);
-        Map<String,Object> meetingSummaryByYear = dmMeetingService.meetingSummaryByYear(year,tenantId);
-        map.put("meetingSummaryByYear",meetingSummaryByYear);
+        Map<String, Object> roomSummary = dmMeetingRoomRepository.roomSummary(tenantId);
+        map.put("roomSummary", roomSummary);
+        Map<String, Object> meetingSummary = dmMeetingService.meetingSummary(tenantId);
+        map.put("meetingSummary", meetingSummary);
+        Map<String, Object> meetingSummaryByYear = dmMeetingService.meetingSummaryByYear(year, tenantId);
+        map.put("meetingSummaryByYear", meetingSummaryByYear);
 
         return map;
     }
 
     @Override
-    public CommonPage<MeetingRoom> dmMeetingRoomList(MeetingRoomRequestVO requestVO){
-        IPage<MeetingRoom> page = new Page<>(requestVO.getCurrent(),requestVO.getSize());
+    public CommonPage<MeetingRoom> dmMeetingRoomList(MeetingRoomRequestVO requestVO) {
+        IPage<MeetingRoom> page = new Page<>(requestVO.getCurrent(), requestVO.getSize());
 
-        String floorId = null ;
-        if(StringUtils.isNotBlank(requestVO.getFloorName())){
+        String floorId = null;
+        if (StringUtils.isNotBlank(requestVO.getFloorName())) {
             QueryWrapper<MeetingFloor> query = Wrappers.query();
-            query.select("floor_id").eq("floor_name",requestVO.getFloorName());
-            List<Map<String,Object>> map = dmFloorService.listMaps(query);
-            if(CollectionUtils.isNotEmpty(map)){
+            query.select("floor_id").eq("floor_name", requestVO.getFloorName())
+                    .eq("tenant_id", SecurityUtils.getTenantId());
+            List<Map<String, Object>> map = dmFloorService.listMaps(query);
+            if (CollectionUtils.isNotEmpty(map)) {
                 floorId = map.get(0).get("floor_id").toString();
             }
         }
 
         LambdaQueryWrapper<MeetingRoom> queryWrapper = Wrappers.lambdaQuery();
-        queryWrapper.like(StringUtils.isNotBlank(requestVO.getRoomName()),MeetingRoom::getRoomName,requestVO.getRoomName())
-                .eq(StringUtils.isNotBlank(floorId),MeetingRoom::getFloorId,floorId)
-                .eq(StringUtils.isNotBlank(requestVO.getStatus()),MeetingRoom::getStatus,requestVO.getStatus())
-                .eq(null != requestVO.getRoomStatus(),MeetingRoom::getRoomStatus,requestVO.getRoomStatus())
+        queryWrapper.like(StringUtils.isNotBlank(requestVO.getRoomName()), MeetingRoom::getRoomName, requestVO.getRoomName())
+                .eq(StringUtils.isNotBlank(floorId), MeetingRoom::getFloorId, floorId)
+                .eq(null != requestVO.getStatus(), MeetingRoom::getStatus, requestVO.getStatus())
+                .eq(null != requestVO.getRoomStatus(), MeetingRoom::getRoomStatus, requestVO.getRoomStatus())
                 .eq(MeetingRoom::getTenantId, SecurityUtils.getTenantId())
                 .orderByDesc(MeetingRoom::getRoomId);
-        page = this.page(page,queryWrapper);
-        if(CollectionUtils.isNotEmpty(page.getRecords())){
+        page = this.page(page, queryWrapper);
+        if (CollectionUtils.isNotEmpty(page.getRecords())) {
             //查询楼层信息和本地存储信息
-            List<BigInteger> floorIdList = new ArrayList<>();
+            List<Long> floorIdList = new ArrayList<>();
             for (int i = 0; i < page.getRecords().size(); i++) {
-                BigInteger floorId1 = new BigInteger(page.getRecords().get(i).getFloorId());
-                if(!floorIdList.contains(floorId1)){
+                Long floorId1 = page.getRecords().get(i).getFloorId();
+                if (!floorIdList.contains(floorId1)) {
                     floorIdList.add(floorId1);
                 }
             }
             LambdaQueryWrapper<MeetingFloor> floorQuery = Wrappers.lambdaQuery();
-            floorQuery.in(CollectionUtils.isNotEmpty(floorIdList), MeetingFloor::getFloorId,floorIdList);
+            floorQuery.in(CollectionUtils.isNotEmpty(floorIdList), MeetingFloor::getFloorId, floorIdList)
+                    .eq(MeetingFloor::getTenantId, SecurityUtils.getTenantId());
             List<MeetingFloor> floorList = dmFloorService.list(floorQuery);
 
             //会议室匹配对应楼层信息和本地存储信息
             for (int i = 0; i < page.getRecords().size(); i++) {
-                if(CollectionUtils.isNotEmpty(floorList)){
+                if (CollectionUtils.isNotEmpty(floorList)) {
                     Long frId = Long.valueOf(page.getRecords().get(i).getFloorId());
                     for (int j = 0; j < floorList.size(); j++) {
-                        if(frId.equals(floorList.get(j).getFloorId())){
+                        if (frId.equals(floorList.get(j).getFloorId())) {
                             page.getRecords().get(i).setMeetingFloor(floorList.get(j));
                             break;
                         }
@@ -115,11 +131,11 @@ public class MeetingRoomServiceImpl extends AbstractCrudService<MeetingRoomMappe
         }
 
 
-        return new CommonPage<>(page.getRecords(),page.getTotal(),requestVO.getSize(),requestVO.getCurrent());
+        return new CommonPage<>(page.getRecords(), page.getTotal(), requestVO.getSize(), requestVO.getCurrent());
     }
 
     @Override
-    public List<MeetingRoom> MeetingRoomList(){
+    public List<MeetingRoom> MeetingRoomList() {
         LambdaQueryWrapper<MeetingRoom> queryWrapper = Wrappers.lambdaQuery();
         queryWrapper.eq(MeetingRoom::getTenantId, SecurityUtils.getTenantId());
         List<MeetingRoom> list = this.list(queryWrapper);
@@ -128,9 +144,9 @@ public class MeetingRoomServiceImpl extends AbstractCrudService<MeetingRoomMappe
     }
 
     @Override
-    public void add(MeetingRoom meetingRoom){
-        if(checkNameUnique(meetingRoom)){
-            throw new BusinessException("新增会议室房间失败,"+meetingRoom.getRoomName()+"已经存在");
+    public void add(MeetingRoom meetingRoom) {
+        if (checkNameUnique(meetingRoom)) {
+            throw new BusinessException("新增会议室房间失败," + meetingRoom.getRoomName() + "已经存在");
         }
         meetingRoom.setRoomStatus(0);
         meetingRoom.setReserveStatus(0);
@@ -142,9 +158,9 @@ public class MeetingRoomServiceImpl extends AbstractCrudService<MeetingRoomMappe
     }
 
     @Override
-    public void edit(MeetingRoom meetingRoom){
-        if(checkNameUnique(meetingRoom)){
-            throw new BusinessException("修改会议室房间失败,"+meetingRoom.getRoomName()+"已经存在");
+    public void edit(MeetingRoom meetingRoom) {
+        if (checkNameUnique(meetingRoom)) {
+            throw new BusinessException("修改会议室房间失败," + meetingRoom.getRoomName() + "已经存在");
         }
         meetingRoom.setUpdateBy(SecurityUtils.getUsername());
         meetingRoom.setUpdateTime(LocalDateTime.now());
@@ -153,7 +169,16 @@ public class MeetingRoomServiceImpl extends AbstractCrudService<MeetingRoomMappe
     }
 
     @Override
-    public void remove(Long roomId){
+    public void remove(Long roomId) {
+        List<MeetingDevice> deviceList = meetingDeviceRepository.getDeviceListByRoomId(roomId);
+        if (deviceList.size() > 0) {
+            throw new BusinessException("会议室有绑定设备,不可删除");
+        }
+        List<MeetingInfo> meetingList = meetingInfoRepository.queryAllMeetingByRoomId(roomId);
+        if (meetingList.size() > 0) {
+            throw new BusinessException("有会议记录不可删除");
+        }
+
         MeetingRoom one = this.getById(roomId);
         Optional.ofNullable(one).orElseThrow(() -> new BusinessException("该会议室房间不存在"));
 
@@ -161,26 +186,150 @@ public class MeetingRoomServiceImpl extends AbstractCrudService<MeetingRoomMappe
     }
 
     @Override
-    public Map<String,Object> attendee(Long meetingId, Long userId, String userName){
+    public Map<String, Object> attendee(Long meetingId, Long userId, String userName) {
         Map<String, Object> map = new HashMap<>();
         Integer tenantId = SecurityUtils.getTenantId();
-        map.put("userName",userName);
-        List<MeetingAttendee> list = meetingAttendeeRepository.findMeetingAttendeeList(meetingId,userId,tenantId);
-        if(org.springframework.util.CollectionUtils.isEmpty(list)){
-            map.put("msg","没有会议");
-        }else{
-            map.put("msg","验证成功");
+        map.put("userName", userName);
+        List<MeetingAttendee> list = meetingAttendeeRepository.findMeetingAttendeeList(meetingId, userId, tenantId);
+        if (org.springframework.util.CollectionUtils.isEmpty(list)) {
+            map.put("msg", "您当前没有需要参加的会议");
+        } else {
+            map.put("msg", "验证成功");
         }
         return map;
     }
 
-    public boolean checkNameUnique(MeetingRoom meetingRoom){
-        Long id = null == meetingRoom.getRoomId()?-1:meetingRoom.getRoomId();
+    @Override
+    public List<DmMeetingRoomDto> getMeetingRoomReservationList(MeetingRoomReservationVO reservationVO) throws ParseException {
+        List<DmMeetingRoomDto> list = new ArrayList<>();
+        List<DmMeetingRoomDto> newDmMeetingRoomDtoList = new ArrayList<>();
+        Long meetingRoomId = reservationVO.getMeetingRoomId();
+        LambdaQueryWrapper<MeetingRoom> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(meetingRoomId != null, MeetingRoom::getRoomId, meetingRoomId)
+                .eq(MeetingRoom::getTenantId, SecurityUtils.getTenantId());
+        List<MeetingRoom> list1 = this.list(queryWrapper);
+        List<Long> floorIdList = new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(list1)) {
+            for (int i = 0; i < list1.size(); i++) {
+                if (!floorIdList.contains(list1.get(i).getFloorId())) {
+                    floorIdList.add(list1.get(i).getFloorId());
+                }
+            }
+            LambdaQueryWrapper<MeetingFloor> floorWrapper = Wrappers.lambdaQuery();
+            floorWrapper.in(MeetingFloor::getFloorId, floorIdList)
+                    .eq(MeetingFloor::getTenantId, SecurityUtils.getTenantId());
+            List<MeetingFloor> meetingFloorList = dmFloorService.list(floorWrapper);
+            if (CollectionUtils.isNotEmpty(meetingFloorList)) {
+                for (int i = 0; i < list1.size(); i++) {
+                    DmMeetingRoomDto dmMeetingRoomDto = new DmMeetingRoomDto();
+                    dmMeetingRoomDto.setRoomId(list1.get(i).getRoomId());
+                    dmMeetingRoomDto.setRoomName(list1.get(i).getRoomName());
+                    for (int j = 0; j < meetingFloorList.size(); j++) {
+                        if (list1.get(i).getFloorId().equals(meetingFloorList.get(j).getFloorId())) {
+                            dmMeetingRoomDto.setDmFloor(meetingFloorList.get(j));
+                            break;
+                        }
+                    }
+                    dmMeetingRoomDto.setDescription(list1.get(i).getDescription());
+                    dmMeetingRoomDto.setImgPath(list1.get(i).getImgPath());
+                    dmMeetingRoomDto.setCapacity(list1.get(i).getCapacity());
+                    dmMeetingRoomDto.setPosition(list1.get(i).getPosition());
+                    dmMeetingRoomDto.setMaintainer(list1.get(i).getMaintainer());
+                    dmMeetingRoomDto.setContacts(list1.get(i).getContacts());
+                    dmMeetingRoomDto.setRemark(list1.get(i).getRemark());
+                    dmMeetingRoomDto.setRoomStatus(list1.get(i).getRoomStatus());
+                    dmMeetingRoomDto.setReserveStatus(list1.get(i).getReserveStatus());
+                    dmMeetingRoomDto.setStatus(list1.get(i).getStatus());
+                    dmMeetingRoomDto.setEnvironmental(list1.get(i).getEnvironmental());
+                    dmMeetingRoomDto.setLastUseTime(list1.get(i).getLastUseTime());
+                    dmMeetingRoomDto.setIsApprove(list1.get(i).getIsApprove());
+                    list.add(dmMeetingRoomDto);
+                }
+            }
+        }
+        if (list.size() > 0) {
+            for (DmMeetingRoomDto dmMeetingRoomDto : list) {
+                if (ObjectUtils.isEmpty(reservationVO.getDate())) {
+                    reservationVO.setDate(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+                }
+                JSONObject meetingRoomUsageByDayV2 = dmMeetingService.getMeetingRoomUsageByDayV2(dmMeetingRoomDto.getRoomId(), reservationVO.getDate());
+
+                JSONArray dmMeeting = meetingRoomUsageByDayV2.getJSONArray("dmMeeting");
+                dmMeetingRoomDto.setDmMeetingList(dmMeeting);
+
+                dmMeetingRoomDto.setMeetingRoomUsage(meetingRoomUsageByDayV2.getJSONArray("timeRange"));
+                List<Integer> monthList = dmMeetingService.getMeetingRoomUsageByMonth(dmMeetingRoomDto.getRoomId(), reservationVO.getDate());
+                dmMeetingRoomDto.setMeetingRoomUsageMonth(monthList);
+
+                newDmMeetingRoomDtoList.add(dmMeetingRoomDto);
+            }
+        }
+
+        return newDmMeetingRoomDtoList;
+    }
+
+    @Override
+    public MeetingRoom meetingRoomDetails(Long roomId) {
+        //查询会议室基础信息
+        MeetingRoom meetingRoom = this.getById(roomId);
+
+        //楼层信息
+        Long floorId = meetingRoom.getFloorId();
+        MeetingFloor meetingFloor = dmFloorService.getById(floorId);
+
+        //会议室设备列表
+        List<MeetingDevice> deviceList = meetingDeviceRepository.getDeviceListByRoomId(roomId);
+        //查询今天所有的会议
+        List<MeetingInfo> meetingList = meetingInfoRepository.queryTodayMeetingByRoomId(roomId);
+
+        LambdaQueryWrapper<SysUser> sysUserQuery = Wrappers.lambdaQuery();
+        sysUserQuery.eq(SysUser::getTenantId, SecurityUtils.getTenantId());
+        List<SysUser> userList = sysUserService.list(sysUserQuery);
+        if (userList.size() <= 0) {
+            throw new BusinessException("用户信息不能为空");
+        }
+        if (!ObjectUtil.isEmpty(meetingList)) {
+            for (MeetingInfo dmMeeting : meetingList) {
+                //参会人员信息
+                List<SysUser> attendeeUserList = new ArrayList<>();
+                List<MeetingAttendee> attendeeList = meetingAttendeeRepository.findMeetingAttendeeList(dmMeeting.getMeetingId(), null, SecurityUtils.getTenantId());
+                if (attendeeList.size() > 0) {
+                    for (int i = 0; i < attendeeList.size(); i++) {
+                        Long uid = attendeeList.get(i).getUserId();
+                        for (int j = 0; j < userList.size(); j++) {
+                            if (uid.equals(userList.get(j).getUserId())) {
+                                attendeeUserList.add(userList.get(j));
+                                break;
+                            }
+                        }
+                    }
+                }
+                dmMeeting.setUsers(attendeeUserList);
+                //发起人信息
+                for (int i = 0; i < userList.size(); i++) {
+                    if (userList.get(i).getUserId().equals(Long.valueOf(dmMeeting.getInitiatorId()))) {
+                        dmMeeting.setInitiatorUser(userList.get(i));
+                        break;
+                    }
+                }
+
+            }
+        }
+
+        meetingRoom.setMeetingFloor(meetingFloor);
+        meetingRoom.setMeetingDevice(deviceList);
+        meetingRoom.setMeetingInfo(meetingList);
+
+        return meetingRoom;
+    }
+
+    public boolean checkNameUnique(MeetingRoom meetingRoom) {
+        Long id = null == meetingRoom.getRoomId() ? -1 : meetingRoom.getRoomId();
         LambdaQueryWrapper<MeetingRoom> queryWrapper = Wrappers.lambdaQuery();
-        queryWrapper.eq(MeetingRoom::getRoomName,meetingRoom.getRoomName())
+        queryWrapper.eq(MeetingRoom::getRoomName, meetingRoom.getRoomName())
                 .eq(MeetingRoom::getTenantId, SecurityUtils.getTenantId());
         MeetingRoom one = this.getOne(queryWrapper);
-        return null != one && !Objects.equals(one.getRoomId(),id);
+        return null != one && !Objects.equals(one.getRoomId(), id);
 
     }
 }

+ 20 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/SysDeptServiceImpl.java

@@ -0,0 +1,20 @@
+package com.usky.meeting.service.impl;
+
+import com.usky.meeting.domain.SysDept;
+import com.usky.meeting.mapper.SysDeptMapper;
+import com.usky.meeting.service.SysDeptService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 部门表 服务实现类
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-18
+ */
+@Service
+public class SysDeptServiceImpl extends AbstractCrudService<SysDeptMapper, SysDept> implements SysDeptService {
+
+}

+ 20 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/SysRoleServiceImpl.java

@@ -0,0 +1,20 @@
+package com.usky.meeting.service.impl;
+
+import com.usky.meeting.domain.SysRole;
+import com.usky.meeting.mapper.SysRoleMapper;
+import com.usky.meeting.service.SysRoleService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 角色信息表 服务实现类
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-18
+ */
+@Service
+public class SysRoleServiceImpl extends AbstractCrudService<SysRoleMapper, SysRole> implements SysRoleService {
+
+}

+ 20 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/SysUserRoleServiceImpl.java

@@ -0,0 +1,20 @@
+package com.usky.meeting.service.impl;
+
+import com.usky.meeting.domain.SysUserRole;
+import com.usky.meeting.mapper.SysUserRoleMapper;
+import com.usky.meeting.service.SysUserRoleService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 用户和角色关联表 服务实现类
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-18
+ */
+@Service
+public class SysUserRoleServiceImpl extends AbstractCrudService<SysUserRoleMapper, SysUserRole> implements SysUserRoleService {
+
+}

+ 20 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/SysUserServiceImpl.java

@@ -0,0 +1,20 @@
+package com.usky.meeting.service.impl;
+
+import com.usky.meeting.domain.SysUser;
+import com.usky.meeting.mapper.SysUserMapper;
+import com.usky.meeting.service.SysUserService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 用户信息表 服务实现类
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-18
+ */
+@Service
+public class SysUserServiceImpl extends AbstractCrudService<SysUserMapper, SysUser> implements SysUserService {
+
+}

+ 26 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/vo/MeetingFileListVO.java

@@ -0,0 +1,26 @@
+package com.usky.meeting.service.vo;
+
+import lombok.Data;
+
+@Data
+public class MeetingFileListVO {
+
+    /**
+     * 页数
+     */
+    private Integer current;
+    /**
+     * 条数
+     */
+    private Integer size;
+
+    /**
+     * 会议Id
+     */
+    private Long meetingId;
+
+    /**
+     * 文件名称
+     */
+    private String fileName;
+}

+ 28 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/vo/MeetingFileRequestVO.java

@@ -0,0 +1,28 @@
+package com.usky.meeting.service.vo;
+
+import lombok.Data;
+
+@Data
+public class MeetingFileRequestVO {
+
+    /**
+     * 会议Id
+     */
+    private Long meetingId;
+
+    /**
+     * 文件存储地址
+     */
+    private String fileUrl;
+
+    /**
+     * 文件类型(0-会议所需文件,1-会议记录文件,2-高层会议文件)
+     */
+    private Integer fileType;
+
+    /**
+     * 文件名称
+     */
+    private String fileName;
+
+}

+ 45 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/vo/MeetingInfoRequestVO.java

@@ -0,0 +1,45 @@
+package com.usky.meeting.service.vo;
+
+import lombok.Data;
+
+@Data
+public class MeetingInfoRequestVO {
+    /**
+     * 页数
+     */
+    private Integer current;
+    /**
+     * 条数
+     */
+    private Integer size;
+
+    /**
+     * 会议室名称
+     */
+    private String roomName;
+
+    /**
+     * 发起人名称
+     */
+    private String name;
+
+    /**
+     * 会议状态(0-未开始 1-进行中 2-已结束)
+     */
+    private Integer meetingStatus;
+
+    /**
+     * 审批状态(0-审批中 1-审批通过 2-审批驳回)
+     */
+    private Integer approveStatus;
+
+    /**
+     * 会议开始时间
+     */
+    private String startDate;
+
+    /**
+     * 会议结束时间
+     */
+    private String endDate;
+}

+ 2 - 2
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/vo/MeetingRoomRequestVO.java

@@ -25,9 +25,9 @@ public class MeetingRoomRequestVO {
     private String floorName;
 
     /**
-     * 会议室启用状态(00.启用 01.停用)
+     * 会议室状态(0.启用 1.停用)
      */
-    private String status;
+    private Integer status;
 
     /**
      * 会议室使用状态(0-未使用 1-使用中)

+ 22 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/vo/MeetingRoomReservationVO.java

@@ -0,0 +1,22 @@
+package com.usky.meeting.service.vo;
+
+import lombok.Data;
+
+@Data
+public class MeetingRoomReservationVO {
+
+    /**
+     * 会议室id
+     */
+    private Long meetingRoomId;
+
+    /**
+     * 会议室名称
+     */
+    private String meetingRoomName;
+
+    /**
+     * 会议预约日期
+     */
+    private String date;
+}

+ 45 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/vo/MyMeetingInfoRequestVO.java

@@ -0,0 +1,45 @@
+package com.usky.meeting.service.vo;
+
+import lombok.Data;
+
+@Data
+public class MyMeetingInfoRequestVO {
+    /**
+     * 页数
+     */
+    private Integer current;
+    /**
+     * 条数
+     */
+    private Integer size;
+
+    /**
+     * 会议议题
+     */
+    private String meetingName;
+
+    /**
+     * 会议介绍
+     */
+    private String meetingDescribe;
+
+    /**
+     * 会议模式(0-线下会议 1-线上会议 2-线下同步线上会议)
+     */
+    private Integer meetingMode;
+
+    /**
+     * 会议状态(0-未开始 1-进行中 2-已结束)
+     */
+    private Integer meetingStatus;
+
+    /**
+     * 会议开始时间
+     */
+    private String startDate;
+
+    /**
+     * 会议结束时间
+     */
+    private String endDate;
+}

+ 1 - 0
service-meeting/service-meeting-biz/src/main/resources/mapper/meeting/MeetingAttendeeMapper.xml

@@ -14,6 +14,7 @@
         <result column="sign_type" property="signType" />
         <result column="dept_id" property="deptId" />
         <result column="tenant_id" property="tenantId" />
+        <result column="sign_out_type" property="signOutType" />
     </resultMap>
 
 </mapper>

+ 1 - 0
service-meeting/service-meeting-biz/src/main/resources/mapper/meeting/MeetingFileMapper.xml

@@ -13,6 +13,7 @@
         <result column="upload_time" property="uploadTime" />
         <result column="dept_id" property="deptId" />
         <result column="tenant_id" property="tenantId" />
+        <result column="file_name" property="fileName" />
     </resultMap>
 
 </mapper>

+ 24 - 0
service-meeting/service-meeting-biz/src/main/resources/mapper/meeting/SysDeptMapper.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.SysDeptMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.meeting.domain.SysDept">
+        <id column="dept_id" property="deptId" />
+        <result column="parent_id" property="parentId" />
+        <result column="ancestors" property="ancestors" />
+        <result column="dept_name" property="deptName" />
+        <result column="order_num" property="orderNum" />
+        <result column="leader" property="leader" />
+        <result column="phone" property="phone" />
+        <result column="email" property="email" />
+        <result column="status" property="status" />
+        <result column="del_flag" property="delFlag" />
+        <result column="create_by" property="createBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="tenant_id" property="tenantId" />
+    </resultMap>
+
+</mapper>

+ 24 - 0
service-meeting/service-meeting-biz/src/main/resources/mapper/meeting/SysRoleMapper.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.SysRoleMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.meeting.domain.SysRole">
+        <id column="role_id" property="roleId" />
+        <result column="role_name" property="roleName" />
+        <result column="role_key" property="roleKey" />
+        <result column="role_sort" property="roleSort" />
+        <result column="data_scope" property="dataScope" />
+        <result column="menu_check_strictly" property="menuCheckStrictly" />
+        <result column="dept_check_strictly" property="deptCheckStrictly" />
+        <result column="status" property="status" />
+        <result column="del_flag" property="delFlag" />
+        <result column="create_by" property="createBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="remark" property="remark" />
+        <result column="tenant_id" property="tenantId" />
+    </resultMap>
+
+</mapper>

+ 31 - 0
service-meeting/service-meeting-biz/src/main/resources/mapper/meeting/SysUserMapper.xml

@@ -0,0 +1,31 @@
+<?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.SysUserMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.meeting.domain.SysUser">
+        <id column="user_id" property="userId" />
+        <result column="dept_id" property="deptId" />
+        <result column="user_name" property="userName" />
+        <result column="nick_name" property="nickName" />
+        <result column="user_type" property="userType" />
+        <result column="email" property="email" />
+        <result column="phonenumber" property="phonenumber" />
+        <result column="sex" property="sex" />
+        <result column="full_name" property="fullName" />
+        <result column="avatar" property="avatar" />
+        <result column="password" property="password" />
+        <result column="status" property="status" />
+        <result column="del_flag" property="delFlag" />
+        <result column="login_ip" property="loginIp" />
+        <result column="login_date" property="loginDate" />
+        <result column="create_by" property="createBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="remark" property="remark" />
+        <result column="tenant_id" property="tenantId" />
+        <result column="address" property="address" />
+    </resultMap>
+
+</mapper>

+ 11 - 0
service-meeting/service-meeting-biz/src/main/resources/mapper/meeting/SysUserRoleMapper.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.meeting.mapper.SysUserRoleMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.meeting.domain.SysUserRole">
+        <id column="user_id" property="userId" />
+        <result column="role_id" property="roleId" />
+    </resultMap>
+
+</mapper>