Pu Zhibing
2025-03-17 b68ac80de1daf22142886af16d36479259106065
新增加管理后台接口和修改809协议中的bug
1 文件已重命名
22个文件已修改
2个文件已删除
26个文件已添加
3734 ■■■■■ 已修改文件
pom.xml 572 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/pom.xml 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-dataInterchange/pom.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-dataInterchange/src/main/java/com/ruoyi/dataInterchange/api/config/DataUpdateHandlerConfig.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-dataInterchange/src/main/java/com/ruoyi/dataInterchange/api/config/HttpConfig.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-dataInterchange/src/main/java/com/ruoyi/dataInterchange/api/config/MybatisPlusConfig.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-dataInterchange/src/main/java/com/ruoyi/dataInterchange/api/factory/UPExgMsgRegisterClientFallbackFactory.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-dataInterchange/src/main/java/com/ruoyi/dataInterchange/api/factory/UPExgMsgReportDriverInfoClientFallbackFactory.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-dataInterchange/src/main/java/com/ruoyi/dataInterchange/api/feignClient/UPExgMsgRegisterClient.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-dataInterchange/src/main/java/com/ruoyi/dataInterchange/api/feignClient/UPExgMsgReportDriverInfoClient.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-dataInterchange/src/main/java/com/ruoyi/dataInterchange/api/model/enums/VehicleColorEnum.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-dataInterchange/src/main/java/com/ruoyi/dataInterchange/api/vo/UPExgMsgRegisterVo.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-dataInterchange/src/main/java/com/ruoyi/dataInterchange/api/vo/UPExgMsgReportDriverInfoVo.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-dataInterchange/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/Car.java 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/Driver.java 228 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/Enterprise.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/query/GetEnterpriseListReq.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/form/LoginBody.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceNameConstants.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CarController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/EnterpriseController.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java 1273 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/CarMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/DriverMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/EnterpriseMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICarService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/IDriverService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/IEnterpriseService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CarServiceImpl.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DriverServiceImpl.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EnterpriseServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/TaskUtil.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/EnterpriseMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/pom.xml 89 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-dataInterchange/pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/RuoYiDataInterchangeApplication.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/config/DataUpdateHandlerConfig.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/config/MybatisPlusConfig.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/controller/UPExgMsgRegisterController.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/controller/UPExgMsgReportDriverInfoController.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/controller/UPExgMsgTakeEwayBillController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/dao/UPExgMsgRegisterDao.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/dao/UPExgMsgReportDriverInfoAckDao.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/model/enu/WarnType.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/server/ExgMsgService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/server/WarnMsgService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/TaskUtil.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -2,298 +2,284 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.ruoyi</groupId>
    <artifactId>ruoyi</artifactId>
    <version>3.6.2</version>
    <name>ruoyi</name>
    <description>微服务系统</description>
    <properties>
        <ruoyi.version>3.6.2</ruoyi.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-boot.version>2.7.7</spring-boot.version>
        <spring-cloud.version>2021.0.5</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version>
        <spring-boot-admin.version>2.7.10</spring-boot-admin.version>
        <swagger.fox.version>3.0.0</swagger.fox.version>
        <swagger.core.version>1.6.2</swagger.core.version>
        <tobato.version>1.27.2</tobato.version>
        <kaptcha.version>2.3.3</kaptcha.version>
        <pagehelper.boot.version>1.4.6</pagehelper.boot.version>
        <druid.version>1.2.16</druid.version>
        <dynamic-ds.version>3.5.2</dynamic-ds.version>
        <commons.io.version>2.11.0</commons.io.version>
        <velocity.version>2.3</velocity.version>
        <fastjson.version>2.0.25</fastjson.version>
        <jjwt.version>0.9.1</jjwt.version>
        <minio.version>8.2.2</minio.version>
        <poi.version>4.1.2</poi.version>
        <transmittable-thread-local.version>2.14.2</transmittable-thread-local.version>
    </properties>
    <!-- 依赖声明 -->
    <dependencyManagement>
        <dependencies>
            <!-- SpringCloud 微服务 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- SpringCloud Alibaba 微服务 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- SpringBoot 依赖配置 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- FastDFS 分布式文件系统 -->
            <dependency>
                <groupId>com.github.tobato</groupId>
                <artifactId>fastdfs-client</artifactId>
                <version>${tobato.version}</version>
            </dependency>
            <!-- Swagger 依赖配置 -->
            <dependency>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-models</artifactId>
                <version>${swagger.core.version}</version>
            </dependency>
            <dependency>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-annotations</artifactId>
                <version>${swagger.core.version}</version>
            </dependency>
            <!-- 验证码 -->
            <dependency>
                <groupId>pro.fessional</groupId>
                <artifactId>kaptcha</artifactId>
                <version>${kaptcha.version}</version>
            </dependency>
            <!-- pagehelper 分页插件 -->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>${pagehelper.boot.version}</version>
            </dependency>
            <!-- io常用工具类 -->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>${commons.io.version}</version>
            </dependency>
            <!-- excel工具 -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>${poi.version}</version>
            </dependency>
            <!-- 代码生成使用模板 -->
            <dependency>
                <groupId>org.apache.velocity</groupId>
                <artifactId>velocity-engine-core</artifactId>
                <version>${velocity.version}</version>
            </dependency>
            <!-- JSON 解析器和生成器 -->
            <dependency>
                <groupId>com.alibaba.fastjson2</groupId>
                <artifactId>fastjson2</artifactId>
                <version>${fastjson.version}</version>
            </dependency>
            <!-- JWT -->
            <dependency>
                <groupId>io.jsonwebtoken</groupId>
                <artifactId>jjwt</artifactId>
                <version>${jjwt.version}</version>
            </dependency>
            <!-- 线程传递值 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>transmittable-thread-local</artifactId>
                <version>${transmittable-thread-local.version}</version>
            </dependency>
            <!-- 核心模块 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-core</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 接口模块 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-swagger</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 安全模块 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-security</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 权限范围 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-datascope</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 多数据源 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-datasource</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 日志记录 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-log</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 缓存服务 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-redis</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 系统接口 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-api-system</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 账户接口 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-api-account</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 订单接口 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-api-order</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 系统其他接口 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-api-other</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <modules>
        <module>ruoyi-auth</module>
        <module>ruoyi-gateway</module>
        <module>ruoyi-modules</module>
        <module>ruoyi-api</module>
        <module>ruoyi-common</module>
        <module>ruoyi-service</module>
    </modules>
    <packaging>pom</packaging>
    <dependencies>
        <!-- bootstrap 启动器 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
        </plugins>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>${spring-boot.version}</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
    <repositories>
        <repository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.ruoyi</groupId>
    <artifactId>ruoyi</artifactId>
    <version>3.6.2</version>
    <name>ruoyi</name>
    <description>微服务系统</description>
    <properties>
        <ruoyi.version>3.6.2</ruoyi.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-boot.version>2.7.7</spring-boot.version>
        <spring-cloud.version>2021.0.5</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version>
        <spring-boot-admin.version>2.7.10</spring-boot-admin.version>
        <swagger.fox.version>3.0.0</swagger.fox.version>
        <swagger.core.version>1.6.2</swagger.core.version>
        <tobato.version>1.27.2</tobato.version>
        <kaptcha.version>2.3.3</kaptcha.version>
        <pagehelper.boot.version>1.4.6</pagehelper.boot.version>
        <druid.version>1.2.16</druid.version>
        <dynamic-ds.version>3.5.2</dynamic-ds.version>
        <commons.io.version>2.11.0</commons.io.version>
        <velocity.version>2.3</velocity.version>
        <fastjson.version>2.0.25</fastjson.version>
        <jjwt.version>0.9.1</jjwt.version>
        <minio.version>8.2.2</minio.version>
        <poi.version>4.1.2</poi.version>
        <transmittable-thread-local.version>2.14.2</transmittable-thread-local.version>
    </properties>
    <!-- 依赖声明 -->
    <dependencyManagement>
        <dependencies>
            <!-- SpringCloud 微服务 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- SpringCloud Alibaba 微服务 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- SpringBoot 依赖配置 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- FastDFS 分布式文件系统 -->
            <dependency>
                <groupId>com.github.tobato</groupId>
                <artifactId>fastdfs-client</artifactId>
                <version>${tobato.version}</version>
            </dependency>
            <!-- Swagger 依赖配置 -->
            <dependency>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-models</artifactId>
                <version>${swagger.core.version}</version>
            </dependency>
            <dependency>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-annotations</artifactId>
                <version>${swagger.core.version}</version>
            </dependency>
            <!-- 验证码 -->
            <dependency>
                <groupId>pro.fessional</groupId>
                <artifactId>kaptcha</artifactId>
                <version>${kaptcha.version}</version>
            </dependency>
            <!-- pagehelper 分页插件 -->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>${pagehelper.boot.version}</version>
            </dependency>
            <!-- io常用工具类 -->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>${commons.io.version}</version>
            </dependency>
            <!-- excel工具 -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>${poi.version}</version>
            </dependency>
            <!-- 代码生成使用模板 -->
            <dependency>
                <groupId>org.apache.velocity</groupId>
                <artifactId>velocity-engine-core</artifactId>
                <version>${velocity.version}</version>
            </dependency>
            <!-- JSON 解析器和生成器 -->
            <dependency>
                <groupId>com.alibaba.fastjson2</groupId>
                <artifactId>fastjson2</artifactId>
                <version>${fastjson.version}</version>
            </dependency>
            <!-- JWT -->
            <dependency>
                <groupId>io.jsonwebtoken</groupId>
                <artifactId>jjwt</artifactId>
                <version>${jjwt.version}</version>
            </dependency>
            <!-- 线程传递值 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>transmittable-thread-local</artifactId>
                <version>${transmittable-thread-local.version}</version>
            </dependency>
            <!-- 核心模块 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-core</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 接口模块 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-swagger</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 安全模块 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-security</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 权限范围 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-datascope</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 多数据源 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-datasource</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 日志记录 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-log</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 缓存服务 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-redis</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 系统接口 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-api-system</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 数据交互接口 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-api-dataInterchange</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <modules>
        <module>ruoyi-auth</module>
        <module>ruoyi-gateway</module>
        <module>ruoyi-modules</module>
        <module>ruoyi-api</module>
        <module>ruoyi-common</module>
        <module>ruoyi-service</module>
    </modules>
    <packaging>pom</packaging>
    <dependencies>
        <!-- bootstrap 启动器 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
        </plugins>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>${spring-boot.version}</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
    <repositories>
        <repository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
</project>
ruoyi-api/pom.xml
@@ -1,22 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.ruoyi</groupId>
        <artifactId>ruoyi</artifactId>
        <version>3.6.2</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <modules>
        <module>ruoyi-api-system</module>
    </modules>
    <artifactId>ruoyi-api</artifactId>
    <packaging>pom</packaging>
    <description>
        ruoyi-api系统接口
    </description>
    <parent>
        <groupId>com.ruoyi</groupId>
        <artifactId>ruoyi</artifactId>
        <version>3.6.2</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <modules>
        <module>ruoyi-api-system</module>
        <module>ruoyi-api-dataInterchange</module>
    </modules>
    <artifactId>ruoyi-api</artifactId>
    <packaging>pom</packaging>
    <description>
        ruoyi-api系统接口
    </description>
</project>
ruoyi-api/ruoyi-api-dataInterchange/pom.xml
New file
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.ruoyi</groupId>
        <artifactId>ruoyi-api</artifactId>
        <version>3.6.2</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>ruoyi-api-dataInterchange</artifactId>
    <description>
        ruoyi-api-dataInterchange数据交换接口模块
    </description>
    <dependencies>
        <!-- RuoYi Common Core-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common-core</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.github.pagehelper</groupId>
                    <artifactId>pagehelper-spring-boot-starter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</project>
ruoyi-api/ruoyi-api-dataInterchange/src/main/java/com/ruoyi/dataInterchange/api/config/DataUpdateHandlerConfig.java
New file
@@ -0,0 +1,32 @@
package com.ruoyi.dataInterchange.api.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.context.annotation.Configuration;
/**
 * @author xiaochen
 * @ClassName DataUpdateInterceptor
 * @Description 数据更新操作处理
 * @date 2021-12-15
 * <p>
 * 注意,之前在此处注入了 JwtTokenUtils
 * <p>
 * 造成spring循环依赖,项目支棱不起来
 */
@Slf4j
@Configuration
public class DataUpdateHandlerConfig implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
    }
    @Override
    public void updateFill(MetaObject metaObject) {
    }
}
ruoyi-api/ruoyi-api-dataInterchange/src/main/java/com/ruoyi/dataInterchange/api/config/HttpConfig.java
File was renamed from ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/config/HttpConfig.java
@@ -1,4 +1,4 @@
package com.ruoyi.dataInterchange.config;
package com.ruoyi.dataInterchange.api.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.client.RestTemplateBuilder;
@@ -14,12 +14,12 @@
 **/
@Configuration
public class HttpConfig {
    @Autowired
    private RestTemplateBuilder builder;
    @Bean
    public RestTemplate restTemplate() {
        return builder.build();
    }
    @Autowired
    private RestTemplateBuilder builder;
    @Bean
    public RestTemplate restTemplate() {
        return builder.build();
    }
}
ruoyi-api/ruoyi-api-dataInterchange/src/main/java/com/ruoyi/dataInterchange/api/config/MybatisPlusConfig.java
New file
@@ -0,0 +1,51 @@
package com.ruoyi.dataInterchange.api.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * @author xiaochen
 * @ClassName MybatisPlusConfig
 * @Description MybatisPlus相关配置
 * @date 2020-09-22 11:22、
 * 直接以实现类作为bean的注入(有事务管理的类)
 * @EnableTransactionManagement(proxyTargetClass = true)
 */
@Configuration
public class MybatisPlusConfig {
    private final DataUpdateHandlerConfig dataUpdateHandler;
    @Autowired
    public MybatisPlusConfig(DataUpdateHandlerConfig dataUpdateHandler) {
        this.dataUpdateHandler = dataUpdateHandler;
    }
    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
    /**
     * 自动填充功能
     *
     * @return
     */
    @Bean
    public GlobalConfig globalConfig() {
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setMetaObjectHandler(dataUpdateHandler);
        return globalConfig;
    }
}
ruoyi-api/ruoyi-api-dataInterchange/src/main/java/com/ruoyi/dataInterchange/api/factory/UPExgMsgRegisterClientFallbackFactory.java
New file
@@ -0,0 +1,26 @@
package com.ruoyi.dataInterchange.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.dataInterchange.api.feignClient.UPExgMsgRegisterClient;
import com.ruoyi.dataInterchange.api.vo.UPExgMsgRegisterVo;
import org.springframework.cloud.openfeign.FallbackFactory;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2025/3/17 13:40
 */
public class UPExgMsgRegisterClientFallbackFactory implements FallbackFactory<UPExgMsgRegisterClient> {
    @Override
    public UPExgMsgRegisterClient create(Throwable cause) {
        return new UPExgMsgRegisterClient() {
            @Override
            public R<List<UPExgMsgRegisterVo>> getUPExgMsgRegisterListIsAfterCreateTime(Long startTime) {
                return R.fail("查询添加时间大于等于给定时间的车辆基础数据失败:" + cause.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-dataInterchange/src/main/java/com/ruoyi/dataInterchange/api/factory/UPExgMsgReportDriverInfoClientFallbackFactory.java
New file
@@ -0,0 +1,26 @@
package com.ruoyi.dataInterchange.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.dataInterchange.api.feignClient.UPExgMsgReportDriverInfoClient;
import com.ruoyi.dataInterchange.api.vo.UPExgMsgReportDriverInfoVo;
import org.springframework.cloud.openfeign.FallbackFactory;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2025/3/17 16:36
 */
public class UPExgMsgReportDriverInfoClientFallbackFactory implements FallbackFactory<UPExgMsgReportDriverInfoClient> {
    @Override
    public UPExgMsgReportDriverInfoClient create(Throwable cause) {
        return new UPExgMsgReportDriverInfoClient() {
            @Override
            public R<List<UPExgMsgReportDriverInfoVo>> getUPExgMsgReportDriverInfoListIsAfterCreateTime(Long createTime) {
                return R.fail("查询添加时间等于或大于给定时间的数据失败:" + cause.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-dataInterchange/src/main/java/com/ruoyi/dataInterchange/api/feignClient/UPExgMsgRegisterClient.java
New file
@@ -0,0 +1,29 @@
package com.ruoyi.dataInterchange.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.dataInterchange.api.factory.UPExgMsgRegisterClientFallbackFactory;
import com.ruoyi.dataInterchange.api.vo.UPExgMsgRegisterVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2025/3/17 13:40
 */
@FeignClient(contextId = "UPExgMsgRegisterClient", value = ServiceNameConstants.DATA_INTERCHANGE_SERVICE, fallbackFactory = UPExgMsgRegisterClientFallbackFactory.class)
public interface UPExgMsgRegisterClient {
    /**
     * 查询添加时间大于等于给定时间的车辆基础数据
     *
     * @param startTime
     * @return
     */
    @PostMapping("/UPExgMsgRegister/getUPExgMsgRegisterListIsAfterCreateTime")
    R<List<UPExgMsgRegisterVo>> getUPExgMsgRegisterListIsAfterCreateTime(@RequestParam("startTime") Long startTime);
}
ruoyi-api/ruoyi-api-dataInterchange/src/main/java/com/ruoyi/dataInterchange/api/feignClient/UPExgMsgReportDriverInfoClient.java
New file
@@ -0,0 +1,29 @@
package com.ruoyi.dataInterchange.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.dataInterchange.api.factory.UPExgMsgReportDriverInfoClientFallbackFactory;
import com.ruoyi.dataInterchange.api.vo.UPExgMsgReportDriverInfoVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2025/3/17 16:36
 */
@FeignClient(contextId = "UPExgMsgReportDriverInfoClient", value = ServiceNameConstants.DATA_INTERCHANGE_SERVICE, fallbackFactory = UPExgMsgReportDriverInfoClientFallbackFactory.class)
public interface UPExgMsgReportDriverInfoClient {
    /**
     * 查询添加时间等于或大于给定时间的数据
     *
     * @param createTime
     * @return
     */
    @PostMapping("/UPExgMsgReportDriverInfo/getUPExgMsgReportDriverInfoListIsAfterCreateTime")
    R<List<UPExgMsgReportDriverInfoVo>> getUPExgMsgReportDriverInfoListIsAfterCreateTime(@RequestParam("createTime") Long createTime);
}
ruoyi-api/ruoyi-api-dataInterchange/src/main/java/com/ruoyi/dataInterchange/api/model/enums/VehicleColorEnum.java
New file
@@ -0,0 +1,34 @@
package com.ruoyi.dataInterchange.api.model.enums;
/**
 * 车辆颜色枚举
 *
 * @author zhibing.pu
 * @Date 2025/3/17 14:18
 */
public enum VehicleColorEnum {
    BLUE(1, "蓝色"),
    YELLOW(2, "黄色"),
    BLACK(3, "黑色"),
    WHITE(4, "白色"),
    OTHER(9, "其他"),
    ;
    private Integer code;
    private String name;
    VehicleColorEnum(Integer code, String name) {
        this.code = code;
        this.name = name;
    }
    public static String getName(Integer num) {
        VehicleColorEnum[] values = VehicleColorEnum.values();
        for (VehicleColorEnum value : values) {
            if (value.code.equals(num)) {
                return value.name;
            }
        }
        return "";
    }
}
ruoyi-api/ruoyi-api-dataInterchange/src/main/java/com/ruoyi/dataInterchange/api/vo/UPExgMsgRegisterVo.java
New file
@@ -0,0 +1,59 @@
package com.ruoyi.dataInterchange.api.vo;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2025/3/17 13:45
 */
@Data
public class UPExgMsgRegisterVo {
    /**
     * id
     */
    private String id;
    /**
     * 车牌号
     */
    private String vehicleNo;
    /**
     * 车牌颜色
     */
    private int vehicleColor;
    /**
     * 子业务类型标识
     */
    private int dataType;
    /**
     * 后续数据长度
     */
    private Integer dataLength;
    /**
     * 平台唯一编号,由平台所在地行政区划代码和平台编号组成
     */
    private String platformId;
    /**
     * 车载终端厂商唯一编码,由车载终端厂商所在地行政区划代码和厂商ID组成
     */
    private String producerId;
    /**
     * 车载终端型号
     */
    private String terminalModelType;
    /**
     * 车载终端编号
     */
    private String terminalId;
    /**
     * 车载终端SIM卡电话号码
     */
    private String terminalSIMCode;
    /**
     * 下级平台唯一标识
     */
    private Integer inferiorPlatformId;
    /**
     * 添加时间
     */
    private Long createTime;
}
ruoyi-api/ruoyi-api-dataInterchange/src/main/java/com/ruoyi/dataInterchange/api/vo/UPExgMsgReportDriverInfoVo.java
New file
@@ -0,0 +1,55 @@
package com.ruoyi.dataInterchange.api.vo;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2025/3/17 16:38
 */
@Data
public class UPExgMsgReportDriverInfoVo {
    /**
     * 主键
     */
    private String id;
    /**
     * 车牌号
     */
    private String vehicleNo;
    /**
     * 车牌颜色
     */
    private int vehicleColor;
    /**
     * 子业务类型标识
     */
    private int dataType;
    /**
     * 后续数据长度
     */
    private int dataLength;
    /**
     * 驾驶员姓名
     */
    private String driverName;
    /**
     * 驾驶证编号
     */
    private String driverId;
    /**
     * 从业资格证号
     */
    private String licence;
    /**
     * 发证机构名称
     */
    private String orgName;
    /**
     * 下级平台唯一标识
     */
    private Integer inferiorPlatformId;
    /**
     * 添加时间
     */
    private Long createTime;
}
ruoyi-api/ruoyi-api-dataInterchange/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
New file
@@ -0,0 +1,2 @@
com.ruoyi.dataInterchange.api.factory.UPExgMsgRegisterClientFallbackFactory
com.ruoyi.dataInterchange.api.factory.UPExgMsgReportDriverInfoClientFallbackFactory
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/Car.java
New file
@@ -0,0 +1,173 @@
package com.ruoyi.system.api.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * @author zhibing.pu
 * @Date 2025/3/17 11:29
 */
@Data
@TableName("t_car")
public class Car {
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * 车牌号
     */
    @TableField("vehicle_number")
    private String vehicleNumber;
    /**
     * 车牌颜色
     */
    @TableField("license_plate_color")
    private String licensePlateColor;
    /**
     * 所属企业id
     */
    @TableField("enterprise_id")
    private Integer enterpriseId;
    /**
     * 载客数
     */
    @TableField("passenger_capacity")
    private String passengerCapacity;
    /**
     * 车辆品牌
     */
    @TableField("brand")
    private String brand;
    /**
     * 车辆品牌型号
     */
    @TableField("brand_model")
    private String brandModel;
    /**
     * 车辆类型
     */
    @TableField("vehicle_type")
    private String vehicleType;
    /**
     * 司机id
     */
    @TableField("driver_id")
    private Integer driverId;
    /**
     * 车身颜色
     */
    @TableField("vehicle_color")
    private String vehicleColor;
    /**
     * 经营区域
     */
    @TableField("operating_area")
    private String operatingArea;
    /**
     * 运营类型
     */
    @TableField("operate_type")
    private String operateType;
    /**
     * 发动机号
     */
    @TableField("engine_number")
    private String engineNumber;
    /**
     * 车辆VIN码
     */
    @TableField("vin")
    private String vin;
    /**
     * 注册日期
     */
    @TableField("registration_date")
    private String registrationDate;
    /**
     * 燃料类型
     */
    @TableField("fuel_type")
    private String fuelType;
    /**
     * 发动机排量
     */
    @TableField("engine_capacity")
    private String engineCapacity;
    /**
     * 运输证发证机关
     */
    @TableField("transport_license_issuing_authority")
    private String transportLicenseIssuingAuthority;
    /**
     * 运输证有效期开始时间
     */
    @TableField("transport_certificate_start")
    private String transportCertificateStart;
    /**
     * 运输证有效期结束时间
     */
    @TableField("transport_certificate_end")
    private String transportCertificateEnd;
    /**
     * 车辆初次登记时间
     */
    @TableField("initial_registration_time")
    private String initialRegistrationTime;
    /**
     * 车辆检修状态
     */
    @TableField("vehicle_maintenance_status")
    private String vehicleMaintenanceStatus;
    /**
     * 车辆年审状态
     */
    @TableField("annual_review_status")
    private String annualReviewStatus;
    /**
     * 卫星定位装置品牌
     */
    @TableField("gps_brand")
    private String gpsBrand;
    /**
     * 卫星定位装置型号
     */
    @TableField("gps_model")
    private String gpsModel;
    /**
     * 卫星定位装置IMEI号
     */
    @TableField("gps_imei")
    private String gpsImei;
    /**
     * 卫星定位装置安装日期
     */
    @TableField("gps_installation_date")
    private String gpsInstallationDate;
    /**
     * 运价类型编码
     */
    @TableField("rate_type_number")
    private String rateTypeNumber;
    /**
     * 运输证字号
     */
    @TableField("transport_certificate_number")
    private String transportCertificateNumber;
    /**
     * 车辆状态(1=在线,2=异常,3=离线,4=故障)
     */
    @TableField("status")
    private Integer status;
    /**
     * 添加时间
     */
    @TableField("create_time")
    private LocalDateTime createTime;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/Driver.java
New file
@@ -0,0 +1,228 @@
package com.ruoyi.system.api.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * @author zhibing.pu
 * @Date 2025/3/17 16:12
 */
@Data
@TableName("t_driver")
public class Driver {
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * 姓名
     */
    @TableField("name")
    private String name;
    /**
     * 手机号
     */
    @TableField("phone")
    private String phone;
    /**
     * 所属企业id
     */
    @TableField("enterprise_id")
    private Integer enterpriseId;
    /**
     * 驾驶证号
     */
    @TableField("driving_license_number")
    private String drivingLicenseNumber;
    /**
     * 通讯地址
     */
    @TableField("mailing_address")
    private String mailingAddress;
    /**
     * 紧急联系人
     */
    @TableField("emergency_contact")
    private String emergencyContact;
    /**
     * 紧急联系电话
     */
    @TableField("emergency_phone")
    private String emergencyPhone;
    /**
     * 紧急联系人通讯地址
     */
    @TableField("emergency_mailing_address")
    private String emergencyMailingAddress;
    /**
     * 婚姻状况
     */
    @TableField("marital_status")
    private String maritalStatus;
    /**
     * 性别
     */
    @TableField("gender")
    private String gender;
    /**
     * 出生日期
     */
    @TableField("birthday")
    private String birthday;
    /**
     * 国籍
     */
    @TableField("nation")
    private String nation;
    /**
     * 民族
     */
    @TableField("nationality")
    private String nationality;
    /**
     * 外语
     */
    @TableField("foreign_languages")
    private String foreignLanguages;
    /**
     * 学历
     */
    @TableField("education")
    private String education;
    /**
     * 户籍登记机关
     */
    @TableField("household_registration_authority")
    private String householdRegistrationAuthority;
    /**
     * 户籍所在地
     */
    @TableField("domicile")
    private String domicile;
    /**
     * 签约公司
     */
    @TableField("contracting_company")
    private String contractingCompany;
    /**
     * 驾驶员照片
     */
    @TableField("avatar_file")
    private String avatarFile;
    /**
     * 驾驶证照片
     */
    @TableField("driving_licence_file")
    private String drivingLicenceFile;
    /**
     * 准驾车型
     */
    @TableField("quasi_driving_type")
    private String quasiDrivingType;
    /**
     * 初次领取驾驶证日期
     */
    @TableField("first_license_date")
    private String firstLicenseDate;
    /**
     * 驾驶证有效开始时间
     */
    @TableField("driving_licence_start")
    private String drivingLicenceStart;
    /**
     * 驾驶证有效期结束时间
     */
    @TableField("driving_licence_end")
    private String drivingLicenceEnd;
    /**
     * 是否是巡游出租车
     */
    @TableField("cruise_taxi")
    private String cruiseTaxi;
    /**
     * 资格证号
     */
    @TableField("certification")
    private String certification;
    /**
     * 资格证发证日期
     */
    @TableField("certification_issue_date")
    private String certificationIssueDate;
    /**
     * 初次领取资格证日期
     */
    @TableField("first_license_certification")
    private String firstLicenseCertification;
    /**
     * 资格证有效期开始时间
     */
    @TableField("certification_start")
    private String certificationStart;
    /**
     * 资格证有效期结束时间
     */
    @TableField("certification_end")
    private String certificationEnd;
    /**
     * 资格证发证机构名称
     */
    @TableField("orgName")
    private String orgName;
    /**
     * 司机平台注册日期
     */
    @TableField("registration_date")
    private String registrationDate;
    /**
     * 司机是都在黑名单中
     */
    @TableField("blacklist")
    private String blacklist;
    /**
     * 专职驾驶员
     */
    @TableField("full_time_driver")
    private String fullTimeDriver;
    /**
     * 营运类型
     */
    @TableField("operation_type")
    private String operationType;
    /**
     * 合同有效期开始时间
     */
    @TableField("contract_life_start")
    private String contractLifeStart;
    /**
     * 合同有效期结束时间
     */
    @TableField("contract_life_end")
    private String contractLifeEnd;
    /**
     * 状态(1=有效,2=无效)
     */
    @TableField("status")
    private Integer status;
    /**
     * 标识(1=新增,2=修改)
     */
    @TableField("flag")
    private Integer flag;
    /**
     * 更新时间
     */
    @TableField("update_time")
    private LocalDateTime updateTime;
    /**
     * 车牌号
     */
    @TableField("vehicle_number")
    private String vehicleNumber;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/Enterprise.java
@@ -43,4 +43,54 @@
     */
    @TableField("ip_whitelist")
    private String ipWhitelist;
    /**
     * 统一社会信用代码
     */
    @TableField("credit_identifier")
    private String creditIdentifier;
    /**
     * 紧急联系电话
     */
    @TableField("emergency_number")
    private String emergencyNumber;
    /**
     * 经营范围
     */
    @TableField("business_scope")
    private String businessScope;
    /**
     * 运营类型
     */
    @TableField("operation_type")
    private String operationType;
    /**
     * 通讯地址
     */
    @TableField("mailing_address")
    private String mailingAddress;
    /**
     * 注册资本
     */
    @TableField("registered_capital")
    private String registeredCapital;
    /**
     * 法人代表
     */
    @TableField("legal_representative")
    private String legalRepresentative;
    /**
     * 联系人
     */
    @TableField("contact_person")
    private String contactPerson;
    /**
     * 联系电话
     */
    @TableField("contact_number")
    private String contactNumber;
    /**
     * 状态(1=有效,2=无效)
     */
    @TableField("status")
    private Integer status;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/query/GetEnterpriseListReq.java
New file
@@ -0,0 +1,25 @@
package com.ruoyi.system.api.query;
import com.ruoyi.common.core.web.page.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2025/3/17 10:27
 */
@Data
@ApiModel
public class GetEnterpriseListReq extends BasePage {
    @ApiModelProperty("公司名称")
    private String name;
    @ApiModelProperty("经营范围")
    private String businessScope;
    @ApiModelProperty("通讯地址")
    private String mailingAddress;
    @ApiModelProperty("法人代表")
    private String legalRepresentative;
    @ApiModelProperty("车辆运营类型")
    private String operationType;
}
ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
@@ -1,17 +1,6 @@
package com.ruoyi.auth.controller;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import com.ruoyi.system.api.domain.SysRole;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import com.ruoyi.auth.form.LoginBody;
import com.ruoyi.auth.form.RegisterBody;
import com.ruoyi.auth.service.SysLoginService;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.JwtUtils;
@@ -19,9 +8,23 @@
import com.ruoyi.common.security.auth.AuthUtil;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.system.api.domain.SysRole;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
import com.ruoyi.system.api.model.LoginUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
/**
 * token 控制
@@ -40,9 +43,6 @@
    private SysUserClient userClient;
    
    
    @PostMapping("login")
    public R<?> login(@RequestBody LoginBody form, HttpServletRequest request) {
        // 用户登录
@@ -50,32 +50,11 @@
        HashMap<String, Object> map = new HashMap<>();
        map.put("token", tokenService.createToken(userInfo));
        List<SysRole> roles = userInfo.getSysUser().getRoles();
        if(CollectionUtils.isEmpty(roles)){
            return R.fail("请关联角色!");
        }
        map.put("roleName",roles.get(0).getRoleName());
        map.put("info", userInfo);
        // 修改用户最后登录时间
        SysUser sysUser = new SysUser();
        sysUser.setUserId(userInfo.getSysUser().getUserId());
        sysUser.setLoginDate(new Date());
        System.out.println("修改用户登录时间" + sysUser);
        userClient.updateSysUser(sysUser);
        return R.ok(map);
    }
    @PostMapping("loginShop")
    public R<?> loginShop(@RequestBody LoginBody form, HttpServletRequest request) {
        // 用户登录
        LoginUser userInfo = sysLoginService.loginShop(form.getUsername(), form.getPassword(), request);
        HashMap<String, Object> map = new HashMap<>();
        map.put("token", tokenService.createToken(userInfo));
        List<SysRole> roles = userInfo.getSysUser().getRoles();
        if(CollectionUtils.isEmpty(roles)){
            return R.fail("请关联角色!");
        }
        map.put("roleName",roles.get(0).getRoleName());
        if (CollectionUtils.isEmpty(roles)) {
            return R.fail("请关联角色!");
        }
        map.put("roleName", roles.get(0).getRoleName());
        map.put("info", userInfo);
        // 修改用户最后登录时间
        SysUser sysUser = new SysUser();
@@ -111,11 +90,5 @@
        return R.ok();
    }
    
    @PostMapping("register")
    public R<?> register(@RequestBody RegisterBody registerBody, HttpServletRequest request) {
        // 用户注册
        sysLoginService.register(registerBody.getUsername(), registerBody.getPassword(), request);
        return R.ok();
    }
    
}
ruoyi-auth/src/main/java/com/ruoyi/auth/form/LoginBody.java
@@ -2,50 +2,34 @@
/**
 * 用户登录对象
 *
 *
 * @author ruoyi
 */
public class LoginBody
{
    /**
     * 用户名
     */
    private String username;
    /**
     * 用户密码
     */
    private String password;
    /**
     * 登录平台类型(1=平台,2=门店)
     */
    private Integer roleType;
    public String getUsername()
    {
        return username;
    }
    public void setUsername(String username)
    {
        this.username = username;
    }
    public String getPassword()
    {
        return password;
    }
    public void setPassword(String password)
    {
        this.password = password;
    }
    public Integer getRoleType() {
        return roleType;
    }
    public void setRoleType(Integer roleType) {
        this.roleType = roleType;
    }
}
public class LoginBody {
    /**
     * 用户名
     */
    private String username;
    /**
     * 用户密码
     */
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceNameConstants.java
@@ -2,26 +2,27 @@
/**
 * 服务名称
 *
 *
 * @author ruoyi
 */
public class ServiceNameConstants
{
    /**
     * 认证服务的serviceid
     */
    public static final String AUTH_SERVICE = "ruoyi-auth";
    /**
     * 系统模块的serviceid
     */
    public static final String SYSTEM_SERVICE = "ruoyi-system";
    /**
     * 文件服务的serviceid
     */
    public static final String FILE_SERVICE = "ruoyi-file";
    public static final String ACCOUNT_SERVICE = "ruoyi-account";
    public static final String OTHER_SERVICE = "ruoyi-other";
    public static final String ORDER_SERVICE = "ruoyi-order";
public class ServiceNameConstants {
    /**
     * 认证服务的serviceid
     */
    public static final String AUTH_SERVICE = "ruoyi-auth";
    /**
     * 系统模块的serviceid
     */
    public static final String SYSTEM_SERVICE = "ruoyi-system";
    /**
     * 文件服务的serviceid
     */
    public static final String FILE_SERVICE = "ruoyi-file";
    /**
     * 数据交互服务的serviceid
     */
    public static final String DATA_INTERCHANGE_SERVICE = "ruoyi-dataInterchange";
}
ruoyi-modules/ruoyi-system/pom.xml
@@ -110,6 +110,10 @@
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-api-dataInterchange</artifactId>
        </dependency>
    </dependencies>
    
    <build>
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java
@@ -1,38 +1,38 @@
package com.ruoyi.system;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.ruoyi.common.security.annotation.EnableCustomConfig;
import com.ruoyi.common.security.annotation.EnableRyFeignClients;
import com.ruoyi.common.swagger.annotation.EnableCustomSwagger2;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
 * 系统模块
 *
 *
 * @author ruoyi
 */
@EnableCustomConfig
@MapperScan({"com.ruoyi.system.mapper"})
@EnableScheduling//开启定时任务
@EnableCustomSwagger2
@EnableRyFeignClients
@SpringBootApplication
@EnableTransactionManagement
public class RuoYiSystemApplication
{
    public static void main(String[] args) {
        SpringApplication.run(RuoYiSystemApplication.class, args);
        System.out.println("(♥◠‿◠)ノ゙  系统模块启动成功   ლ(´ڡ`ლ)゙  \n" +
                " .-------.       ____     __        \n" +
                " |  _ _   \\      \\   \\   /  /    \n" +
                " | ( ' )  |       \\  _. /  '       \n" +
                " |(_ o _) /        _( )_ .'         \n" +
                " | (_,_).' __  ___(_ o _)'          \n" +
                " |  |\\ \\  |  ||   |(_,_)'         \n" +
                " |  | \\ `'   /|   `-'  /           \n" +
                " |  |  \\    /  \\      /           \n" +
                " ''-'   `'-'    `-..-'              ");
    }
public class RuoYiSystemApplication {
    public static void main(String[] args) {
        SpringApplication.run(RuoYiSystemApplication.class, args);
        System.out.println("(♥◠‿◠)ノ゙  系统模块启动成功   ლ(´ڡ`ლ)゙  \n" +
                " .-------.       ____     __        \n" +
                " |  _ _   \\      \\   \\   /  /    \n" +
                " | ( ' )  |       \\  _. /  '       \n" +
                " |(_ o _) /        _( )_ .'         \n" +
                " | (_,_).' __  ___(_ o _)'          \n" +
                " |  |\\ \\  |  ||   |(_,_)'         \n" +
                " |  | \\ `'   /|   `-'  /           \n" +
                " |  |  \\    /  \\      /           \n" +
                " ''-'   `'-'    `-..-'              ");
    }
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CarController.java
New file
@@ -0,0 +1,13 @@
package com.ruoyi.system.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author zhibing.pu
 * @Date 2025/3/17 11:38
 */
@RestController
@RequestMapping("/car")
public class CarController {
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/EnterpriseController.java
@@ -1,16 +1,17 @@
package com.ruoyi.system.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.system.api.model.Enterprise;
import com.ruoyi.system.api.query.GetEnterpriseListReq;
import com.ruoyi.system.service.IEnterpriseService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; /**
import javax.annotation.Resource;
/**
 * @author zhibing.pu
 * @Date 2025/3/6 11:01
 */
@@ -24,12 +25,29 @@
    
    /**
     * 获取企业
     *
     * @param username
     * @return
     */
    @PostMapping("/getEnterprise")
    public R<Enterprise> getEnterprise(@RequestParam("username") String username){
    public R<Enterprise> getEnterprise(@RequestParam("username") String username) {
        Enterprise username1 = enterpriseService.getOne(new QueryWrapper<Enterprise>().eq("username", username));
        return R.ok(username1);
    }
    @GetMapping("/getEnterpriseList")
    @ApiOperation(value = "获取公司列表数据", tags = {"公司管理"})
    public R<PageInfo<Enterprise>> getEnterpriseList(GetEnterpriseListReq req) {
        PageInfo<Enterprise> enterpriseList = enterpriseService.getEnterpriseList(req);
        return R.ok(enterpriseList);
    }
    @GetMapping("/getEnterpriseInfo/{id}")
    @ApiOperation(value = "获取公司详情", tags = {"公司管理"})
    public R<Enterprise> getEnterpriseInfo(@PathVariable("id") Integer id) {
        Enterprise enterprise = enterpriseService.getById(id);
        return R.ok(enterprise);
    }
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
@@ -33,7 +33,6 @@
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@@ -46,645 +45,641 @@
@RequestMapping("/user")
@Api(tags = "用户信息")
public class SysUserController extends BaseController {
    @Resource
    private ISysUserService userService;
    @Resource
    private ISysRoleService roleService;
    @Resource
    private ISysDeptService deptService;
    @Resource
    private ISysPostService postService;
    @Resource
    private ISysPermissionService permissionService;
    @Resource
    private ISysConfigService configService;
    @Resource
    private ISysUserRoleService userRoleService;
    @Resource
    private ISysUserRoleService sysUserRoleService;
    @Resource
    private UserShopService userShopService;
    @Resource
    private TokenService tokenService;
    @Autowired
    private ISysMenuService menuService;
    /**
     * 获取用户列表
     */
    @GetMapping("/list")
    @ApiOperation(value = "获取系统用户列表", tags = {"管理后台-账号管理", "门店后台-部门管理"})
    public AjaxResult list(GetSysUserList getSysUserList) {
        PageInfo<SysUser> pageInfo = new PageInfo<>(getSysUserList.getPageCurr(), getSysUserList.getPageSize());
        PageInfo<SysUser> page = userService.getList(pageInfo, getSysUserList);
        return AjaxResult.success(page);
    }
    /**
     * 获取用户选择列表
     */
    @PostMapping("/getChangeUserList")
    @ApiOperation(value = "获取用户选择列表", tags = {"管理后台-获取用户选择列表", "门店后台-部门管理"})
    public AjaxResult<PageInfo<SysUser>> getChangeUserList(@RequestBody ChangeUserQuery query) {
        return AjaxResult.success(userService.getChangeUserList(query));
    }
    /**
     * 新增用户
     */
    @Log(title = "用户管理", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @ApiOperation(value = "添加系统用户", tags = {"管理后台-账号管理", "门店后台-部门管理"})
    public AjaxResult add(@RequestBody SysUser user) {
        user.setUserName(user.getPhonenumber());
        Long userid = tokenService.getLoginUser().getUserid();
        SysUser sysUser1 = userService.getById(userid);
        if(!org.springframework.util.StringUtils.hasLength(user.getNickName())){
            user.setNickName(user.getPhonenumber());
        }
        if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
            return error("手机号已开通账号");
        }
        if (StringUtils.isNotEmpty(user.getUserName()) && !userService.checkUserNameUnique(user)) {
            return error("登录账号重复");
        }
        return AjaxResult.success();
    }
    @GetMapping("/verifyUserNameRepeat/{username}")
    @ApiOperation(value = "校验账号是否重复", tags = {"管理后台-账号管理"})
    public AjaxResult verifyUserNameRepeat(@PathVariable String username){
        SysUser user = new SysUser();
        user.setUserName(username);
        if (StringUtils.isNotEmpty(username) && !userService.checkUserNameUnique(user)) {
            return error("账号不可重复");
        }
        return success();
    }
    /**
     * 根据用户编号获取详细信息
     */
    @ApiOperation(value = "获取用户详情", tags = {"管理后台-账号管理", "门店后台-部门管理"})
    @GetMapping("/getInfo/{userId}")
    public AjaxResult getInfo(@PathVariable Long userId) {
        userService.checkUserDataScope(userId);
        AjaxResult ajax = AjaxResult.success();
        List<SysRole> roles = roleService.selectRoleAll();
        ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
        ajax.put("posts", postService.selectPostAll());
        if (StringUtils.isNotNull(userId)) {
            SysUser sysUser = userService.selectUserById(userId);
            if(sysUser.getRoleType() == 2){
                Long userid = tokenService.getLoginUser().getUserid();
                SysUser sysUser1 = userService.selectUserById(userid);
                UserShop one = userShopService.getOne(new LambdaQueryWrapper<UserShop>().eq(UserShop::getUserId, sysUser.getUserId()).eq(UserShop::getShopId, sysUser1.getObjectId()));
                sysUser.setDeptId(one.getDeptId());
                sysUser.setNickName(one.getNickName());
                SysDept sysDept = deptService.selectDeptById(one.getDeptId());
                sysUser.setDept(sysDept);
                sysUser.setRoleId(one.getRoleId());
            }
            ajax.put("data", sysUser);
            ajax.put("postIds", postService.selectPostListByUserId(userId));
            ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList()));
        }
        return AjaxResult.success(ajax);
    }
    /**
     * 修改用户
     */
    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
    @PutMapping("/update")
    @ApiOperation(value = "编辑系统用户", tags = {"管理后台-账号管理", "门店后台-部门管理"})
    public AjaxResult edit(@Validated @RequestBody SysUser user) {
        user.setUserName(user.getPhonenumber());
        if(!org.springframework.util.StringUtils.hasLength(user.getNickName())){
            user.setNickName(user.getPhonenumber());
        }
        R<Integer> admin = this.isAdmin(user.getUserId());
        Integer data = admin.getData();
        if(data == null || data != 1){
            SysUserRole one = sysUserRoleService.getOne(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, user.getUserId()));
            one.setRoleId(user.getRoleId());
            sysUserRoleService.updateSysUserRole(one);
        }
        userService.checkUserAllowed(user);
        userService.checkUserDataScope(user.getUserId());
        SysUser sysUser = userService.getOne(Wrappers.lambdaQuery(SysUser.class)
                .eq(SysUser::getPhonenumber, user.getPhonenumber())
                .eq(SysUser::getDelFlag,0)
                .last("LIMIT 1"));
        if (StringUtils.isNotEmpty(user.getPhonenumber()) && (Objects.nonNull(sysUser) && !user.getUserId().equals(sysUser.getUserId()) )) {
            return error("手机号已开通账号");
        }
        sysUser = userService.getOne(Wrappers.lambdaQuery(SysUser.class)
                .eq(SysUser::getUserName, user.getUserName())
                .eq(SysUser::getDelFlag,0)
                .last("LIMIT 1"));
        if (StringUtils.isNotEmpty(user.getUserName()) && (Objects.nonNull(sysUser) && !user.getUserId().equals(sysUser.getUserId()) )) {
            return error("登录账号重复");
        }
        user.setUpdateBy(SecurityUtils.getUsername());
        if (user.getPassword() != null && !"".equals(user.getPassword())) {
            user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
            user.setPassword(SecurityUtils.encryptPassword(MD5Generator.generateMD5("a123456")));
            user.setPassWordUpdate(new Date());
        }
        if (user.getPhonenumber() != null) {
            user.setUserName(user.getPhonenumber());
        }
        user.setUpdateBy(SecurityUtils.getUsername());
        user.setUpdateTime(new Date());
        userService.updateUser(user);
        user = userService.getById(user.getUserId());
        //添加门店员工关系数据
        if(2 == user.getRoleType()){
            UserShop one = userShopService.getOne(new LambdaQueryWrapper<UserShop>().eq(UserShop::getUserId, user.getUserId()).eq(UserShop::getShopId, user.getObjectId()));
            one.setUserId(user.getUserId());
            one.setShopId(user.getObjectId());
            one.setRoleType(one.getRoleType());
            one.setRoleId(user.getRoleId());
            one.setDeptId(user.getDeptId());
            one.setNickName(user.getNickName());
            userShopService.updateById(one);
        }
        return success();
    }
    /**
     * 删除用户
     */
    @Log(title = "用户管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{userIds}")
    @ApiOperation(value = "删除系统用户", tags = {"管理后台-账号管理", "门店后台-部门管理"})
    public AjaxResult remove(@PathVariable Long[] userIds) {
        if (ArrayUtils.contains(userIds, SecurityUtils.getUserId())) {
            return error("当前用户不能删除");
        }
        userService.deleteUserByIds(userIds);
        return AjaxResult.success();
    }
    @PostMapping("/shopUserStart")
    @ApiOperation(value = "账号管理--禁用/启用", tags = {"管理后台-账号管理", "门店后台-部门管理"})
    public AjaxResult shopUserStart(@RequestBody ShopUserStart shopUserStart) {
        if (shopUserStart.getUserId() == null) {
            return AjaxResult.error("userId不能为空");
        }
        SysUser sysUser = userService.selectUserById(shopUserStart.getUserId());
        if (sysUser.getStatus().equals("0")) {
            sysUser.setStatus("1");
            sysUser.setForbiddenRemark(shopUserStart.getRemark());
        } else {
            sysUser.setStatus("0");
            sysUser.setForbiddenRemark("");
        }
        return toAjax(userService.updateUser(sysUser));
    }
    @PostMapping("/getUserList")
    public R<List<SysUser>> getUserList(@RequestBody List<Integer> userIds) {
        List<SysUser> list = userService.list(new LambdaQueryWrapper<SysUser>().in(SysUser::getUserId, userIds));
        return R.ok(list);
    }
    @PostMapping("/isAdmin")
    public R<Integer> isAdmin(@RequestBody Long userId){
        SysUserRole one = sysUserRoleService.getOne(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, userId));
        Long id =one.getRoleId();
        return R.ok(id.intValue());
    }
    @PostMapping("/getSysUser")
    public R<SysUser> getSysUser(@RequestParam("userId") Long userId) {
        try {
            SysUser sysUser = userService.selectUserById(userId);
            return R.ok(sysUser);
        } catch (Exception e) {
            e.printStackTrace();
            return R.ok();
        }
    }
    @PostMapping("/updateSysUser")
    @Transactional(rollbackFor = Exception.class)
    public R<Boolean> updateSysUser(@RequestBody SysUser sysUser) {
        try {
            sysUser.setUpdateBy(SecurityUtils.getUsername());
            sysUser.setUpdateTime(new Date());
            userService.updateUser(sysUser);
            if(null != sysUser.getRoleId()){
                userRoleService.deleteSysUserRoleByUserId(sysUser.getUserId());
                SysUserRole sysUserRole = new SysUserRole();
                sysUserRole.setRoleId(sysUser.getRoleId());
                sysUserRole.setUserId(sysUser.getUserId());
                userRoleService.insertSysUserRole(sysUserRole);
            }
            return R.ok(true);
        } catch (Exception e) {
            e.printStackTrace();
            return R.fail();
        }
    }
    /**
     * 获取当前用户信息
     */
    @InnerAuth
    @GetMapping("/info/{username}")
    public R<LoginUser> info(@PathVariable("username") String username) {
        SysUser sysUser = userService.selectUserByUserName(username);
        if (StringUtils.isNull(sysUser)) {
            return R.fail("用户名或密码错误");
        }
        // 角色集合
        Set<String> roles = permissionService.getRolePermission(sysUser);
        // 权限集合getRolePermission
        Set<String> permissions = permissionService.getMenuPermission(sysUser);
        LoginUser sysUserVo = new LoginUser();
        sysUserVo.setSysUser(sysUser);
        sysUserVo.setRoles(roles);
        sysUserVo.setPermissions(permissions);
        return R.ok(sysUserVo);
    }
    /**
     * 门店登录使用
     * @param username
     * @return
     */
    @InnerAuth
    @GetMapping("/infoShop/{username}")
    public R<LoginUser> infoShop(@PathVariable("username") String username) {
        SysUser sysUser = userService.selectUserShopByUserName(username);
        if (StringUtils.isNull(sysUser)) {
            return R.fail("用户名或密码错误");
        }
        // 角色集合
        Set<String> roles = permissionService.getRolePermission(sysUser);
        // 权限集合getRolePermission
        Set<String> permissions = permissionService.getMenuPermission(sysUser);
        LoginUser sysUserVo = new LoginUser();
        sysUserVo.setSysUser(sysUser);
        sysUserVo.setRoles(roles);
        sysUserVo.setPermissions(permissions);
        return R.ok(sysUserVo);
    }
    /**
     * 注册用户信息
     */
    @PostMapping("/register")
    public R<Boolean> register(@RequestBody SysUser sysUser) {
        String username = sysUser.getUserName();
        if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) {
            return R.fail("当前系统没有开启注册功能!");
        }
        if (!userService.checkUserNameUnique(sysUser)) {
            return R.fail("保存用户'" + username + "'失败,注册账号已存在");
        }
        return R.ok(userService.registerUser(sysUser));
    }
    /**
     * 获取用户信息
     *
     * @return 用户信息
     */
    @GetMapping("/getInfo")
    public AjaxResult getInfo() {
        SysUser user = userService.selectUserById(SecurityUtils.getUserId());
        // 角色集合
        Set<String> roles = permissionService.getRolePermission(user);
        // 权限集合
        Set<String> permissions = permissionService.getMenuPermission(user);
        AjaxResult ajax = AjaxResult.success();
        ajax.put("user", user);
        ajax.put("roles", roles);
        ajax.put("permissions", permissions);
        return ajax;
    }
    /**
     * 重置密码
     */
    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
    @PutMapping("/resetPwd")
    @ApiOperation(value = "重置密码", tags = {"管理后台-账号管理", "门店后台-部门管理"})
    public AjaxResult resetPwd(@RequestBody SysUser user) {
        userService.checkUserAllowed(user);
        userService.checkUserDataScope(user.getUserId());
        user.setPassword(SecurityUtils.encryptPassword(MD5Generator.generateMD5("a123456")));
        user.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(userService.resetPwd(user));
    }
    /**
     * 状态修改
     */
    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
    @PutMapping("/changeStatus")
    public AjaxResult changeStatus(@RequestBody SysUser user) {
        userService.checkUserAllowed(user);
        userService.checkUserDataScope(user.getUserId());
        user.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(userService.updateUserStatus(user));
    }
    /**
     * 根据用户编号获取授权角色
     */
    @GetMapping("/authRole/{userId}")
    public AjaxResult authRole(@PathVariable("userId") Long userId) {
        AjaxResult ajax = AjaxResult.success();
        SysUser user = userService.selectUserById(userId);
        List<SysRole> roles = roleService.selectRolesByUserId(userId);
        ajax.put("user", user);
        ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
        return ajax;
    }
    /**
     * 用户授权角色
     */
    @Log(title = "用户管理", businessType = BusinessType.GRANT)
    @PutMapping("/authRole")
    public AjaxResult insertAuthRole(Long userId, Long[] roleIds) {
        userService.checkUserDataScope(userId);
        userService.insertUserAuth(userId, roleIds);
        return success();
    }
    /**
     * 获取部门树列表
     */
    @GetMapping("/deptTree")
    public AjaxResult deptTree(SysDept dept) {
        return success(deptService.selectDeptTreeList(dept));
    }
    @PostMapping("/updateUser")
    public R<Boolean>  updateUser(@RequestBody SysUser sysUser){
        return R.ok(userService.updateById(sysUser));
    }
    /**
     * 通过用户id查询角色对象
     * @param userId
     * @return
     */
    @PostMapping("/queryRoleByUserId/{userId}")
    public R<SysRole> queryRoleByUserId(@PathVariable("userId") Long userId){
        SysUserRole one = sysUserRoleService.getOne(Wrappers.lambdaQuery(SysUserRole.class)
                .eq(SysUserRole::getUserId, userId)
                .last("LIMIT 1"));
        System.out.println("通过用户id查询角色对象"+one);
        if(Objects.nonNull(one)){
            SysRole byId = roleService.getOne(Wrappers.lambdaQuery(SysRole.class)
                    .eq(SysRole::getRoleId,one.getRoleId())
                    .last("LIMIT 1"));
            return R.ok(byId);
        }
        return R.ok();
    }
    @PostMapping("/queryRoleByRoleId/{roleId}")
    public R<SysRole> queryRoleByRoleId(@PathVariable("roleId") Long roleId){
        return R.ok( roleService.getOne(Wrappers.lambdaQuery(SysRole.class)
                .eq(SysRole::getRoleId, roleId)
                .last("LIMIT 1")));
    }
    /**
     * 通过手机号集合查询用户
     * @param phoneList
     * @return
     */
    @PostMapping("/queryUserByPhoneList")
    public R<List<SysUser>> queryUserByPhoneList(@RequestBody List<String> phoneList){
        List<SysUser> list = userService.list(Wrappers.lambdaQuery(SysUser.class)
                .in(SysUser::getPhonenumber, phoneList)
                .ne(SysUser::getDelFlag,2));
        return R.ok(list);
    }
    /**
     * 通过手机号查询用户
     * @param phone
     * @return
     */
    @PostMapping("/queryUserByPhone")
    public R<SysUser>  queryUserByPhone(@RequestBody String phone){
        SysUser user = userService.getOne(Wrappers.lambdaQuery(SysUser.class)
                .eq(SysUser::getPhonenumber, phone)
                .last("LIMIT 1"));
        return R.ok(user);
    }
    /**
     * 通过账号查询用户
     * @param userName
     * @return
     */
    @ResponseBody
    @PostMapping("/queryUserByUserName")
    public R<SysUser> queryUserByUserName(@RequestBody String userName){
        SysUser user = userService.getOne(Wrappers.lambdaQuery(SysUser.class)
                .eq(SysUser::getUserName, userName)
                .eq(SysUser::getDelFlag, "0")
                .eq(SysUser::getStatus, 0)
                .last("LIMIT 1"));
        return R.ok(user);
    }
    /**
     * 添加管理员
     * @param user
     */
    @ResponseBody
    @PostMapping("/addSysUser")
    @Transactional(rollbackFor = Exception.class)
    public R<Long> addSysUser(@RequestBody SysUser user) {
        if(StringUtils.isEmpty(user.getUserName())){
            user.setUserName(user.getPhonenumber());
        }
        if(!org.springframework.util.StringUtils.hasLength(user.getNickName())){
            user.setNickName(user.getPhonenumber());
        }
    @Resource
    private ISysUserService userService;
    @Resource
    private ISysRoleService roleService;
    @Resource
    private ISysDeptService deptService;
    @Resource
    private ISysPostService postService;
    @Resource
    private ISysPermissionService permissionService;
    @Resource
    private ISysConfigService configService;
    @Resource
    private ISysUserRoleService userRoleService;
    @Resource
    private ISysUserRoleService sysUserRoleService;
    @Resource
    private UserShopService userShopService;
    @Resource
    private TokenService tokenService;
    @Autowired
    private ISysMenuService menuService;
    /**
     * 获取用户列表
     */
    @GetMapping("/list")
    @ApiOperation(value = "获取系统用户列表", tags = {"管理后台-账号管理", "门店后台-部门管理"})
    public AjaxResult list(GetSysUserList getSysUserList) {
        PageInfo<SysUser> pageInfo = new PageInfo<>(getSysUserList.getPageCurr(), getSysUserList.getPageSize());
        PageInfo<SysUser> page = userService.getList(pageInfo, getSysUserList);
        return AjaxResult.success(page);
    }
    /**
     * 获取用户选择列表
     */
    @PostMapping("/getChangeUserList")
    @ApiOperation(value = "获取用户选择列表", tags = {"管理后台-获取用户选择列表", "门店后台-部门管理"})
    public AjaxResult<PageInfo<SysUser>> getChangeUserList(@RequestBody ChangeUserQuery query) {
        return AjaxResult.success(userService.getChangeUserList(query));
    }
    /**
     * 新增用户
     */
    @Log(title = "用户管理", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @ApiOperation(value = "添加系统用户", tags = {"管理后台-账号管理", "门店后台-部门管理"})
    public AjaxResult add(@RequestBody SysUser user) {
        user.setUserName(user.getPhonenumber());
        Long userid = tokenService.getLoginUser().getUserid();
        SysUser sysUser1 = userService.getById(userid);
        if (!org.springframework.util.StringUtils.hasLength(user.getNickName())) {
            user.setNickName(user.getPhonenumber());
        }
        if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
            return error("手机号已开通账号");
        }
        if (StringUtils.isNotEmpty(user.getUserName()) && !userService.checkUserNameUnique(user)) {
            return error("登录账号重复");
        }
        return AjaxResult.success();
    }
    @GetMapping("/verifyUserNameRepeat/{username}")
    @ApiOperation(value = "校验账号是否重复", tags = {"管理后台-账号管理"})
    public AjaxResult verifyUserNameRepeat(@PathVariable String username) {
        SysUser user = new SysUser();
        user.setUserName(username);
        if (StringUtils.isNotEmpty(username) && !userService.checkUserNameUnique(user)) {
            return error("账号不可重复");
        }
        return success();
    }
    /**
     * 根据用户编号获取详细信息
     */
    @ApiOperation(value = "获取用户详情", tags = {"管理后台-账号管理", "门店后台-部门管理"})
    @GetMapping("/getInfo/{userId}")
    public AjaxResult getInfo(@PathVariable Long userId) {
        userService.checkUserDataScope(userId);
        AjaxResult ajax = AjaxResult.success();
        List<SysRole> roles = roleService.selectRoleAll();
        ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
        ajax.put("posts", postService.selectPostAll());
        if (StringUtils.isNotNull(userId)) {
            SysUser sysUser = userService.selectUserById(userId);
            if (sysUser.getRoleType() == 2) {
                Long userid = tokenService.getLoginUser().getUserid();
                SysUser sysUser1 = userService.selectUserById(userid);
                UserShop one = userShopService.getOne(new LambdaQueryWrapper<UserShop>().eq(UserShop::getUserId, sysUser.getUserId()).eq(UserShop::getShopId, sysUser1.getObjectId()));
                sysUser.setDeptId(one.getDeptId());
                sysUser.setNickName(one.getNickName());
                SysDept sysDept = deptService.selectDeptById(one.getDeptId());
                sysUser.setDept(sysDept);
                sysUser.setRoleId(one.getRoleId());
            }
            ajax.put("data", sysUser);
            ajax.put("postIds", postService.selectPostListByUserId(userId));
            ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList()));
        }
        return AjaxResult.success(ajax);
    }
    /**
     * 修改用户
     */
    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
    @PutMapping("/update")
    @ApiOperation(value = "编辑系统用户", tags = {"管理后台-账号管理", "门店后台-部门管理"})
    public AjaxResult edit(@Validated @RequestBody SysUser user) {
        user.setUserName(user.getPhonenumber());
        if (!org.springframework.util.StringUtils.hasLength(user.getNickName())) {
            user.setNickName(user.getPhonenumber());
        }
        R<Integer> admin = this.isAdmin(user.getUserId());
        Integer data = admin.getData();
        if (data == null || data != 1) {
            SysUserRole one = sysUserRoleService.getOne(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, user.getUserId()));
            one.setRoleId(user.getRoleId());
            sysUserRoleService.updateSysUserRole(one);
        }
        userService.checkUserAllowed(user);
        userService.checkUserDataScope(user.getUserId());
        SysUser sysUser = userService.getOne(Wrappers.lambdaQuery(SysUser.class)
                .eq(SysUser::getPhonenumber, user.getPhonenumber())
                .eq(SysUser::getDelFlag, 0)
                .last("LIMIT 1"));
        if (StringUtils.isNotEmpty(user.getPhonenumber()) && (Objects.nonNull(sysUser) && !user.getUserId().equals(sysUser.getUserId()))) {
            return error("手机号已开通账号");
        }
        sysUser = userService.getOne(Wrappers.lambdaQuery(SysUser.class)
                .eq(SysUser::getUserName, user.getUserName())
                .eq(SysUser::getDelFlag, 0)
                .last("LIMIT 1"));
        if (StringUtils.isNotEmpty(user.getUserName()) && (Objects.nonNull(sysUser) && !user.getUserId().equals(sysUser.getUserId()))) {
            return error("登录账号重复");
        }
        user.setUpdateBy(SecurityUtils.getUsername());
        if (user.getPassword() != null && !"".equals(user.getPassword())) {
            user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
            user.setPassword(SecurityUtils.encryptPassword(MD5Generator.generateMD5("a123456")));
            user.setPassWordUpdate(new Date());
        }
        if (user.getPhonenumber() != null) {
            user.setUserName(user.getPhonenumber());
        }
        user.setUpdateBy(SecurityUtils.getUsername());
        user.setUpdateTime(new Date());
        userService.updateUser(user);
        user = userService.getById(user.getUserId());
        //添加门店员工关系数据
        if (2 == user.getRoleType()) {
            UserShop one = userShopService.getOne(new LambdaQueryWrapper<UserShop>().eq(UserShop::getUserId, user.getUserId()).eq(UserShop::getShopId, user.getObjectId()));
            one.setUserId(user.getUserId());
            one.setShopId(user.getObjectId());
            one.setRoleType(one.getRoleType());
            one.setRoleId(user.getRoleId());
            one.setDeptId(user.getDeptId());
            one.setNickName(user.getNickName());
            userShopService.updateById(one);
        }
        return success();
    }
    /**
     * 删除用户
     */
    @Log(title = "用户管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{userIds}")
    @ApiOperation(value = "删除系统用户", tags = {"管理后台-账号管理", "门店后台-部门管理"})
    public AjaxResult remove(@PathVariable Long[] userIds) {
        if (ArrayUtils.contains(userIds, SecurityUtils.getUserId())) {
            return error("当前用户不能删除");
        }
        userService.deleteUserByIds(userIds);
        return AjaxResult.success();
    }
    @PostMapping("/shopUserStart")
    @ApiOperation(value = "账号管理--禁用/启用", tags = {"管理后台-账号管理", "门店后台-部门管理"})
    public AjaxResult shopUserStart(@RequestBody ShopUserStart shopUserStart) {
        if (shopUserStart.getUserId() == null) {
            return AjaxResult.error("userId不能为空");
        }
        SysUser sysUser = userService.selectUserById(shopUserStart.getUserId());
        if (sysUser.getStatus().equals("0")) {
            sysUser.setStatus("1");
            sysUser.setForbiddenRemark(shopUserStart.getRemark());
        } else {
            sysUser.setStatus("0");
            sysUser.setForbiddenRemark("");
        }
        return toAjax(userService.updateUser(sysUser));
    }
    @PostMapping("/getUserList")
    public R<List<SysUser>> getUserList(@RequestBody List<Integer> userIds) {
        List<SysUser> list = userService.list(new LambdaQueryWrapper<SysUser>().in(SysUser::getUserId, userIds));
        return R.ok(list);
    }
    @PostMapping("/isAdmin")
    public R<Integer> isAdmin(@RequestBody Long userId) {
        SysUserRole one = sysUserRoleService.getOne(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, userId));
        Long id = one.getRoleId();
        return R.ok(id.intValue());
    }
    @PostMapping("/getSysUser")
    public R<SysUser> getSysUser(@RequestParam("userId") Long userId) {
        try {
            SysUser sysUser = userService.selectUserById(userId);
            return R.ok(sysUser);
        } catch (Exception e) {
            e.printStackTrace();
            return R.ok();
        }
    }
    @PostMapping("/updateSysUser")
    @Transactional(rollbackFor = Exception.class)
    public R<Boolean> updateSysUser(@RequestBody SysUser sysUser) {
        try {
            sysUser.setUpdateBy(SecurityUtils.getUsername());
            sysUser.setUpdateTime(new Date());
            userService.updateUser(sysUser);
            if (null != sysUser.getRoleId()) {
                userRoleService.deleteSysUserRoleByUserId(sysUser.getUserId());
                SysUserRole sysUserRole = new SysUserRole();
                sysUserRole.setRoleId(sysUser.getRoleId());
                sysUserRole.setUserId(sysUser.getUserId());
                userRoleService.insertSysUserRole(sysUserRole);
            }
            return R.ok(true);
        } catch (Exception e) {
            e.printStackTrace();
            return R.fail();
        }
    }
    /**
     * 获取当前用户信息
     */
    @InnerAuth
    @GetMapping("/info/{username}")
    public R<LoginUser> info(@PathVariable("username") String username) {
        SysUser sysUser = userService.selectUserByUserName(username);
        if (StringUtils.isNull(sysUser)) {
            return R.fail("用户名或密码错误");
        }
        // 角色集合
        Set<String> roles = permissionService.getRolePermission(sysUser);
        // 权限集合getRolePermission
        Set<String> permissions = permissionService.getMenuPermission(sysUser);
        LoginUser sysUserVo = new LoginUser();
        sysUserVo.setSysUser(sysUser);
        sysUserVo.setRoles(roles);
        sysUserVo.setPermissions(permissions);
        return R.ok(sysUserVo);
    }
    /**
     * 门店登录使用
     *
     * @param username
     * @return
     */
    @InnerAuth
    @GetMapping("/infoShop/{username}")
    public R<LoginUser> infoShop(@PathVariable("username") String username) {
        SysUser sysUser = userService.selectUserShopByUserName(username);
        if (StringUtils.isNull(sysUser)) {
            return R.fail("用户名或密码错误");
        }
        // 角色集合
        Set<String> roles = permissionService.getRolePermission(sysUser);
        // 权限集合getRolePermission
        Set<String> permissions = permissionService.getMenuPermission(sysUser);
        LoginUser sysUserVo = new LoginUser();
        sysUserVo.setSysUser(sysUser);
        sysUserVo.setRoles(roles);
        sysUserVo.setPermissions(permissions);
        return R.ok(sysUserVo);
    }
    /**
     * 注册用户信息
     */
    @PostMapping("/register")
    public R<Boolean> register(@RequestBody SysUser sysUser) {
        String username = sysUser.getUserName();
        if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) {
            return R.fail("当前系统没有开启注册功能!");
        }
        if (!userService.checkUserNameUnique(sysUser)) {
            return R.fail("保存用户'" + username + "'失败,注册账号已存在");
        }
        return R.ok(userService.registerUser(sysUser));
    }
    /**
     * 获取用户信息
     *
     * @return 用户信息
     */
    @GetMapping("/getInfo")
    public AjaxResult getInfo() {
        SysUser user = userService.selectUserById(SecurityUtils.getUserId());
        // 角色集合
        Set<String> roles = permissionService.getRolePermission(user);
        // 权限集合
        Set<String> permissions = permissionService.getMenuPermission(user);
        AjaxResult ajax = AjaxResult.success();
        ajax.put("user", user);
        ajax.put("roles", roles);
        ajax.put("permissions", permissions);
        return ajax;
    }
    /**
     * 重置密码
     */
    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
    @PutMapping("/resetPwd")
    @ApiOperation(value = "重置密码", tags = {"管理后台-账号管理", "门店后台-部门管理"})
    public AjaxResult resetPwd(@RequestBody SysUser user) {
        userService.checkUserAllowed(user);
        userService.checkUserDataScope(user.getUserId());
        user.setPassword(SecurityUtils.encryptPassword(MD5Generator.generateMD5("a123456")));
        user.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(userService.resetPwd(user));
    }
    /**
     * 状态修改
     */
    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
    @PutMapping("/changeStatus")
    public AjaxResult changeStatus(@RequestBody SysUser user) {
        userService.checkUserAllowed(user);
        userService.checkUserDataScope(user.getUserId());
        user.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(userService.updateUserStatus(user));
    }
    /**
     * 根据用户编号获取授权角色
     */
    @GetMapping("/authRole/{userId}")
    public AjaxResult authRole(@PathVariable("userId") Long userId) {
        AjaxResult ajax = AjaxResult.success();
        SysUser user = userService.selectUserById(userId);
        List<SysRole> roles = roleService.selectRolesByUserId(userId);
        ajax.put("user", user);
        ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
        return ajax;
    }
    /**
     * 用户授权角色
     */
    @Log(title = "用户管理", businessType = BusinessType.GRANT)
    @PutMapping("/authRole")
    public AjaxResult insertAuthRole(Long userId, Long[] roleIds) {
        userService.checkUserDataScope(userId);
        userService.insertUserAuth(userId, roleIds);
        return success();
    }
    /**
     * 获取部门树列表
     */
    @GetMapping("/deptTree")
    public AjaxResult deptTree(SysDept dept) {
        return success(deptService.selectDeptTreeList(dept));
    }
    @PostMapping("/updateUser")
    public R<Boolean> updateUser(@RequestBody SysUser sysUser) {
        return R.ok(userService.updateById(sysUser));
    }
    /**
     * 通过用户id查询角色对象
     *
     * @param userId
     * @return
     */
    @PostMapping("/queryRoleByUserId/{userId}")
    public R<SysRole> queryRoleByUserId(@PathVariable("userId") Long userId) {
        SysUserRole one = sysUserRoleService.getOne(Wrappers.lambdaQuery(SysUserRole.class)
                .eq(SysUserRole::getUserId, userId)
                .last("LIMIT 1"));
        System.out.println("通过用户id查询角色对象" + one);
        if (Objects.nonNull(one)) {
            SysRole byId = roleService.getOne(Wrappers.lambdaQuery(SysRole.class)
                    .eq(SysRole::getRoleId, one.getRoleId())
                    .last("LIMIT 1"));
            return R.ok(byId);
        }
        return R.ok();
    }
    @PostMapping("/queryRoleByRoleId/{roleId}")
    public R<SysRole> queryRoleByRoleId(@PathVariable("roleId") Long roleId) {
        return R.ok(roleService.getOne(Wrappers.lambdaQuery(SysRole.class)
                .eq(SysRole::getRoleId, roleId)
                .last("LIMIT 1")));
    }
    /**
     * 通过手机号集合查询用户
     *
     * @param phoneList
     * @return
     */
    @PostMapping("/queryUserByPhoneList")
    public R<List<SysUser>> queryUserByPhoneList(@RequestBody List<String> phoneList) {
        List<SysUser> list = userService.list(Wrappers.lambdaQuery(SysUser.class)
                .in(SysUser::getPhonenumber, phoneList)
                .ne(SysUser::getDelFlag, 2));
        return R.ok(list);
    }
    /**
     * 通过手机号查询用户
     *
     * @param phone
     * @return
     */
    @PostMapping("/queryUserByPhone")
    public R<SysUser> queryUserByPhone(@RequestBody String phone) {
        SysUser user = userService.getOne(Wrappers.lambdaQuery(SysUser.class)
                .eq(SysUser::getPhonenumber, phone)
                .last("LIMIT 1"));
        return R.ok(user);
    }
    /**
     * 通过账号查询用户
     *
     * @param userName
     * @return
     */
    @ResponseBody
    @PostMapping("/queryUserByUserName")
    public R<SysUser> queryUserByUserName(@RequestBody String userName) {
        SysUser user = userService.getOne(Wrappers.lambdaQuery(SysUser.class)
                .eq(SysUser::getUserName, userName)
                .eq(SysUser::getDelFlag, "0")
                .eq(SysUser::getStatus, 0)
                .last("LIMIT 1"));
        return R.ok(user);
    }
    /**
     * 添加管理员
     *
     * @param user
     */
    @ResponseBody
    @PostMapping("/addSysUser")
    @Transactional(rollbackFor = Exception.class)
    public R<Long> addSysUser(@RequestBody SysUser user) {
        if (StringUtils.isEmpty(user.getUserName())) {
            user.setUserName(user.getPhonenumber());
        }
        if (!org.springframework.util.StringUtils.hasLength(user.getNickName())) {
            user.setNickName(user.getPhonenumber());
        }
//        if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
//            throw new RuntimeException("手机号已开通账号");
//        }
        if (StringUtils.isNotEmpty(user.getUserName()) && !userService.checkUserNameUnique(user)) {
            throw new RuntimeException("登录账号已存在");
        }
        user.setCreateBy(SecurityUtils.getUsername());
        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
        if(null == user.getRoleType()){
            user.setRoleType(1);
        }
        userService.insertUser(user);
        SysUserRole sysUserRole = new SysUserRole();
        sysUserRole.setRoleId(user.getRoleId());
        sysUserRole.setUserId(user.getUserId());
        userRoleService.insertSysUserRole(sysUserRole);
        return R.ok(user.getUserId());
    }
    @ResponseBody
    @PostMapping("/resetPassword")
    public R resetPassword(@RequestBody SysUser user) {
        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
        user.setUpdateBy(SecurityUtils.getUsername());
        userService.resetPwd(user);
        return R.ok();
    }
    @ResponseBody
    @PostMapping("/getSysUserById")
    public SysUser getSysUserById(@RequestParam("userId") Long userId){
        return userService.getById(userId);
    }
    /**
     * 保存门店员工管理后台账号
     * @param user
     * @return
     */
    @ResponseBody
    @PostMapping("/saveShopUser")
    public R<Long> saveShopUser(@RequestBody SysUser user){
        SysUser one = userService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getPhonenumber, user.getPhonenumber()).eq(SysUser::getDelFlag, "0")
                .eq(SysUser::getStatus, "0").eq(SysUser::getRoleType, 2));
        if(null == one){
            user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
            userService.save(user);
            //添加用户角色数据
            SysUserRole userRole = new SysUserRole();
            userRole.setUserId(user.getUserId());
            userRole.setRoleId(2L);
            userRoleService.save(userRole);
        }
        return R.ok(user.getUserId());
    }
    /**
     * 删除门店管理员账号
     * @param objectId
     * @param roleType
     * @return
     */
    @PostMapping("/user/delShopUser")
    public R delShopUser(@RequestParam("objectId") Integer objectId, @RequestParam("roleType") Integer roleType){
        List<UserShop> list2 = userShopService.list(new LambdaQueryWrapper<UserShop>().eq(UserShop::getShopId, objectId));
        for (UserShop userShop : list2) {
            List<UserShop> list1 = userShopService.list(new LambdaUpdateWrapper<UserShop>().eq(UserShop::getUserId, userShop.getUserId()));
            if(list1.size() == 1 && list1.get(0).getShopId().equals(objectId)){
                //删除管理员账号
                userService.deleteUserById(userShop.getUserId());
            }else{
                //修改管理后台账号关联的门店数据
                SysUser sysUser = userService.getById(userShop.getUserId());
                if(sysUser.getObjectId().equals(objectId)){
                    Optional<UserShop> first = list1.stream().filter(s -> !s.getShopId().equals(objectId)).findFirst();
                    if(first.isPresent()){
                        sysUser.setObjectId(first.get().getShopId());
                        userService.updateById(sysUser);
                    }
                }
            }
            userShopService.removeById(userShop.getId());
        }
        return R.ok();
    }
    @ResponseBody
    @PutMapping("/switchShop/{shopId}")
    @ApiOperation(value = "切换门店", tags = {"门店后台-首页"})
    public R<Set<String>> switchShop(@PathVariable("shopId") Integer shopId){
        Long userid = tokenService.getLoginUser().getUserid();
        UserShop one = userShopService.getOne(new LambdaQueryWrapper<UserShop>().eq(UserShop::getUserId, userid).eq(UserShop::getShopId, shopId));
        if(null == one){
            return R.fail("切换失败");
        }
        SysUser sysUser = userService.getById(userid);
        sysUser.setObjectId(shopId);
        userService.updateById(sysUser);
        //查询用户权限列表
        Long roleId = one.getRoleId();
        Set<String> rolePerms = menuService.selectMenuPermsByRoleId(roleId);
        return R.ok(rolePerms);
    }
    /**
     * 通过账号和账号权限查询用户
     * @param userName
     * @return
     */
    @PostMapping("/queryUserByUserNameAndRoleType")
    public R<SysUser>  queryUserByUserNameAndRoleType(@RequestParam("userName") String userName, @RequestParam("roleType") Integer roleType){
        SysUser user = userService.getOne(Wrappers.lambdaQuery(SysUser.class)
                .eq(SysUser::getUserName, userName)
                .eq(SysUser::getDelFlag, "0")
                .eq(SysUser::getStatus, 0)
                .eq(SysUser::getRoleType, roleType)
                .last("LIMIT 1"));
        return R.ok(user);
    }
    @PostMapping("/delSysUserById")
    public R delSysUserById(@RequestParam("userId") Long userId){
        userService.deleteUserById(userId);
        return R.ok();
    }
        if (StringUtils.isNotEmpty(user.getUserName()) && !userService.checkUserNameUnique(user)) {
            throw new RuntimeException("登录账号已存在");
        }
        user.setCreateBy(SecurityUtils.getUsername());
        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
        if (null == user.getRoleType()) {
            user.setRoleType(1);
        }
        userService.insertUser(user);
        SysUserRole sysUserRole = new SysUserRole();
        sysUserRole.setRoleId(user.getRoleId());
        sysUserRole.setUserId(user.getUserId());
        userRoleService.insertSysUserRole(sysUserRole);
        return R.ok(user.getUserId());
    }
    @ResponseBody
    @PostMapping("/resetPassword")
    public R resetPassword(@RequestBody SysUser user) {
        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
        user.setUpdateBy(SecurityUtils.getUsername());
        userService.resetPwd(user);
        return R.ok();
    }
    @ResponseBody
    @PostMapping("/getSysUserById")
    public SysUser getSysUserById(@RequestParam("userId") Long userId) {
        return userService.getById(userId);
    }
    /**
     * 保存门店员工管理后台账号
     *
     * @param user
     * @return
     */
    @ResponseBody
    @PostMapping("/saveShopUser")
    public R<Long> saveShopUser(@RequestBody SysUser user) {
        SysUser one = userService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getPhonenumber, user.getPhonenumber()).eq(SysUser::getDelFlag, "0")
                .eq(SysUser::getStatus, "0").eq(SysUser::getRoleType, 2));
        if (null == one) {
            user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
            userService.save(user);
            //添加用户角色数据
            SysUserRole userRole = new SysUserRole();
            userRole.setUserId(user.getUserId());
            userRole.setRoleId(2L);
            userRoleService.save(userRole);
        }
        return R.ok(user.getUserId());
    }
    /**
     * 删除门店管理员账号
     *
     * @param objectId
     * @param roleType
     * @return
     */
    @PostMapping("/user/delShopUser")
    public R delShopUser(@RequestParam("objectId") Integer objectId, @RequestParam("roleType") Integer roleType) {
        List<UserShop> list2 = userShopService.list(new LambdaQueryWrapper<UserShop>().eq(UserShop::getShopId, objectId));
        for (UserShop userShop : list2) {
            List<UserShop> list1 = userShopService.list(new LambdaUpdateWrapper<UserShop>().eq(UserShop::getUserId, userShop.getUserId()));
            if (list1.size() == 1 && list1.get(0).getShopId().equals(objectId)) {
                //删除管理员账号
                userService.deleteUserById(userShop.getUserId());
            } else {
                //修改管理后台账号关联的门店数据
                SysUser sysUser = userService.getById(userShop.getUserId());
                if (sysUser.getObjectId().equals(objectId)) {
                    Optional<UserShop> first = list1.stream().filter(s -> !s.getShopId().equals(objectId)).findFirst();
                    if (first.isPresent()) {
                        sysUser.setObjectId(first.get().getShopId());
                        userService.updateById(sysUser);
                    }
                }
            }
            userShopService.removeById(userShop.getId());
        }
        return R.ok();
    }
    @ResponseBody
    @PutMapping("/switchShop/{shopId}")
    @ApiOperation(value = "切换门店", tags = {"门店后台-首页"})
    public R<Set<String>> switchShop(@PathVariable("shopId") Integer shopId) {
        Long userid = tokenService.getLoginUser().getUserid();
        UserShop one = userShopService.getOne(new LambdaQueryWrapper<UserShop>().eq(UserShop::getUserId, userid).eq(UserShop::getShopId, shopId));
        if (null == one) {
            return R.fail("切换失败");
        }
        SysUser sysUser = userService.getById(userid);
        sysUser.setObjectId(shopId);
        userService.updateById(sysUser);
        //查询用户权限列表
        Long roleId = one.getRoleId();
        Set<String> rolePerms = menuService.selectMenuPermsByRoleId(roleId);
        return R.ok(rolePerms);
    }
    /**
     * 通过账号和账号权限查询用户
     *
     * @param userName
     * @return
     */
    @PostMapping("/queryUserByUserNameAndRoleType")
    public R<SysUser> queryUserByUserNameAndRoleType(@RequestParam("userName") String userName, @RequestParam("roleType") Integer roleType) {
        SysUser user = userService.getOne(Wrappers.lambdaQuery(SysUser.class)
                .eq(SysUser::getUserName, userName)
                .eq(SysUser::getDelFlag, "0")
                .eq(SysUser::getStatus, 0)
                .eq(SysUser::getRoleType, roleType)
                .last("LIMIT 1"));
        return R.ok(user);
    }
    @PostMapping("/delSysUserById")
    public R delSysUserById(@RequestParam("userId") Long userId) {
        userService.deleteUserById(userId);
        return R.ok();
    }
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/CarMapper.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.system.api.model.Car;
/**
 * @author zhibing.pu
 * @Date 2025/3/17 11:37
 */
public interface CarMapper extends BaseMapper<Car> {
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/DriverMapper.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.system.api.model.Driver;
/**
 * @author zhibing.pu
 * @Date 2025/3/17 16:25
 */
public interface DriverMapper extends BaseMapper<Driver> {
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/EnterpriseMapper.java
@@ -1,11 +1,24 @@
package com.ruoyi.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.system.api.model.Enterprise;
import com.ruoyi.system.api.query.GetEnterpriseListReq;
import org.apache.ibatis.annotations.Param;
/**
 * @author zhibing.pu
 * @Date 2025/3/4 18:30
 */
public interface EnterpriseMapper extends BaseMapper<Enterprise> {
    /**
     * 获取企业列表数据
     *
     * @param page
     * @param req
     * @return
     */
    PageInfo<Enterprise> getEnterpriseList(PageInfo<Enterprise> page, @Param("req") GetEnterpriseListReq req);
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICarService.java
New file
@@ -0,0 +1,17 @@
package com.ruoyi.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.api.model.Car;
/**
 * @author zhibing.pu
 * @Date 2025/3/17 11:38
 */
public interface ICarService extends IService<Car> {
    /**
     * 定时任务存储最新的车辆数据
     */
    void taskSaveNewCar();
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/IDriverService.java
New file
@@ -0,0 +1,17 @@
package com.ruoyi.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.api.model.Driver;
/**
 * @author zhibing.pu
 * @Date 2025/3/17 16:26
 */
public interface IDriverService extends IService<Driver> {
    /**
     * 定时任务获取新驾驶员数据
     */
    void taskSaveNewDriver();
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/IEnterpriseService.java
@@ -1,11 +1,22 @@
package com.ruoyi.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.system.api.model.Enterprise;
import com.ruoyi.system.api.query.GetEnterpriseListReq;
/**
 * @author zhibing.pu
 * @Date 2025/3/4 18:32
 */
public interface IEnterpriseService extends IService<Enterprise> {
    /**
     * 获取公司列表数据
     *
     * @param req
     * @return
     */
    PageInfo<Enterprise> getEnterpriseList(GetEnterpriseListReq req);
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CarServiceImpl.java
New file
@@ -0,0 +1,68 @@
package com.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.dataInterchange.api.feignClient.UPExgMsgRegisterClient;
import com.ruoyi.dataInterchange.api.model.enums.VehicleColorEnum;
import com.ruoyi.dataInterchange.api.vo.UPExgMsgRegisterVo;
import com.ruoyi.system.api.model.Car;
import com.ruoyi.system.api.model.Driver;
import com.ruoyi.system.api.model.Enterprise;
import com.ruoyi.system.mapper.CarMapper;
import com.ruoyi.system.service.ICarService;
import com.ruoyi.system.service.IDriverService;
import com.ruoyi.system.service.IEnterpriseService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2025/3/17 11:38
 */
@Service
public class CarServiceImpl extends ServiceImpl<CarMapper, Car> implements ICarService {
    @Resource
    private UPExgMsgRegisterClient upExgMsgRegisterClient;
    @Resource
    private IEnterpriseService enterpriseService;
    @Resource
    private IDriverService driverService;
    /**
     * 定时任务存储最新的车辆数据
     */
    @Override
    public void taskSaveNewCar() {
        Car car = this.getOne(new LambdaQueryWrapper<Car>().orderByDesc(Car::getCreateTime).last(" limit 0, 1"));
        Long startTime = -1L;
        if (null != car) {
            startTime = car.getCreateTime().toEpochSecond(ZoneOffset.ofHours(8));
        }
        List<UPExgMsgRegisterVo> list = upExgMsgRegisterClient.getUPExgMsgRegisterListIsAfterCreateTime(startTime).getData();
        List<Enterprise> list1 = enterpriseService.list();
        List<Car> carList = new ArrayList<>();
        for (UPExgMsgRegisterVo vo : list) {
            car = new Car();
            car.setVehicleNumber(vo.getVehicleNo());
            car.setLicensePlateColor(VehicleColorEnum.getName(vo.getVehicleColor()));
            Enterprise enterprise = list1.stream().filter(s -> s.getCode().equals(vo.getInferiorPlatformId().toString())).findFirst().get();
            car.setEnterpriseId(enterprise.getId());
            Driver driver = driverService.getOne(new LambdaQueryWrapper<Driver>().eq(Driver::getVehicleNumber, vo.getVehicleNo()).eq(Driver::getStatus, 1));
            if (null != driver) {
                car.setDriverId(driver.getId());
            }
            car.setGpsModel(vo.getTerminalModelType());
            car.setGpsImei(vo.getTerminalSIMCode());
            carList.add(car);
        }
        this.saveBatch(carList);
    }
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DriverServiceImpl.java
New file
@@ -0,0 +1,66 @@
package com.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.dataInterchange.api.feignClient.UPExgMsgReportDriverInfoClient;
import com.ruoyi.dataInterchange.api.vo.UPExgMsgReportDriverInfoVo;
import com.ruoyi.system.api.model.Driver;
import com.ruoyi.system.api.model.Enterprise;
import com.ruoyi.system.mapper.DriverMapper;
import com.ruoyi.system.service.IDriverService;
import com.ruoyi.system.service.IEnterpriseService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2025/3/17 16:26
 */
@Service
public class DriverServiceImpl extends ServiceImpl<DriverMapper, Driver> implements IDriverService {
    @Resource
    private UPExgMsgReportDriverInfoClient upExgMsgReportDriverInfoClient;
    @Resource
    private IDriverService driverService;
    @Resource
    private IEnterpriseService enterpriseService;
    /**
     * 定时任务获取新驾驶员数据
     */
    @Override
    public void taskSaveNewDriver() {
        Driver driver = driverService.getOne(new LambdaQueryWrapper<Driver>().eq(Driver::getStatus, 1).orderByDesc(Driver::getUpdateTime).last(" limit 0, 1"));
        Long createTime = -1L;
        if (null != driver) {
            createTime = driver.getUpdateTime().toEpochSecond(ZoneOffset.ofHours(8));
        }
        List<UPExgMsgReportDriverInfoVo> list = upExgMsgReportDriverInfoClient.getUPExgMsgReportDriverInfoListIsAfterCreateTime(createTime).getData();
        List<Enterprise> list1 = enterpriseService.list();
        List<Driver> driverList = new ArrayList<>();
        for (UPExgMsgReportDriverInfoVo vo : list) {
            driver = new Driver();
            driver.setName(vo.getDriverName());
            driver.setDrivingLicenseNumber(vo.getDriverId());
            driver.setCertification(vo.getLicence());
            driver.setOrgName(vo.getOrgName());
            Enterprise enterprise = list1.stream().filter(s -> s.getCode().equals(vo.getInferiorPlatformId().toString())).findFirst().get();
            driver.setEnterpriseId(enterprise.getId());
            driver.setContractingCompany(enterprise.getName());
            driver.setStatus(1);
            driver.setFlag(1);
            driver.setUpdateTime(LocalDateTime.now());
            driverList.add(driver);
        }
        this.saveBatch(driverList);
    }
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EnterpriseServiceImpl.java
@@ -1,7 +1,9 @@
package com.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.system.api.model.Enterprise;
import com.ruoyi.system.api.query.GetEnterpriseListReq;
import com.ruoyi.system.mapper.EnterpriseMapper;
import com.ruoyi.system.service.IEnterpriseService;
import org.springframework.stereotype.Service;
@@ -12,4 +14,17 @@
 */
@Service
public class EnterpriseServiceImpl extends ServiceImpl<EnterpriseMapper, Enterprise> implements IEnterpriseService {
    /**
     * 获取公司列表数据
     *
     * @param req
     * @return
     */
    @Override
    public PageInfo<Enterprise> getEnterpriseList(GetEnterpriseListReq req) {
        PageInfo<Enterprise> page = new PageInfo<>(req.getPageCurr(), req.getPageSize());
        return this.baseMapper.getEnterpriseList(page, req);
    }
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/TaskUtil.java
New file
@@ -0,0 +1,40 @@
package com.ruoyi.system.util;
import com.ruoyi.system.service.ICarService;
import com.ruoyi.system.service.IDriverService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
 * @author zhibing.pu
 * @Date 2025/3/17 11:01
 */
@Component
public class TaskUtil {
    @Resource
    private ICarService carService;
    @Resource
    private IDriverService driverService;
    /**
     * 定时任务获取新车辆数据
     */
    @Scheduled(fixedRate = 1000 * 60)
    public void taskSaveNewCar() {
        carService.taskSaveNewCar();
    }
    /**
     * 定时任务获取新驾驶员数据
     */
    @Scheduled(fixedRate = 1000 * 60)
    public void taskSaveNewDriver() {
        driverService.taskSaveNewDriver();
    }
}
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/EnterpriseMapper.xml
@@ -1,6 +1,27 @@
<?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.ruoyi.system.mapper.EnterpriseMapper">
    <select id="getEnterpriseList" resultType="com.ruoyi.system.api.model.Enterprise">
        select *
        from t_enterprise
        <where>
            <if test="null != req.name and '' != req.name">
                and `name` like CONCAT('%', #{req.name}, '%')
            </if>
            <if test="null != req.businessScope and '' != req.businessScope">
                and business_scope like CONCAT('%', #{req.businessScope}, '%')
            </if>
            <if test="null != req.mailingAddress and '' != req.mailingAddress">
                and mailing_address like CONCAT('%', #{req.mailingAddress}, '%')
            </if>
            <if test="null != req.legalRepresentative and '' != req.legalRepresentative">
                and legal_representative like CONCAT('%', #{req.legalRepresentative}, '%')
            </if>
            <if test="null != req.operationType and '' != req.operationType">
                and operation_type like CONCAT('%', #{req.operationType}, '%')
            </if>
        </where>
    </select>
</mapper>
ruoyi-service/pom.xml
@@ -1,50 +1,49 @@
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.ruoyi</groupId>
        <artifactId>ruoyi</artifactId>
        <version>3.6.2</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <modules>
        <module>ruoyi-dataInterchange</module>
    </modules>
    <artifactId>ruoyi-service</artifactId>
    <packaging>pom</packaging>
    <description>
        ruoyi-service
    </description>
    <dependencies>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--hutool-all-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.0.3</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-spring-boot-starter</artifactId>
            <version>4.1.2</version>
            <exclusions>
                <exclusion>
                    <artifactId>guava</artifactId>
                    <groupId>com.google.guava</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <parent>
        <groupId>com.ruoyi</groupId>
        <artifactId>ruoyi</artifactId>
        <version>3.6.2</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <modules>
        <module>ruoyi-dataInterchange</module>
    </modules>
    <artifactId>ruoyi-service</artifactId>
    <packaging>pom</packaging>
    <description>
        ruoyi-service
    </description>
    <dependencies>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--hutool-all-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.0.3</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-spring-boot-starter</artifactId>
            <version>4.1.2</version>
            <exclusions>
                <exclusion>
                    <artifactId>guava</artifactId>
                    <groupId>com.google.guava</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</project>
ruoyi-service/ruoyi-dataInterchange/pom.xml
@@ -114,6 +114,10 @@
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-api-dataInterchange</artifactId>
        </dependency>
    </dependencies>
    
    <build>
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/RuoYiDataInterchangeApplication.java
@@ -10,7 +10,7 @@
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
 * 账户模块
 * 数据交互模块
 *
 * @author ruoyi
 */
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/config/DataUpdateHandlerConfig.java
File was deleted
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/config/MybatisPlusConfig.java
File was deleted
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/controller/UPExgMsgRegisterController.java
New file
@@ -0,0 +1,58 @@
package com.ruoyi.dataInterchange.controller;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.bean.BeanUtils;
import com.ruoyi.dataInterchange.api.vo.UPExgMsgRegisterVo;
import com.ruoyi.dataInterchange.dao.UPExgMsgRegisterDao;
import com.ruoyi.dataInterchange.model.UPExgMsgRegister;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2025/3/17 13:39
 */
@RestController
@RequestMapping("/UPExgMsgRegister")
public class UPExgMsgRegisterController {
    @Resource
    private UPExgMsgRegisterDao upExgMsgRegisterDao;
    /**
     * 查询添加时间大于等于给定时间的车辆基础数据
     *
     * @param startTime
     * @return
     */
    @PostMapping("/getUPExgMsgRegisterListIsAfterCreateTime")
    public R<List<UPExgMsgRegisterVo>> getUPExgMsgRegisterListIsAfterCreateTime(@RequestParam("startTime") Long startTime) {
        List<UPExgMsgRegisterVo> voList = new ArrayList<>();
        if (-1 == startTime) {
            Iterator<UPExgMsgRegister> iterator = upExgMsgRegisterDao.findAll().iterator();
            while (iterator.hasNext()) {
                UPExgMsgRegister register = iterator.next();
                UPExgMsgRegisterVo vo = new UPExgMsgRegisterVo();
                BeanUtils.copyProperties(register, vo);
                voList.add(vo);
            }
        } else {
            List<UPExgMsgRegister> list = upExgMsgRegisterDao.findByCreateTimeIsAfter(startTime);
            for (UPExgMsgRegister register : list) {
                UPExgMsgRegisterVo vo = new UPExgMsgRegisterVo();
                BeanUtils.copyProperties(register, vo);
                voList.add(vo);
            }
        }
        return R.ok(voList);
    }
}
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/controller/UPExgMsgReportDriverInfoController.java
New file
@@ -0,0 +1,58 @@
package com.ruoyi.dataInterchange.controller;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.bean.BeanUtils;
import com.ruoyi.dataInterchange.api.vo.UPExgMsgReportDriverInfoVo;
import com.ruoyi.dataInterchange.dao.UPExgMsgReportDriverInfoAckDao;
import com.ruoyi.dataInterchange.model.UPExgMsgReportDriverInfoAck;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2025/3/17 16:35
 */
@RestController
@RequestMapping("/UPExgMsgReportDriverInfo")
public class UPExgMsgReportDriverInfoController {
    @Resource
    private UPExgMsgReportDriverInfoAckDao upExgMsgReportDriverInfoAckDao;
    /**
     * 查询添加时间等于或大于给定时间的数据
     *
     * @param createTime
     * @return
     */
    @PostMapping("/getUPExgMsgReportDriverInfoListIsAfterCreateTime")
    public R<List<UPExgMsgReportDriverInfoVo>> getUPExgMsgReportDriverInfoListIsAfterCreateTime(@RequestParam("createTime") Long createTime) {
        List<UPExgMsgReportDriverInfoVo> voList = new ArrayList<>();
        if (-1 == createTime) {
            Iterator<UPExgMsgReportDriverInfoAck> iterator = upExgMsgReportDriverInfoAckDao.findAll().iterator();
            while (iterator.hasNext()) {
                UPExgMsgReportDriverInfoAck next = iterator.next();
                UPExgMsgReportDriverInfoVo vo = new UPExgMsgReportDriverInfoVo();
                BeanUtils.copyProperties(next, vo);
                voList.add(vo);
            }
        } else {
            List<UPExgMsgReportDriverInfoAck> list = upExgMsgReportDriverInfoAckDao.findByCreateTimeIsAfter(createTime);
            for (UPExgMsgReportDriverInfoAck upExgMsgReportDriverInfoAck : list) {
                UPExgMsgReportDriverInfoVo vo = new UPExgMsgReportDriverInfoVo();
                BeanUtils.copyProperties(upExgMsgReportDriverInfoAck, vo);
                voList.add(vo);
            }
        }
        return R.ok(voList);
    }
}
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/controller/UPExgMsgTakeEwayBillController.java
New file
@@ -0,0 +1,13 @@
package com.ruoyi.dataInterchange.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author zhibing.pu
 * @Date 2025/3/17 17:29
 */
@RestController
@RequestMapping("/UPExgMsgTakeEwayBill")
public class UPExgMsgTakeEwayBillController {
}
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/dao/UPExgMsgRegisterDao.java
@@ -4,6 +4,8 @@
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2025/3/7 16:10
@@ -18,4 +20,13 @@
     * @return
     */
    UPExgMsgRegister findByVehicleNo(String vehicleNo);
    /**
     * 查询添加时间大于等于给定时间的数据
     *
     * @param createTime
     * @return
     */
    List<UPExgMsgRegister> findByCreateTimeIsAfter(Long createTime);
}
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/dao/UPExgMsgReportDriverInfoAckDao.java
@@ -4,6 +4,8 @@
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2025/3/7 17:12
@@ -19,4 +21,13 @@
     * @return
     */
    UPExgMsgReportDriverInfoAck findByVehicleNo(String vehicleNo);
    /**
     * 查询等于或者大于给定时间的数据
     *
     * @param createTime
     * @return
     */
    List<UPExgMsgReportDriverInfoAck> findByCreateTimeIsAfter(Long createTime);
}
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/model/enu/WarnType.java
New file
@@ -0,0 +1,36 @@
package com.ruoyi.dataInterchange.model.enu;
/**
 * 报警类型
 *
 * @author zhibing.pu
 * @Date 2025/3/13 12:02
 */
public enum WarnType {
    OVERSPEED_ALARM(0x0001, "超速报警"),
    FATIGUE_DRIVING_ALARM(0x0002, "疲劳驾驶报警"),
    EMERGENCY_ALARM(0x0003, "紧急报警"),
    ENTER_THE_DESIGNATED_AREA_TO_ALERT(0x0004, "进入指定区域报警"),
    LEAVE_THE_DESIGNATED_AREA_TO_CALL_THE_POLICE(0x0005, "离开指定区域报警"),
    ROAD_BLOCKING_ALARM(0x0006, "路段堵塞报警"),
    DANGEROUS_ROAD_WARNING(0x0007, "危险路段报警"),
    CROSSING_ALARM(0x0008, "越界报警"),
    BURGLAR_ALARM(0x0009, "盗警"),
    ROBBERY_POLICE(0x000A, "劫警"),
    OFF_COURSE_ALARM(0x000B, "偏离路线报警"),
    VEHICLE_MOVEMENT_ALARM(0x000C, "车辆移动报警"),
    OVERTIME_DRIVING_ALARM(0x000D, "超时驾驶报警"),
    OTHER_ALARM(0x00FF, "其他报警");
    private Integer code;
    private String name;
    WarnType(Integer code, String name) {
        this.code = code;
        this.name = name;
    }
}
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/server/ExgMsgService.java
@@ -144,26 +144,37 @@
        if (null == register) {
            upExgMsgRegisterDao.save(upExgMsgRegister);
        }
        //上报驾驶员身份识别信息请求
        UPExgMsgReportDriverInfoAck byVehicleNo = upExgMsgReportDriverInfoAckDao.findByVehicleNo(upExgMsgRegister.getVehicleNo());
        if (null == byVehicleNo) {
            down_exg_msg_report_driver_info(ctx, inferiorPlatformId, upExgMsgRegister.getVehicleNo(), upExgMsgRegister.getVehicleColor());
    }
    /**
     * 定时获取司机基础信息
     */
    public void taskReportDriverInfo() {
        Iterator<UPExgMsgRegister> iterator = upExgMsgRegisterDao.findAll().iterator();
        while (iterator.hasNext()) {
            UPExgMsgRegister register = iterator.next();
            //上报驾驶员身份识别信息请求
            UPExgMsgReportDriverInfoAck byVehicleNo = upExgMsgReportDriverInfoAckDao.findByVehicleNo(register.getVehicleNo());
            if (null == byVehicleNo) {
                down_exg_msg_report_driver_info(register.getInferiorPlatformId(), register.getVehicleNo(), register.getVehicleColor());
            }
        }
    }
    
    /**
     * 上报驾驶员身份识别信息请求
     *
     * @param ctx
     */
    public void down_exg_msg_report_driver_info(ChannelHandlerContext ctx, int inferiorPlatformId, String vehicleNo, int VehicleColor) {
    public void down_exg_msg_report_driver_info(int inferiorPlatformId, String vehicleNo, int VehicleColor) {
        DOWNExgMsgReportDriverInfo downExgMsgReportDriverInfo = new DOWNExgMsgReportDriverInfo();
        downExgMsgReportDriverInfo.setVehicleNo(vehicleNo);
        downExgMsgReportDriverInfo.setVehicleColor(VehicleColor);
        downExgMsgReportDriverInfo.setDataType(DataType.DOWN_EXG_MSG_REPORT_DRIVER_INFO.getCode());
        downExgMsgReportDriverInfo.setDataLength(0);
        byte[] body = downExgMsgReportDriverInfo.encode();
        OuterPacket out = new OuterPacket(DataType.DOWN_EXG_MSG_REPORT_DRIVER_INFO.getCode(), body);
        OuterPacket out = new OuterPacket(DataType.DOWN_EXG_MSG.getCode(), body);
        //获取从链路通道
        Channel channel = ChannelMap.getClientChannel(inferiorPlatformId);
        if (null != channel && channel.isActive()) {
@@ -215,7 +226,7 @@
        downExgMsgTakeEwaybillReq.setDataLength(0);
        
        byte[] body = downExgMsgTakeEwaybillReq.encode();
        OuterPacket out = new OuterPacket(DataType.DOWN_EXG_MSG_TAKE_EWAYBILL_REQ.getCode(), body);
        OuterPacket out = new OuterPacket(DataType.DOWN_EXG_MSG.getCode(), body);
        //获取从链路通道
        Channel channel = ChannelMap.getClientChannel(inferiorPlatformId);
        if (null != channel && channel.isActive()) {
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/server/WarnMsgService.java
@@ -152,7 +152,7 @@
        downWarnMsgUrgeTodoReq.setDataType(DataType.DOWN_WARN_MSG_URGE_TODO_REQ.getCode());
        downWarnMsgUrgeTodoReq.setDataLength(92);
        byte[] body = downWarnMsgUrgeTodoReq.encode();
        OuterPacket out = new OuterPacket(DataType.DOWN_WARN_MSG_URGE_TODO_REQ.getCode(), body);
        OuterPacket out = new OuterPacket(DataType.DOWN_WARN_MSG.getCode(), body);
        //获取从链路通道
        Channel channel = ChannelMap.getClientChannel(inferiorPlatformId);
        if (null != channel && channel.isActive()) {
ruoyi-service/ruoyi-dataInterchange/src/main/java/com/ruoyi/dataInterchange/util/TaskUtil.java
@@ -21,6 +21,14 @@
    @Resource
    private WarnMsgService warnMsgService;
    
    /**
     * 定时任务获取驾驶员信息
     */
    @Scheduled(fixedRate = 1000 * 60)
    public void taskReportDriverInfo() {
        exgMsgService.taskReportDriverInfo();
    }
    
    /**
     * 定时任务获取电子运单信息