init
This commit is contained in:
		
							
								
								
									
										3
									
								
								sl-express-ms-base-service/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								sl-express-ms-base-service/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
.idea
 | 
			
		||||
target/
 | 
			
		||||
*.iml
 | 
			
		||||
							
								
								
									
										13
									
								
								sl-express-ms-base-service/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								sl-express-ms-base-service/Dockerfile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
FROM openjdk:11-jdk
 | 
			
		||||
LABEL maintainer="研究院研发组 <research@itcast.cn>"
 | 
			
		||||
 
 | 
			
		||||
# 时区修改为东八区
 | 
			
		||||
ENV TZ=Asia/Shanghai
 | 
			
		||||
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
 | 
			
		||||
 
 | 
			
		||||
WORKDIR /app
 | 
			
		||||
ARG JAR_FILE=target/*.jar
 | 
			
		||||
ADD ${JAR_FILE} app.jar
 | 
			
		||||
 | 
			
		||||
EXPOSE 8080
 | 
			
		||||
ENTRYPOINT ["sh","-c","java -Djava.security.egd=file:/dev/./urandom -jar $JAVA_OPTS app.jar"]
 | 
			
		||||
							
								
								
									
										15
									
								
								sl-express-ms-base-service/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								sl-express-ms-base-service/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
# sl-express-base使用手册
 | 
			
		||||
 | 
			
		||||
## 1、说明
 | 
			
		||||
 | 
			
		||||
base服务主要提供系统中的基础数据功能,包括车辆、车次、车辆计划、行驶证、回车登记、司机、车型、货物类型、排班、行政机构、消息,mq发送公共类、失败mq消息等。
 | 
			
		||||
 | 
			
		||||
主要功能:
 | 
			
		||||
 | 
			
		||||
- 提供基础数据配置功能,绑定车辆、司机,安排车次等,记录车辆计划,回车登记信息。
 | 
			
		||||
- 提供mq统一发送接口,失败消息处理。
 | 
			
		||||
- 提供消息服务。
 | 
			
		||||
## 2、流程图
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										136
									
								
								sl-express-ms-base-service/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								sl-express-ms-base-service/pom.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,136 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
 | 
			
		||||
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 | 
			
		||||
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 | 
			
		||||
    <modelVersion>4.0.0</modelVersion>
 | 
			
		||||
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>com.sl-express</groupId>
 | 
			
		||||
        <artifactId>sl-express-parent</artifactId>
 | 
			
		||||
        <version>1.4</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <groupId>com.sl-express.ms.base</groupId>
 | 
			
		||||
    <artifactId>sl-express-ms-base-service</artifactId>
 | 
			
		||||
    <version>1.1-SNAPSHOT</version>
 | 
			
		||||
    <description>基础微服务</description>
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
        <maven.compiler.source>11</maven.compiler.source>
 | 
			
		||||
        <maven.compiler.target>11</maven.compiler.target>
 | 
			
		||||
        <sl-express-common.version>1.2-SNAPSHOT</sl-express-common.version>
 | 
			
		||||
        <sl-express-mq.version>1.1-SNAPSHOT</sl-express-mq.version>
 | 
			
		||||
        <sl-express-ms-base-domain.version>1.1-SNAPSHOT</sl-express-ms-base-domain.version>
 | 
			
		||||
        <sl-express-ms-transport-api.version>1.1-SNAPSHOT</sl-express-ms-transport-api.version>
 | 
			
		||||
    </properties>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.sl-express.common</groupId>
 | 
			
		||||
            <artifactId>sl-express-common</artifactId>
 | 
			
		||||
            <version>${sl-express-common.version}</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.sl-express.ms.base</groupId>
 | 
			
		||||
            <artifactId>sl-express-ms-base-domain</artifactId>
 | 
			
		||||
            <version>${sl-express-ms-base-domain.version}</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.sl-express.ms.transport</groupId>
 | 
			
		||||
            <artifactId>sl-express-ms-transport-api</artifactId>
 | 
			
		||||
            <version>${sl-express-ms-transport-api.version}</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-web</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.cloud</groupId>
 | 
			
		||||
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.cloud</groupId>
 | 
			
		||||
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.alibaba.cloud</groupId>
 | 
			
		||||
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.cloud</groupId>
 | 
			
		||||
            <artifactId>spring-cloud-starter-openfeign</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.alibaba.cloud</groupId>
 | 
			
		||||
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>mysql</groupId>
 | 
			
		||||
            <artifactId>mysql-connector-java</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-jdbc</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.baomidou</groupId>
 | 
			
		||||
            <artifactId>mybatis-plus-boot-starter</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>junit</groupId>
 | 
			
		||||
            <artifactId>junit</artifactId>
 | 
			
		||||
            <scope>test</scope>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.xuxueli</groupId>
 | 
			
		||||
            <artifactId>xxl-job-core</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.sl-express.mq</groupId>
 | 
			
		||||
            <artifactId>sl-express-mq</artifactId>
 | 
			
		||||
            <version>${sl-express-mq.version}</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.redisson</groupId>
 | 
			
		||||
            <artifactId>redisson</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.alibaba.cloud</groupId>
 | 
			
		||||
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-data-redis</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
    <build>
 | 
			
		||||
        <plugins>
 | 
			
		||||
            <plugin>
 | 
			
		||||
                <groupId>org.springframework.boot</groupId>
 | 
			
		||||
                <artifactId>spring-boot-maven-plugin</artifactId>
 | 
			
		||||
                <executions>
 | 
			
		||||
                    <execution>
 | 
			
		||||
                        <goals>
 | 
			
		||||
                            <goal>repackage</goal>
 | 
			
		||||
                            <goal>build-info</goal>
 | 
			
		||||
                        </goals>
 | 
			
		||||
                    </execution>
 | 
			
		||||
                </executions>
 | 
			
		||||
                <configuration>
 | 
			
		||||
                    <!--指定主类-->
 | 
			
		||||
                    <mainClass>com.sl.BaseApplication</mainClass>
 | 
			
		||||
                </configuration>
 | 
			
		||||
            </plugin>
 | 
			
		||||
            <plugin>
 | 
			
		||||
                <groupId>org.apache.maven.plugins</groupId>
 | 
			
		||||
                <artifactId>maven-compiler-plugin</artifactId>
 | 
			
		||||
                <configuration>
 | 
			
		||||
                    <source>11</source>
 | 
			
		||||
                    <target>11</target>
 | 
			
		||||
                </configuration>
 | 
			
		||||
            </plugin>
 | 
			
		||||
        </plugins>
 | 
			
		||||
    </build>
 | 
			
		||||
 | 
			
		||||
</project>
 | 
			
		||||
@@ -0,0 +1,18 @@
 | 
			
		||||
package com.sl;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.SpringApplication;
 | 
			
		||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
 | 
			
		||||
import org.springframework.cloud.openfeign.EnableFeignClients;
 | 
			
		||||
import org.springframework.retry.annotation.EnableRetry;
 | 
			
		||||
import org.springframework.scheduling.annotation.EnableAsync;
 | 
			
		||||
 | 
			
		||||
@EnableRetry
 | 
			
		||||
@EnableAsync
 | 
			
		||||
@EnableFeignClients
 | 
			
		||||
@SpringBootApplication
 | 
			
		||||
public class BaseApplication {
 | 
			
		||||
 | 
			
		||||
    public static void main(String[] args) {
 | 
			
		||||
        SpringApplication.run(BaseApplication.class, args);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,58 @@
 | 
			
		||||
package com.sl.ms.base.config;
 | 
			
		||||
 | 
			
		||||
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Value;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * xxl-job config
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
public class XxlJobConfig {
 | 
			
		||||
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
 | 
			
		||||
 | 
			
		||||
    @Value("${xxl.job.admin.addresses}")
 | 
			
		||||
    private String adminAddresses;
 | 
			
		||||
 | 
			
		||||
    @Value("${xxl.job.accessToken:}")
 | 
			
		||||
    private String accessToken;
 | 
			
		||||
 | 
			
		||||
    @Value("${xxl.job.executor.appname}")
 | 
			
		||||
    private String appname;
 | 
			
		||||
 | 
			
		||||
    @Value("${xxl.job.executor.address:}")
 | 
			
		||||
    private String address;
 | 
			
		||||
 | 
			
		||||
    @Value("${xxl.job.executor.ip:}")
 | 
			
		||||
    private String ip;
 | 
			
		||||
 | 
			
		||||
    @Value("${xxl.job.executor.port:0}")
 | 
			
		||||
    private int port;
 | 
			
		||||
 | 
			
		||||
    @Value("${xxl.job.executor.logpath:}")
 | 
			
		||||
    private String logPath;
 | 
			
		||||
 | 
			
		||||
    @Value("${xxl.job.executor.logretentiondays:}")
 | 
			
		||||
    private int logRetentionDays;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @Bean
 | 
			
		||||
    public XxlJobSpringExecutor xxlJobExecutor() {
 | 
			
		||||
        logger.info(">>>>>>>>>>> xxl-job config init.");
 | 
			
		||||
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
 | 
			
		||||
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
 | 
			
		||||
        xxlJobSpringExecutor.setAppname(appname);
 | 
			
		||||
        xxlJobSpringExecutor.setAddress(address);
 | 
			
		||||
        xxlJobSpringExecutor.setIp(ip);
 | 
			
		||||
        xxlJobSpringExecutor.setPort(port);
 | 
			
		||||
        xxlJobSpringExecutor.setAccessToken(accessToken);
 | 
			
		||||
        xxlJobSpringExecutor.setLogPath(logPath);
 | 
			
		||||
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
 | 
			
		||||
        return xxlJobSpringExecutor;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,11 @@
 | 
			
		||||
package com.sl.ms.base.constant;
 | 
			
		||||
 | 
			
		||||
public class WorkConstants {
 | 
			
		||||
    public static final String WORK_DATE_CONTINUITYS= "连续上班%s天 休息%s天";
 | 
			
		||||
    public static final String WORK_DATE_WEEKS = "周一 (%s) 周二 (%s) 周三 (%s) 周四 (%s) 周五 (%s) 周六 (%s) 周日 (%s)";
 | 
			
		||||
 | 
			
		||||
    public class WorkStatus{
 | 
			
		||||
        public static final byte USING = 1;
 | 
			
		||||
        public static final byte STOP = 2;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,69 @@
 | 
			
		||||
package com.sl.ms.base.controller.base;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import com.sl.ms.base.domain.base.AreaDto;
 | 
			
		||||
import com.sl.ms.base.service.base.AreaService;
 | 
			
		||||
import io.swagger.annotations.Api;
 | 
			
		||||
import io.swagger.annotations.ApiImplicitParam;
 | 
			
		||||
import io.swagger.annotations.ApiImplicitParams;
 | 
			
		||||
import io.swagger.annotations.ApiOperation;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.validation.annotation.Validated;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
 | 
			
		||||
import javax.validation.constraints.NotNull;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 前端控制器
 | 
			
		||||
 * 系统日志
 | 
			
		||||
 * </p>
 | 
			
		||||
 */
 | 
			
		||||
@Slf4j
 | 
			
		||||
@Validated
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/area")
 | 
			
		||||
@Api(value = "Area", tags = "行政区域")
 | 
			
		||||
public class AreaController {
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private AreaService areaService;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据id获取行政区域详情
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 行政区域id
 | 
			
		||||
     * @return 行政区域id
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/{id}")
 | 
			
		||||
    public AreaDto get(@PathVariable Long id) {
 | 
			
		||||
        AreaDto areaDto = BeanUtil.toBean(areaService.getById(id), AreaDto.class);
 | 
			
		||||
        areaDto.setName(areaDto.getShortName());
 | 
			
		||||
        return areaDto;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/code/{code}")
 | 
			
		||||
    public AreaDto getByCode(@PathVariable String code) {
 | 
			
		||||
        AreaDto areaDto = BeanUtil.toBean((areaService.getByCode(code)), AreaDto.class);
 | 
			
		||||
        areaDto.setName(areaDto.getShortName());
 | 
			
		||||
        return areaDto;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/children")
 | 
			
		||||
    @ApiOperation(value = "根据父级id查询子级行政区域")
 | 
			
		||||
    @ApiImplicitParams({
 | 
			
		||||
            @ApiImplicitParam(name = "parentId", value = "父级id", required = true, dataTypeClass = Long.class)})
 | 
			
		||||
    public List<AreaDto> findChildren(@NotNull(message = "父id不能为空!") @RequestParam("parentId") Long parentId) {
 | 
			
		||||
        return areaService.findChildren(parentId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/batch")
 | 
			
		||||
    @ApiOperation(value = "根据id批量查询")
 | 
			
		||||
    @ApiImplicitParams({
 | 
			
		||||
            @ApiImplicitParam(name = "ids", value = "id列表", required = true, dataTypeClass = Long.class)})
 | 
			
		||||
    public List<AreaDto> findBatch(@NotNull(message = "列表不能为空!") @RequestParam("ids") List<Long> ids) {
 | 
			
		||||
        return areaService.findBatch(ids);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,32 @@
 | 
			
		||||
package com.sl.ms.base.controller.base;
 | 
			
		||||
 | 
			
		||||
import com.itheima.auth.sdk.dto.UserDTO;
 | 
			
		||||
import com.sl.ms.base.service.base.AuthService;
 | 
			
		||||
import io.swagger.annotations.Api;
 | 
			
		||||
import io.swagger.annotations.ApiOperation;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.validation.annotation.Validated;
 | 
			
		||||
import org.springframework.web.bind.annotation.GetMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.PathVariable;
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 权限系统对接接口
 | 
			
		||||
 */
 | 
			
		||||
@Slf4j
 | 
			
		||||
@Validated
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("auth")
 | 
			
		||||
@Api(tags = "权限系统对接接口")
 | 
			
		||||
public class AuthController {
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private AuthService authService;
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/{id}")
 | 
			
		||||
    @ApiOperation(value = "根据用户id获得详细信息")
 | 
			
		||||
    public UserDTO getByUserId(@PathVariable("id") Long id) {
 | 
			
		||||
        return authService.getByUserId(id);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,161 @@
 | 
			
		||||
package com.sl.ms.base.controller.base;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
			
		||||
import com.sl.ms.base.domain.base.GoodsTypeDto;
 | 
			
		||||
import com.sl.ms.base.entity.base.GoodsTypeEntity;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckTypeGoodsTypeEntity;
 | 
			
		||||
import com.sl.ms.base.service.base.GoodsTypeService;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckTypeGoodsTypeService;
 | 
			
		||||
import com.sl.ms.base.domain.constants.TruckConstant;
 | 
			
		||||
import com.sl.transport.common.util.ObjectUtil;
 | 
			
		||||
import com.sl.transport.common.util.PageResponse;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 货物类型 业务
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("base/goodsType")
 | 
			
		||||
@Slf4j
 | 
			
		||||
public class GoodsTypeController {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private GoodsTypeService goodsTypeService;
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckTypeGoodsTypeService truckTypeGoodsTypeService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 添加货物类型
 | 
			
		||||
     *
 | 
			
		||||
     * @param dto 货物类型信息
 | 
			
		||||
     * @return 货物类型信息
 | 
			
		||||
     */
 | 
			
		||||
    @PostMapping
 | 
			
		||||
    public GoodsTypeDto saveGoodsType(@RequestBody GoodsTypeDto dto) {
 | 
			
		||||
        GoodsTypeEntity goodsTypeEntity = BeanUtil.toBean(dto, GoodsTypeEntity.class);
 | 
			
		||||
        goodsTypeService.save(goodsTypeEntity);
 | 
			
		||||
        Long goodsTypeId = goodsTypeEntity.getId();
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(dto.getTruckTypeIds())) {
 | 
			
		||||
            truckTypeGoodsTypeService.saveBatch(dto.getTruckTypeIds().stream().map(truckTypeId ->
 | 
			
		||||
                    TruckTypeGoodsTypeEntity.builder().truckTypeId(truckTypeId)
 | 
			
		||||
                            .goodsTypeId(goodsTypeId).build()
 | 
			
		||||
            ).collect(Collectors.toList()));
 | 
			
		||||
        }
 | 
			
		||||
        BeanUtil.copyProperties(goodsTypeEntity, dto);
 | 
			
		||||
        return dto;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据id获取货物类型详情
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 货物类型id
 | 
			
		||||
     * @return 货物类型信息
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/{id}")
 | 
			
		||||
    public GoodsTypeDto fineById(@PathVariable(name = "id") Long id) {
 | 
			
		||||
        log.info("base --- 获取货物类型详情");
 | 
			
		||||
        GoodsTypeEntity pdGoodsType = goodsTypeService.getById(id);
 | 
			
		||||
        log.info("base ---  goodsTypeService.getById  result:{}", pdGoodsType);
 | 
			
		||||
        GoodsTypeDto dto = null;
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(pdGoodsType)) {
 | 
			
		||||
            dto = BeanUtil.toBean(pdGoodsType, GoodsTypeDto.class);
 | 
			
		||||
            List<Long> list = truckTypeGoodsTypeService.findAll(null, dto.getId())
 | 
			
		||||
                    .stream().map(TruckTypeGoodsTypeEntity::getTruckTypeId)
 | 
			
		||||
                    .collect(Collectors.toList());
 | 
			
		||||
            dto.setTruckTypeIds(list);
 | 
			
		||||
        }
 | 
			
		||||
        return dto;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取货物类型列表
 | 
			
		||||
     *
 | 
			
		||||
     * @return 货物类型列表
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping
 | 
			
		||||
    public List<GoodsTypeDto> findAll(@RequestParam(name = "ids", required = false) List<Long> ids) {
 | 
			
		||||
        return goodsTypeService.findAll(ids).stream().map(pdGoodsType -> {
 | 
			
		||||
            GoodsTypeDto dto = BeanUtil.toBean(pdGoodsType, GoodsTypeDto.class);
 | 
			
		||||
            dto.setTruckTypeIds(truckTypeGoodsTypeService.findAll(null, dto.getId())
 | 
			
		||||
                    .stream()
 | 
			
		||||
                    .map(TruckTypeGoodsTypeEntity::getTruckTypeId)
 | 
			
		||||
                    .collect(Collectors.toList()));
 | 
			
		||||
            return dto;
 | 
			
		||||
        }).collect(Collectors.toList());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取分页货物类型数据
 | 
			
		||||
     *
 | 
			
		||||
     * @param page        页码
 | 
			
		||||
     * @param pageSize    页尺寸
 | 
			
		||||
     * @param name        货物类型名称
 | 
			
		||||
     * @param truckTypeId 车辆类型Id
 | 
			
		||||
     * @return 分页结果
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/page")
 | 
			
		||||
    public PageResponse<GoodsTypeDto> findByPage(
 | 
			
		||||
            @RequestParam(name = "page") Integer page,
 | 
			
		||||
            @RequestParam(name = "pageSize") Integer pageSize,
 | 
			
		||||
            @RequestParam(name = "name", required = false) String name,
 | 
			
		||||
            @RequestParam(name = "truckTypeId", required = false) Long truckTypeId) {
 | 
			
		||||
        IPage<GoodsTypeEntity> goodsTypePage = goodsTypeService.findByPage(page, pageSize, name, truckTypeId);
 | 
			
		||||
        List<GoodsTypeDto> goodsTypeDtoList = goodsTypePage.getRecords().stream().map(goodsType -> {
 | 
			
		||||
            GoodsTypeDto dto = new GoodsTypeDto();
 | 
			
		||||
            BeanUtil.copyProperties(goodsType, dto);
 | 
			
		||||
            dto.setTruckTypeIds(truckTypeGoodsTypeService.findAll(null, dto.getId())
 | 
			
		||||
                    .stream()
 | 
			
		||||
                    .map(TruckTypeGoodsTypeEntity::getTruckTypeId)
 | 
			
		||||
                    .collect(Collectors.toList()));
 | 
			
		||||
            return dto;
 | 
			
		||||
        }).collect(Collectors.toList());
 | 
			
		||||
        return PageResponse.<GoodsTypeDto>builder().items(goodsTypeDtoList).counts(goodsTypePage.getTotal()).page(page).pages(goodsTypePage.getPages()).pageSize(pageSize).build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/all")
 | 
			
		||||
    public List<GoodsTypeDto> findAll() {
 | 
			
		||||
        return goodsTypeService.findAll().stream().map(item -> BeanUtil.toBean(item, GoodsTypeDto.class)).collect(Collectors.toList());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新货物类型信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param id  货物类型id
 | 
			
		||||
     * @param dto 货物类型信息
 | 
			
		||||
     * @return 货物类型信息
 | 
			
		||||
     */
 | 
			
		||||
    @PutMapping("/{id}")
 | 
			
		||||
    public GoodsTypeDto update(@PathVariable(name = "id") Long id, @RequestBody GoodsTypeDto dto) {
 | 
			
		||||
        dto.setId(id);
 | 
			
		||||
        GoodsTypeEntity goodsType = BeanUtil.toBean(dto, GoodsTypeEntity.class);
 | 
			
		||||
        goodsTypeService.updateById(goodsType);
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(dto.getTruckTypeIds())) {
 | 
			
		||||
            truckTypeGoodsTypeService.delete(null, id);
 | 
			
		||||
            List<TruckTypeGoodsTypeEntity> list = dto.getTruckTypeIds().stream().map(truckTypeId ->
 | 
			
		||||
                            TruckTypeGoodsTypeEntity.builder().truckTypeId(truckTypeId).goodsTypeId(id).build())
 | 
			
		||||
                    .collect(Collectors.toList());
 | 
			
		||||
            truckTypeGoodsTypeService.saveBatch(list);
 | 
			
		||||
        }
 | 
			
		||||
        return dto;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 删除货物类型
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 货物类型id
 | 
			
		||||
     * @return 返回信息
 | 
			
		||||
     */
 | 
			
		||||
    @PutMapping("/{id}/disable")
 | 
			
		||||
    public void disable(@PathVariable(name = "id") Long id) {
 | 
			
		||||
        GoodsTypeEntity pdGoodsType = new GoodsTypeEntity();
 | 
			
		||||
        pdGoodsType.setId(id);
 | 
			
		||||
        pdGoodsType.setStatus(TruckConstant.DATA_DISABLE_STATUS);
 | 
			
		||||
        goodsTypeService.updateById(pdGoodsType);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,61 @@
 | 
			
		||||
package com.sl.ms.base.controller.base;
 | 
			
		||||
 | 
			
		||||
import com.sl.mq.service.MQService;
 | 
			
		||||
import io.swagger.annotations.Api;
 | 
			
		||||
import io.swagger.annotations.ApiImplicitParam;
 | 
			
		||||
import io.swagger.annotations.ApiImplicitParams;
 | 
			
		||||
import io.swagger.annotations.ApiOperation;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.validation.annotation.Validated;
 | 
			
		||||
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;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 通用的消息中间件发送接口
 | 
			
		||||
 *
 | 
			
		||||
 * @author zzj
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 */
 | 
			
		||||
@Slf4j
 | 
			
		||||
@Validated
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("mq")
 | 
			
		||||
@Api(tags = "通用的消息中间件")
 | 
			
		||||
public class MQController {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private MQService mqService;
 | 
			
		||||
 | 
			
		||||
    @PostMapping
 | 
			
		||||
    @ApiOperation(value = "发送实时消息", notes = "发送实时消息")
 | 
			
		||||
    @ApiImplicitParams({
 | 
			
		||||
            @ApiImplicitParam(name = "exchange", value = "交换机", required = true),
 | 
			
		||||
            @ApiImplicitParam(name = "routingKey", value = "路由key,非必须"),
 | 
			
		||||
            @ApiImplicitParam(name = "msg", value = "消息对象(json字符串)", required = true)
 | 
			
		||||
    })
 | 
			
		||||
    public boolean sendMsg(@RequestParam("exchange") String exchange,
 | 
			
		||||
                           @RequestParam(value = "routingKey", required = false) String routingKey,
 | 
			
		||||
                           @RequestParam("msg") String msg) {
 | 
			
		||||
        return this.mqService.sendMsg(exchange, routingKey, msg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostMapping("delay")
 | 
			
		||||
    @ApiOperation(value = "发送延迟消息", notes = "发送延迟消息")
 | 
			
		||||
    @ApiImplicitParams({
 | 
			
		||||
            @ApiImplicitParam(name = "exchange", value = "交换机", required = true),
 | 
			
		||||
            @ApiImplicitParam(name = "routingKey", value = "路由key,非必须"),
 | 
			
		||||
            @ApiImplicitParam(name = "msg", value = "消息对象(json字符串)", required = true),
 | 
			
		||||
            @ApiImplicitParam(name = "delay", value = "延时时间,单位:毫秒", required = true)
 | 
			
		||||
    })
 | 
			
		||||
    public boolean sendMsg(@RequestParam("exchange") String exchange,
 | 
			
		||||
                           @RequestParam(value = "routingKey", required = false) String routingKey,
 | 
			
		||||
                           @RequestParam("msg") String msg,
 | 
			
		||||
                           @RequestParam("delay") int delay) {
 | 
			
		||||
        return this.mqService.sendMsg(exchange, routingKey, msg, delay);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,82 @@
 | 
			
		||||
package com.sl.ms.base.controller.base;
 | 
			
		||||
 | 
			
		||||
import com.sl.ms.base.domain.base.LatestMessageDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.MessageAddDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.MessageDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.MessageQueryDTO;
 | 
			
		||||
import com.sl.ms.base.service.base.MessageService;
 | 
			
		||||
import com.sl.transport.common.util.PageResponse;
 | 
			
		||||
import io.swagger.annotations.Api;
 | 
			
		||||
import io.swagger.annotations.ApiImplicitParam;
 | 
			
		||||
import io.swagger.annotations.ApiImplicitParams;
 | 
			
		||||
import io.swagger.annotations.ApiOperation;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.cloud.openfeign.SpringQueryMap;
 | 
			
		||||
import org.springframework.validation.annotation.Validated;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
@Slf4j
 | 
			
		||||
@Validated
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/messages")
 | 
			
		||||
@Api(value = "Message", tags = "消息相关接口")
 | 
			
		||||
public class MessageController {
 | 
			
		||||
    @Resource
 | 
			
		||||
    private MessageService messageService;
 | 
			
		||||
 | 
			
		||||
    @ApiOperation(value = "新增消息")
 | 
			
		||||
    @PostMapping
 | 
			
		||||
    public void add(@RequestBody MessageAddDTO messageAddDTO) {
 | 
			
		||||
        messageService.add(messageAddDTO);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @ApiOperation(value = "标记已读")
 | 
			
		||||
    @PutMapping("/{id}")
 | 
			
		||||
    public void update2Read(@PathVariable("id") Long id) {
 | 
			
		||||
        messageService.update2Read(id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @ApiOperation(value = "批量已读")
 | 
			
		||||
    @PutMapping("/batchRead")
 | 
			
		||||
    public void batchRead(@RequestBody List<Long> ids) {
 | 
			
		||||
        messageService.batchRead(ids);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @ApiOperation(value = "全部已读")
 | 
			
		||||
    @PutMapping("readAll/{userId}/{contentType}")
 | 
			
		||||
    @ApiImplicitParams({
 | 
			
		||||
            @ApiImplicitParam(name = "userId", value = "用户id", required = true, dataTypeClass = Long.class),
 | 
			
		||||
            @ApiImplicitParam(name = "contentType", value = "消息类型,300:快递员端公告,301:寄件相关消息,302:签收相关消息,303:快件取消消息,304派件消息", required = true, dataTypeClass = Integer.class)
 | 
			
		||||
    })
 | 
			
		||||
    public void readAll(@PathVariable("userId") Long userId,
 | 
			
		||||
                        @PathVariable("contentType") Integer contentType) {
 | 
			
		||||
        messageService.readAll(userId, contentType);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @ApiOperation(value = "查询消息列表")
 | 
			
		||||
    @GetMapping
 | 
			
		||||
    public List<MessageDTO> list(@SpringQueryMap MessageQueryDTO messageQueryDTO) {
 | 
			
		||||
        return messageService.queryList(messageQueryDTO);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @ApiOperation(value = "根据类型查询消息数量")
 | 
			
		||||
    @GetMapping("/countType")
 | 
			
		||||
    public Integer countType(@SpringQueryMap MessageQueryDTO messageQueryDTO) {
 | 
			
		||||
        return messageService.countType(messageQueryDTO);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @ApiOperation(value = "最新消息查询")
 | 
			
		||||
    @GetMapping("latestMessage")
 | 
			
		||||
    public LatestMessageDTO latestMessage(@SpringQueryMap MessageQueryDTO messageQueryDTO) {
 | 
			
		||||
        return messageService.latestMessage(messageQueryDTO);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @ApiOperation(value = "分页查询消息列表")
 | 
			
		||||
    @GetMapping("/page")
 | 
			
		||||
    public PageResponse<MessageDTO> page(@SpringQueryMap MessageQueryDTO messageQueryDTO) {
 | 
			
		||||
        return messageService.pageQuery(messageQueryDTO);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,79 @@
 | 
			
		||||
package com.sl.ms.base.controller.base;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkPatternAddDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkPatternDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkPatternQueryDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkPatternUpdateDTO;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkPatternEntity;
 | 
			
		||||
import com.sl.ms.base.service.base.WorkPatternService;
 | 
			
		||||
import com.sl.transport.common.util.PageResponse;
 | 
			
		||||
import io.swagger.annotations.Api;
 | 
			
		||||
import io.swagger.annotations.ApiImplicitParam;
 | 
			
		||||
import io.swagger.annotations.ApiImplicitParams;
 | 
			
		||||
import io.swagger.annotations.ApiOperation;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.http.ResponseEntity;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
@RequestMapping("work-patterns")
 | 
			
		||||
@RestController
 | 
			
		||||
@Slf4j
 | 
			
		||||
@Api(tags = "工作模式相关接口")
 | 
			
		||||
public class WorkPatternController {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private WorkPatternService workPatternService;
 | 
			
		||||
 | 
			
		||||
    @GetMapping("all")
 | 
			
		||||
    @ApiOperation("工作模式列表查询")
 | 
			
		||||
    public List<WorkPatternDTO> all() {
 | 
			
		||||
       return workPatternService.all();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("page")
 | 
			
		||||
    @ApiOperation("工作模式列表查询")
 | 
			
		||||
    public PageResponse<WorkPatternDTO> list(WorkPatternQueryDTO workPatternQueryDTO) {
 | 
			
		||||
        log.info("workPatternQueryDTO : {}", workPatternQueryDTO);
 | 
			
		||||
        return workPatternService.page(workPatternQueryDTO);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("{id}")
 | 
			
		||||
    @ApiOperation("根据工作模式id获取工作模式详情")
 | 
			
		||||
    @ApiImplicitParams({
 | 
			
		||||
            @ApiImplicitParam(name = "id", value = "工作模式id")
 | 
			
		||||
    })
 | 
			
		||||
    public ResponseEntity<WorkPatternDTO> getById(@PathVariable("id") Long id) {
 | 
			
		||||
        WorkPatternDTO workPatternDTO = workPatternService.findById(id);
 | 
			
		||||
        return ResponseEntity.ok(workPatternDTO);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @DeleteMapping("{id}")
 | 
			
		||||
    @ApiOperation("工作模式删除")
 | 
			
		||||
    @ApiImplicitParams({
 | 
			
		||||
            @ApiImplicitParam(name = "id", value = "工作模式id")
 | 
			
		||||
    })
 | 
			
		||||
    public ResponseEntity<Void> delete(@PathVariable("id") Long id) {
 | 
			
		||||
        workPatternService.delete(id);
 | 
			
		||||
        return ResponseEntity.ok(null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostMapping
 | 
			
		||||
    @ApiOperation("新增工作模式")
 | 
			
		||||
    public ResponseEntity<Void> add(@RequestBody WorkPatternAddDTO workPatternAddDTO) {
 | 
			
		||||
        workPatternService.add(workPatternAddDTO);
 | 
			
		||||
        return ResponseEntity.ok(null);
 | 
			
		||||
    }
 | 
			
		||||
    @PutMapping("")
 | 
			
		||||
    @ApiOperation("修改工作模式")
 | 
			
		||||
    public ResponseEntity<Void> put(@RequestBody WorkPatternUpdateDTO workPatternUpdateDTO){
 | 
			
		||||
        workPatternService.update(workPatternUpdateDTO);
 | 
			
		||||
        return ResponseEntity.ok(null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,102 @@
 | 
			
		||||
package com.sl.ms.base.controller.base;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.date.LocalDateTimeUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkSchedulingAddDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkSchedulingDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkSchedulingQueryDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkSchedulingUpdateDTO;
 | 
			
		||||
import com.sl.ms.base.service.base.WorkSchedulingService;
 | 
			
		||||
import com.sl.transport.common.util.PageResponse;
 | 
			
		||||
import io.swagger.annotations.Api;
 | 
			
		||||
import io.swagger.annotations.ApiImplicitParam;
 | 
			
		||||
import io.swagger.annotations.ApiImplicitParams;
 | 
			
		||||
import io.swagger.annotations.ApiOperation;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.http.ResponseEntity;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
@RequestMapping("work-schedulings")
 | 
			
		||||
@Api(tags = "工作排班相关接口")
 | 
			
		||||
@RestController
 | 
			
		||||
@Slf4j
 | 
			
		||||
public class WorkSchedulingController {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private WorkSchedulingService workSchedulingService;
 | 
			
		||||
 | 
			
		||||
    @GetMapping
 | 
			
		||||
    @ApiOperation("分页查询排班")
 | 
			
		||||
    public PageResponse<WorkSchedulingDTO> list(WorkSchedulingQueryDTO workSchedulingQueryDTO) {
 | 
			
		||||
        return workSchedulingService.queryForPage(workSchedulingQueryDTO);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostMapping("batch")
 | 
			
		||||
    @ApiOperation("批量新增排班")
 | 
			
		||||
    public ResponseEntity<Void> batch(@RequestBody List<WorkSchedulingAddDTO> workSchedulingAddDTOList) {
 | 
			
		||||
        workSchedulingService.batchAdd(workSchedulingAddDTOList);
 | 
			
		||||
        return ResponseEntity.ok(null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @DeleteMapping("{id}/{operator}")
 | 
			
		||||
    @ApiOperation("删除")
 | 
			
		||||
    @ApiImplicitParams({
 | 
			
		||||
            @ApiImplicitParam(name = "id", value = "排班id"),
 | 
			
		||||
            @ApiImplicitParam(name = "operator", value = "操作人")
 | 
			
		||||
    })
 | 
			
		||||
    public ResponseEntity<Void> delete(@PathVariable("id") Long id, @PathVariable("operator") Long operator) {
 | 
			
		||||
        workSchedulingService.delete(id, operator);
 | 
			
		||||
        return ResponseEntity.ok(null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @ApiOperation("更新排班")
 | 
			
		||||
    @PutMapping("")
 | 
			
		||||
    public ResponseEntity<Void> update(@RequestBody WorkSchedulingUpdateDTO workSchedulingUpdateDTO) {
 | 
			
		||||
        workSchedulingService.update(workSchedulingUpdateDTO);
 | 
			
		||||
        return ResponseEntity.ok(null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @ApiOperation("根据用户id查询这个月排班计划")
 | 
			
		||||
    @GetMapping("currentSchedule/{userId}")
 | 
			
		||||
    @ApiImplicitParams({
 | 
			
		||||
            @ApiImplicitParam(name = "userId", value = "用户id"),
 | 
			
		||||
    })
 | 
			
		||||
    public ResponseEntity<WorkSchedulingDTO> currentSchedule(@PathVariable("userId") Long userId) {
 | 
			
		||||
        return ResponseEntity.ok(workSchedulingService.currentSchedule(userId));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @ApiOperation("根据网点id查询该网点所有员工的排班信息")
 | 
			
		||||
    @GetMapping("todayScheduleByAgencyId/{agencyId}")
 | 
			
		||||
    @ApiImplicitParams({
 | 
			
		||||
            @ApiImplicitParam(name = "agencyId", value = "网点id")
 | 
			
		||||
    })
 | 
			
		||||
    public ResponseEntity<List<WorkSchedulingDTO>> monthScheduleByAgencyId(@PathVariable("agencyId") Long agencyId) {
 | 
			
		||||
        return ResponseEntity.ok(workSchedulingService.monthScheduleByAgencyId(agencyId));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @ApiOperation("根据快递员/司机id列表或网点id查询当前工作排班")
 | 
			
		||||
    @GetMapping("todaySchedule/{userType}")
 | 
			
		||||
    @ApiImplicitParams({
 | 
			
		||||
            @ApiImplicitParam(name = "userIdList", value = "userId列表,可以是快递员id列表也可以是司机id列表"),
 | 
			
		||||
            @ApiImplicitParam(name = "agencyId", value = "网点id"),
 | 
			
		||||
            @ApiImplicitParam(name = "userType", value = "用户类型:1:员工,2:快递员,3:司机"),
 | 
			
		||||
            @ApiImplicitParam(name = "time", value = "日期"),
 | 
			
		||||
    })
 | 
			
		||||
    public ResponseEntity<List<WorkSchedulingDTO>> monthSchedule(
 | 
			
		||||
            @RequestParam(value = "userIdList", required = false) String userIdList,
 | 
			
		||||
            @RequestParam(value = "agencyId", required = false) Long agencyId,
 | 
			
		||||
            @PathVariable("userType") Byte type,
 | 
			
		||||
            @RequestParam("time") Long time){
 | 
			
		||||
        List<Long> userIds = ObjectUtil.isNotEmpty(userIdList) ? Arrays.stream(userIdList.split(",")).filter(StrUtil::isNotEmpty).map(Long::parseLong).collect(Collectors.toList()) : new ArrayList<>();
 | 
			
		||||
        return ResponseEntity.ok(workSchedulingService.monthSchedule(userIds, agencyId, type, LocalDateTimeUtil.of(time)));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,207 @@
 | 
			
		||||
package com.sl.ms.base.controller.truck;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
			
		||||
import com.sl.ms.base.domain.enums.TruckRunStatusEnum;
 | 
			
		||||
import com.sl.ms.base.domain.truck.TruckDto;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckEntity;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckTypeEntity;
 | 
			
		||||
import com.sl.ms.base.entity.user.TruckDriverEntity;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckService;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckTypeService;
 | 
			
		||||
import com.sl.ms.base.service.user.TruckDriverService;
 | 
			
		||||
import com.sl.transport.common.util.PageResponse;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.util.*;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车辆业务
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("base/truck")
 | 
			
		||||
public class TruckController {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckService truckService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckDriverService truckDriverService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckTypeService truckTypeService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 添加车辆
 | 
			
		||||
     *
 | 
			
		||||
     * @param dto 车辆信息
 | 
			
		||||
     * @return 车辆信息
 | 
			
		||||
     */
 | 
			
		||||
    @PostMapping
 | 
			
		||||
    public TruckDto saveTruck(@RequestBody TruckDto dto) {
 | 
			
		||||
        TruckEntity truckEntity = BeanUtil.toBean(dto, TruckEntity.class);
 | 
			
		||||
        // 車型計算
 | 
			
		||||
        List<TruckTypeEntity> all = truckTypeService.findAll(Collections.singletonList(dto.getTruckTypeId()));
 | 
			
		||||
        if (CollUtil.isNotEmpty(all)) {
 | 
			
		||||
            TruckTypeEntity truckTypeEntity = all.get(0);
 | 
			
		||||
            if (ObjectUtil.isNotEmpty(truckTypeEntity)) {
 | 
			
		||||
                truckEntity.setAllowableLoad(truckTypeEntity.getAllowableLoad());
 | 
			
		||||
                truckEntity.setAllowableVolume(truckTypeEntity.getAllowableVolume());
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        truckService.save(truckEntity);
 | 
			
		||||
        BeanUtil.copyProperties(truckEntity, dto);
 | 
			
		||||
        return dto;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据id获取车辆详情
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 车辆id
 | 
			
		||||
     * @return 车辆信息
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/{id}")
 | 
			
		||||
    public TruckDto fineById(@PathVariable(name = "id") Long id) {
 | 
			
		||||
        TruckEntity truckEntity = truckService.getById(id);
 | 
			
		||||
        if (ObjectUtil.isEmpty(truckEntity)) {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        return BeanUtil.toBean(truckEntity, TruckDto.class);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取车辆分页数据
 | 
			
		||||
     *
 | 
			
		||||
     * @param page         页码
 | 
			
		||||
     * @param pageSize     页尺寸
 | 
			
		||||
     * @param truckTypeId  车辆类型id
 | 
			
		||||
     * @param licensePlate 车牌号码
 | 
			
		||||
     * @return 车辆分页数据
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/page")
 | 
			
		||||
    public PageResponse<TruckDto> findByPage(@RequestParam(name = "page") Integer page,
 | 
			
		||||
                                             @RequestParam(name = "pageSize") Integer pageSize,
 | 
			
		||||
                                             @RequestParam(name = "truckTypeId", required = false) Long truckTypeId,
 | 
			
		||||
                                             @RequestParam(name = "status", required = false) Integer status,
 | 
			
		||||
                                             @RequestParam(name = "licensePlate", required = false) String licensePlate) {
 | 
			
		||||
        IPage<TruckEntity> truckPage = truckService.findByPage(page, pageSize, truckTypeId, status, licensePlate);
 | 
			
		||||
        List<TruckDto> dtoList = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
        // 车型
 | 
			
		||||
        Set<Long> truckTypeSet = new HashSet<>();
 | 
			
		||||
        truckPage.getRecords().forEach(truckDto -> {
 | 
			
		||||
            if (ObjectUtil.isNotEmpty(truckDto.getTruckTypeId())) {
 | 
			
		||||
                truckTypeSet.add(truckDto.getTruckTypeId());
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        Map<Long, TruckTypeEntity> truckTypeVOMap = truckTypeService.truckTypeMap(truckTypeSet);
 | 
			
		||||
 | 
			
		||||
        truckPage.getRecords().forEach(pdTruck -> {
 | 
			
		||||
            TruckDto dto = BeanUtil.toBean(pdTruck, TruckDto.class);
 | 
			
		||||
 | 
			
		||||
            LambdaQueryWrapper<TruckDriverEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
            lambdaQueryWrapper.eq(TruckDriverEntity::getTruckId, dto.getId());
 | 
			
		||||
            long count = truckDriverService.count(lambdaQueryWrapper);
 | 
			
		||||
            dto.setDriverNum((int) count);
 | 
			
		||||
 | 
			
		||||
            if (ObjectUtil.isNotEmpty(dto.getTruckTypeId())) {
 | 
			
		||||
                TruckTypeEntity truckTypeVo = truckTypeVOMap.get(dto.getTruckTypeId());
 | 
			
		||||
                dto.setTruckTypeName(truckTypeVo.getName());
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            dtoList.add(dto);
 | 
			
		||||
        });
 | 
			
		||||
        return PageResponse.<TruckDto>builder().items(dtoList).pageSize(pageSize).page(page).counts(truckPage.getTotal())
 | 
			
		||||
                .pages(truckPage.getPages()).build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取车辆列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param ids 车辆id列表
 | 
			
		||||
     * @return 车辆列表
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping
 | 
			
		||||
    public List<TruckDto> findAll(@RequestParam(name = "ids", required = false) List<Long> ids) {
 | 
			
		||||
        return truckService.findAll(ids).stream().map(truckEntity -> {
 | 
			
		||||
            TruckDto dto = BeanUtil.toBean(truckEntity, TruckDto.class);
 | 
			
		||||
            LambdaQueryWrapper<TruckDriverEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
            lambdaQueryWrapper.eq(TruckDriverEntity::getTruckId, dto.getId());
 | 
			
		||||
            long count = truckDriverService.count(lambdaQueryWrapper);
 | 
			
		||||
            dto.setDriverNum((int) count);
 | 
			
		||||
            return dto;
 | 
			
		||||
        }).collect(Collectors.toList());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新车辆信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param id  车辆id
 | 
			
		||||
     * @param dto 车辆信息
 | 
			
		||||
     * @return 车辆信息
 | 
			
		||||
     */
 | 
			
		||||
    @PutMapping("/{id}")
 | 
			
		||||
    public TruckDto update(@PathVariable(name = "id") Long id, @RequestBody TruckDto dto) {
 | 
			
		||||
        dto.setId(id);
 | 
			
		||||
        TruckEntity truckEntity = BeanUtil.toBean(dto, TruckEntity.class);
 | 
			
		||||
        truckService.updateById(truckEntity);
 | 
			
		||||
        return dto;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 统计车辆数量
 | 
			
		||||
     *
 | 
			
		||||
     * @return 车辆数量
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/count")
 | 
			
		||||
    public Map<Integer, Long> count() {
 | 
			
		||||
        return truckService.groupByStatus();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 禁用车辆
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 车辆id
 | 
			
		||||
     */
 | 
			
		||||
    @PutMapping("/{id}/disable")
 | 
			
		||||
    public void disable(@PathVariable(name = "id") Long id) {
 | 
			
		||||
        truckService.stopById(id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 启用车辆
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 车辆id
 | 
			
		||||
     */
 | 
			
		||||
    @PutMapping("/{id}/enable")
 | 
			
		||||
    public void enable(@PathVariable(name = "id") Long id) {
 | 
			
		||||
        truckService.workedById(id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 删除车辆
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 车辆id
 | 
			
		||||
     */
 | 
			
		||||
    @PutMapping("/{id}/del")
 | 
			
		||||
    public void del(@PathVariable(name = "id") Long id) {
 | 
			
		||||
        truckService.del(id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新车辆状态
 | 
			
		||||
     * 调用时机 车辆出库
 | 
			
		||||
     * @param id 车辆id
 | 
			
		||||
     * @param status 车辆状态枚举
 | 
			
		||||
     */
 | 
			
		||||
    @PutMapping("/updateRunStatus")
 | 
			
		||||
    public void updateRunStatus(@RequestParam(name = "id") Long id, @RequestParam("status") TruckRunStatusEnum status) {
 | 
			
		||||
        truckService.updateRunStatus(id, status);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,46 @@
 | 
			
		||||
package com.sl.ms.base.controller.truck;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import com.sl.ms.base.domain.truck.TruckLicenseDto;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckLicenseEntity;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckLicenseService;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车辆行驶证业务
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("base/truck/license")
 | 
			
		||||
public class TruckLicenseController {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckLicenseService truckLicenseService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 保存车辆行驶证信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param dto 车辆行驶证信息
 | 
			
		||||
     * @return 车辆行驶证信息
 | 
			
		||||
     */
 | 
			
		||||
    @PostMapping
 | 
			
		||||
    public TruckLicenseDto saveTruckLicense(@RequestBody TruckLicenseDto dto) {
 | 
			
		||||
        TruckLicenseEntity pdTruckLicenseEntity = BeanUtil.toBean(dto, TruckLicenseEntity.class);
 | 
			
		||||
        pdTruckLicenseEntity = truckLicenseService.saveTruckLicense(pdTruckLicenseEntity);
 | 
			
		||||
        BeanUtil.copyProperties(pdTruckLicenseEntity, dto);
 | 
			
		||||
        return dto;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据id获取车辆行驶证详情
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 车辆行驶证id
 | 
			
		||||
     * @return 车辆行驶证信息
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/{id}")
 | 
			
		||||
    public TruckLicenseDto fineById(@PathVariable(name = "id") Long id) {
 | 
			
		||||
        TruckLicenseEntity pdTruckLicense = truckLicenseService.getById(id);
 | 
			
		||||
        return BeanUtil.toBean(pdTruckLicense, TruckLicenseDto.class);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,58 @@
 | 
			
		||||
package com.sl.ms.base.controller.truck;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import com.sl.ms.base.domain.enums.StatusEnum;
 | 
			
		||||
import com.sl.ms.base.domain.truck.TruckPlanDto;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckPlanEntity;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckPlanService;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车辆计划
 | 
			
		||||
 */
 | 
			
		||||
@Slf4j
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("base/plan/")
 | 
			
		||||
public class TruckPlanController {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckPlanService truckPlanService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取未分配运输任务的车次计划列表
 | 
			
		||||
     * @return 未分配运输任务的车次计划列表
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/unassignedPlan/{shardTotal}/{shardIndex}")
 | 
			
		||||
    public List<TruckPlanDto> pullUnassignedPlan(@PathVariable(name = "shardTotal") Integer shardTotal, @PathVariable(name = "shardIndex") Integer shardIndex) {
 | 
			
		||||
        // 查询计划
 | 
			
		||||
        return truckPlanService.pullUnassignedPlan(shardTotal, shardIndex);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据ID获取
 | 
			
		||||
     * @param id 数据库ID
 | 
			
		||||
     * @return 返回信息
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("{id}")
 | 
			
		||||
    public TruckPlanDto findOne(@PathVariable("id") Long id) {
 | 
			
		||||
        TruckPlanEntity truckPlanEntity = truckPlanService.getById(id);
 | 
			
		||||
        return BeanUtil.toBean(truckPlanEntity, TruckPlanDto.class);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 计划完成
 | 
			
		||||
     * @param currentOrganId 结束机构id
 | 
			
		||||
     * @param planId          计划ID
 | 
			
		||||
     * @param truckId 车辆ID
 | 
			
		||||
     * @param statusEnum 车辆状态枚举
 | 
			
		||||
     */
 | 
			
		||||
    @PutMapping("finished")
 | 
			
		||||
    void finished(@RequestParam("currentOrganId") Long currentOrganId, @RequestParam("planId") Long planId, @RequestParam("truckId") Long truckId, @RequestParam("statusEnum") StatusEnum statusEnum) {
 | 
			
		||||
        truckPlanService.finishedPlan(currentOrganId, planId, truckId, statusEnum);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,49 @@
 | 
			
		||||
package com.sl.ms.base.controller.truck;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import com.sl.ms.base.domain.truck.TruckReturnRegisterDTO;
 | 
			
		||||
import com.sl.ms.base.domain.truck.TruckReturnRegisterListDTO;
 | 
			
		||||
import com.sl.ms.base.domain.truck.TruckReturnRegisterPageQueryDTO;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckReturnRegisterEntity;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckReturnRegisterService;
 | 
			
		||||
import com.sl.transport.common.util.PageResponse;
 | 
			
		||||
import io.swagger.annotations.Api;
 | 
			
		||||
import io.swagger.annotations.ApiImplicitParam;
 | 
			
		||||
import io.swagger.annotations.ApiImplicitParams;
 | 
			
		||||
import io.swagger.annotations.ApiOperation;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 回车登记
 | 
			
		||||
 */
 | 
			
		||||
@Api(tags = "回车登记")
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("base/returnRegister")
 | 
			
		||||
@Slf4j
 | 
			
		||||
public class TruckReturnRegisterController {
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckReturnRegisterService truckReturnRegisterService;
 | 
			
		||||
 | 
			
		||||
    @PostMapping
 | 
			
		||||
    @ApiOperation(value = "新增回车登记", notes = "新增回车登记记录")
 | 
			
		||||
    public void save(@RequestBody TruckReturnRegisterDTO truckReturnRegisterDTO) {
 | 
			
		||||
        TruckReturnRegisterEntity truckReturnRegisterEntity = BeanUtil.toBean(truckReturnRegisterDTO, TruckReturnRegisterEntity.class);
 | 
			
		||||
        truckReturnRegisterService.save(truckReturnRegisterEntity);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostMapping("pageQuery")
 | 
			
		||||
    @ApiOperation(value = "分页查询回车登记列表")
 | 
			
		||||
    public PageResponse<TruckReturnRegisterListDTO> pageQuery(@RequestBody TruckReturnRegisterPageQueryDTO truckReturnRegisterPageQueryDTO) {
 | 
			
		||||
        return truckReturnRegisterService.pageQuery(truckReturnRegisterPageQueryDTO);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/{id}")
 | 
			
		||||
    @ApiOperation(value = "根据id查询回车登记详情")
 | 
			
		||||
    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "回车登记id",dataTypeClass = Long.class)})
 | 
			
		||||
    public TruckReturnRegisterDTO findById(@PathVariable("id") Long id) {
 | 
			
		||||
        return truckReturnRegisterService.findById(id);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,131 @@
 | 
			
		||||
package com.sl.ms.base.controller.truck;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import com.sl.ms.base.domain.truck.TransportTripsTruckDriverDto;
 | 
			
		||||
import com.sl.ms.base.domain.truck.TruckTripsDto;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TransportTripsTruckDriverEntity;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckTripsEntity;
 | 
			
		||||
import com.sl.ms.base.service.truck.TransportTripsTruckDriverService;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckTripsService;
 | 
			
		||||
import com.sl.transport.common.util.ObjectUtil;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车次
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("base/trips")
 | 
			
		||||
public class TruckTripsController {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckTripsService truckTripsService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TransportTripsTruckDriverService transportTripsTruckDriverService;
 | 
			
		||||
    /**
 | 
			
		||||
     * 添加车次
 | 
			
		||||
     *
 | 
			
		||||
     * @param dto 车次信息
 | 
			
		||||
     * @return 车次信息
 | 
			
		||||
     */
 | 
			
		||||
    @PostMapping
 | 
			
		||||
    public TruckTripsDto save(@RequestBody TruckTripsDto dto) {
 | 
			
		||||
        TruckTripsEntity truckTripsEntity = BeanUtil.toBean(dto, TruckTripsEntity.class);
 | 
			
		||||
        truckTripsService.save(truckTripsEntity);
 | 
			
		||||
        return dto;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据id获取车次详情
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 车次id
 | 
			
		||||
     * @return 车次信息
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/{id}")
 | 
			
		||||
    public TruckTripsDto fineById(@PathVariable(name = "id") Long id) {
 | 
			
		||||
        TruckTripsEntity truckTripsEntity = truckTripsService.getById(id);
 | 
			
		||||
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(truckTripsEntity)) {
 | 
			
		||||
            return BeanUtil.toBean(truckTripsEntity, TruckTripsDto.class);
 | 
			
		||||
        }
 | 
			
		||||
        return new TruckTripsDto();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取车次列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param transportLineId 线路id
 | 
			
		||||
     * @param ids             车次id列表
 | 
			
		||||
     * @return 车次列表
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping
 | 
			
		||||
    public List<TruckTripsDto> findAll(@RequestParam(name = "transportLineId", required = false) Long transportLineId,
 | 
			
		||||
                                       @RequestParam(name = "ids", required = false) List<Long> ids) {
 | 
			
		||||
        return truckTripsService.findAll(transportLineId, ids)
 | 
			
		||||
                .stream()
 | 
			
		||||
                .map(truckTrips -> BeanUtil.toBean(truckTrips, TruckTripsDto.class))
 | 
			
		||||
                .collect(Collectors.toList());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新车次信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param id  车次id
 | 
			
		||||
     * @param dto 车次信息
 | 
			
		||||
     * @return 车次信息
 | 
			
		||||
     */
 | 
			
		||||
    @PutMapping("/{id}")
 | 
			
		||||
    public TruckTripsDto update(@PathVariable(name = "id") Long id,
 | 
			
		||||
                                @RequestBody TruckTripsDto dto) {
 | 
			
		||||
        dto.setId(id);
 | 
			
		||||
        TruckTripsEntity truckTripsEntity = BeanUtil.toBean(dto, TruckTripsEntity.class);
 | 
			
		||||
        truckTripsService.updateById(truckTripsEntity);
 | 
			
		||||
        return dto;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 删除车次信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 车次信息
 | 
			
		||||
     */
 | 
			
		||||
    @PutMapping("/{id}/disable")
 | 
			
		||||
    public void disable(@PathVariable(name = "id") Long id) {
 | 
			
		||||
        truckTripsService.disable(id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 批量保存车次与车辆和司机关联关系
 | 
			
		||||
     *
 | 
			
		||||
     * @param dtoList 车次与车辆和司机关联关系
 | 
			
		||||
     */
 | 
			
		||||
    @PostMapping("{id}/truckDriver")
 | 
			
		||||
    public void batchSaveTruckDriver(@PathVariable(value = "id", required = false) Long transportTripsId,
 | 
			
		||||
                                @RequestBody List<TransportTripsTruckDriverDto> dtoList) {
 | 
			
		||||
        transportTripsTruckDriverService.batchSave(transportTripsId, dtoList.stream().map(dto -> {
 | 
			
		||||
            dto.setTransportTripsId(transportTripsId);
 | 
			
		||||
            return BeanUtil.toBean(dto, TransportTripsTruckDriverEntity.class);
 | 
			
		||||
        }).collect(Collectors.toList()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取车次与车辆和司机关联关系列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param transportTripsId 车次id
 | 
			
		||||
     * @param truckId          车辆id
 | 
			
		||||
     * @param driverId           司机id
 | 
			
		||||
     * @return 车次与车辆和司机关联关系列表
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("truckDriver")
 | 
			
		||||
    public List<TransportTripsTruckDriverDto> findAllTruckDriverTransportTrips(@RequestParam(name = "transportTripsId", required = false) Long transportTripsId,
 | 
			
		||||
                                          @RequestParam(name = "truckId", required = false) Long truckId,
 | 
			
		||||
                                          @RequestParam(name = "driverId", required = false) Long driverId) {
 | 
			
		||||
        return transportTripsTruckDriverService.findAll(transportTripsId, truckId, driverId)
 | 
			
		||||
                .parallelStream()
 | 
			
		||||
                .map(transportTripsTruck -> BeanUtil.toBean(transportTripsTruck, TransportTripsTruckDriverDto.class))
 | 
			
		||||
                .collect(Collectors.toList());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,159 @@
 | 
			
		||||
package com.sl.ms.base.controller.truck;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
			
		||||
import com.sl.ms.base.domain.truck.TruckTypeDto;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckTypeEntity;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckTypeGoodsTypeEntity;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckService;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckTypeGoodsTypeService;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckTypeService;
 | 
			
		||||
import com.sl.transport.common.util.PageResponse;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车辆类型 业务
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("base/truck/type")
 | 
			
		||||
public class TruckTypeController {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckTypeService truckTypeService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckTypeGoodsTypeService truckTypeGoodsTypeService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckService truckService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 添加车辆类型
 | 
			
		||||
     *
 | 
			
		||||
     * @param dto 车辆类型信息
 | 
			
		||||
     * @return 车辆类型信息
 | 
			
		||||
     */
 | 
			
		||||
    @PostMapping
 | 
			
		||||
    public TruckTypeDto saveTruckType(@RequestBody TruckTypeDto dto) {
 | 
			
		||||
        TruckTypeEntity truckTypeEntity = BeanUtil.toBean(dto, TruckTypeEntity.class);
 | 
			
		||||
        truckTypeService.save(truckTypeEntity);
 | 
			
		||||
        Long truckTypeId = truckTypeEntity.getId();
 | 
			
		||||
        //处理与货物类型的关联
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(dto.getGoodsTypeIds())) {
 | 
			
		||||
            List<TruckTypeGoodsTypeEntity> list = dto.getGoodsTypeIds()
 | 
			
		||||
                    .stream()
 | 
			
		||||
                    .map(id -> TruckTypeGoodsTypeEntity.builder().goodsTypeId(id).truckTypeId(truckTypeId).build())
 | 
			
		||||
                    .collect(Collectors.toList());
 | 
			
		||||
            truckTypeGoodsTypeService.saveBatch(list);
 | 
			
		||||
        }
 | 
			
		||||
        BeanUtil.copyProperties(truckTypeEntity, dto);
 | 
			
		||||
        return dto;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据id获取车辆类型详情
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 车辆类型id
 | 
			
		||||
     * @return 车辆类型信息
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/{id}")
 | 
			
		||||
    public TruckTypeDto fineById(@PathVariable(name = "id") String id) {
 | 
			
		||||
        TruckTypeEntity truckTypeEntity = truckTypeService.getById(id);
 | 
			
		||||
        TruckTypeDto dto = BeanUtil.toBean(truckTypeEntity, TruckTypeDto.class);
 | 
			
		||||
        List<Long> list = truckTypeGoodsTypeService.findAll(dto.getId(), null)
 | 
			
		||||
                .stream()
 | 
			
		||||
                .map(TruckTypeGoodsTypeEntity::getGoodsTypeId)
 | 
			
		||||
                .collect(Collectors.toList());
 | 
			
		||||
        dto.setGoodsTypeIds(list);
 | 
			
		||||
        return dto;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取车辆类型分页数据
 | 
			
		||||
     *
 | 
			
		||||
     * @param page               页码
 | 
			
		||||
     * @param pageSize           页尺寸
 | 
			
		||||
     * @param name               车辆类型名称
 | 
			
		||||
     * @param minAllowableLoad   车辆载重最小值(闭区间)
 | 
			
		||||
     * @param maxAllowableLoad   车辆载重最大值(开区间)
 | 
			
		||||
     * @param minAllowableVolume 车辆体积最小值(闭区间)
 | 
			
		||||
     * @param maxAllowableVolume 车辆体积最小值(开区间)
 | 
			
		||||
     * @param id                 车型id
 | 
			
		||||
     * @return 车辆类型分页数据
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/page")
 | 
			
		||||
    public PageResponse<TruckTypeDto> findByPage(@RequestParam(name = "page") Integer page,
 | 
			
		||||
                                                 @RequestParam(name = "pageSize") Integer pageSize,
 | 
			
		||||
                                                 @RequestParam(name = "name", required = false) String name,
 | 
			
		||||
                                                 @RequestParam(name = "minAllowableLoad", required = false) BigDecimal minAllowableLoad,
 | 
			
		||||
                                                 @RequestParam(name = "maxAllowableLoad", required = false) BigDecimal maxAllowableLoad,
 | 
			
		||||
                                                 @RequestParam(name = "minAllowableVolume", required = false) BigDecimal minAllowableVolume,
 | 
			
		||||
                                                 @RequestParam(name = "maxAllowableVolume", required = false) BigDecimal maxAllowableVolume,
 | 
			
		||||
                                                 @RequestParam(name = "id", required = false) Long id) {
 | 
			
		||||
        IPage<TruckTypeEntity> pdTruckTypePage = truckTypeService.findByPage(page, pageSize, name, minAllowableLoad, maxAllowableLoad, minAllowableVolume, maxAllowableVolume, id);
 | 
			
		||||
        List<TruckTypeDto> dtoList = new ArrayList<>();
 | 
			
		||||
        pdTruckTypePage.getRecords().forEach(truckType -> {
 | 
			
		||||
            TruckTypeDto dto = BeanUtil.toBean(truckType, TruckTypeDto.class);
 | 
			
		||||
            List<Long> list = truckTypeGoodsTypeService.findAll(dto.getId(), null).stream().map(TruckTypeGoodsTypeEntity::getGoodsTypeId).collect(Collectors.toList());
 | 
			
		||||
            dto.setGoodsTypeIds(list);
 | 
			
		||||
            int size = truckService.countByType(truckType.getId());
 | 
			
		||||
            dto.setNum(size);
 | 
			
		||||
            dtoList.add(dto);
 | 
			
		||||
        });
 | 
			
		||||
        return PageResponse.<TruckTypeDto>builder().items(dtoList).pageSize(pageSize).page(page).counts(pdTruckTypePage.getTotal()).pages(pdTruckTypePage.getPages()).build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取车辆类型列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param ids 车辆类型id
 | 
			
		||||
     * @return 车辆类型列表
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping
 | 
			
		||||
    public List<TruckTypeDto> findAll(@RequestParam(name = "ids", required = false) List<Long> ids) {
 | 
			
		||||
        return truckTypeService.findAll(ids).stream().map(truckType -> {
 | 
			
		||||
            TruckTypeDto dto = BeanUtil.toBean(truckType, TruckTypeDto.class);
 | 
			
		||||
            List<Long> list = truckTypeGoodsTypeService.findAll(dto.getId(), null).stream().map(TruckTypeGoodsTypeEntity::getGoodsTypeId).collect(Collectors.toList());
 | 
			
		||||
            dto.setGoodsTypeIds(list);
 | 
			
		||||
            return dto;
 | 
			
		||||
        }).collect(Collectors.toList());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新车辆类型信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param id  车辆类型id
 | 
			
		||||
     * @param dto 车辆类型信息
 | 
			
		||||
     * @return 车辆类型信息
 | 
			
		||||
     */
 | 
			
		||||
    @PutMapping("/{id}")
 | 
			
		||||
    public TruckTypeDto update(@PathVariable(name = "id") Long id, @RequestBody TruckTypeDto dto) {
 | 
			
		||||
        dto.setId(id);
 | 
			
		||||
        truckTypeService.updateById(BeanUtil.toBean(dto, TruckTypeEntity.class));
 | 
			
		||||
        //处理与货物类型的关联
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(dto.getGoodsTypeIds())) {
 | 
			
		||||
            truckTypeGoodsTypeService.delete(id, null);
 | 
			
		||||
            //绑定新的关系
 | 
			
		||||
            truckTypeGoodsTypeService.saveBatch(dto.getGoodsTypeIds().stream().map(goodsTypeId -> TruckTypeGoodsTypeEntity.builder().goodsTypeId(goodsTypeId).truckTypeId(id).build()).collect(Collectors.toList()));
 | 
			
		||||
        }
 | 
			
		||||
        return dto;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 删除车辆类型
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 车辆类型Id
 | 
			
		||||
     */
 | 
			
		||||
    @PutMapping("/{id}/disable")
 | 
			
		||||
    public void disable(@PathVariable(name = "id") Long id) {
 | 
			
		||||
        truckTypeService.disable(id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,143 @@
 | 
			
		||||
package com.sl.ms.base.controller.user;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
			
		||||
import com.sl.ms.base.domain.user.TruckDriverDto;
 | 
			
		||||
import com.sl.ms.base.domain.user.TruckDriverLicenseDto;
 | 
			
		||||
import com.sl.ms.base.entity.user.TruckDriverEntity;
 | 
			
		||||
import com.sl.ms.base.entity.user.TruckDriverLicenseEntity;
 | 
			
		||||
import com.sl.ms.base.service.user.TruckDriverLicenseService;
 | 
			
		||||
import com.sl.ms.base.service.user.TruckDriverService;
 | 
			
		||||
import com.sl.transport.common.util.PageResponse;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 司机相关
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("sys/driver")
 | 
			
		||||
public class TruckDriverController {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckDriverService truckDriverService;
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckDriverLicenseService truckDriverLicenseService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 保存司机基本信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param dto 司机基本信息
 | 
			
		||||
     * @return 返回信息
 | 
			
		||||
     */
 | 
			
		||||
    @PostMapping
 | 
			
		||||
    public TruckDriverDto saveDriver(@RequestBody TruckDriverDto dto) {
 | 
			
		||||
        return truckDriverService.saveDriver(dto);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取司机基本信息列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param userIds 司机id列表
 | 
			
		||||
     * @return 司机基本信息列表
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping
 | 
			
		||||
    public List<TruckDriverDto> findAllDriver(@RequestParam(name = "userIds", required = false) List<Long> userIds) {
 | 
			
		||||
        return truckDriverService.findAll(userIds)
 | 
			
		||||
                .stream()
 | 
			
		||||
                .map(pdTruckDriver -> BeanUtil.toBean(pdTruckDriver, TruckDriverDto.class))
 | 
			
		||||
                .collect(Collectors.toList());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取司机基本信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 司机id
 | 
			
		||||
     * @return 司机基本信息
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/{id}")
 | 
			
		||||
    public TruckDriverDto findOneDriver(@PathVariable(name = "id") Long id) {
 | 
			
		||||
        TruckDriverEntity truckDriverEntity = truckDriverService.findOne(id);
 | 
			
		||||
        return BeanUtil.toBean(truckDriverEntity, TruckDriverDto.class);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 保存司机驾驶证信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param dto 司机驾驶证信息
 | 
			
		||||
     * @return 返回信息
 | 
			
		||||
     */
 | 
			
		||||
    @PostMapping("/driverLicense")
 | 
			
		||||
    public TruckDriverLicenseDto saveDriverLicense(@RequestBody TruckDriverLicenseDto dto) {
 | 
			
		||||
        TruckDriverLicenseEntity driverLicense = BeanUtil.toBean(dto, TruckDriverLicenseEntity.class);
 | 
			
		||||
        truckDriverLicenseService.saveOrUpdate(driverLicense);
 | 
			
		||||
        BeanUtil.copyProperties(driverLicense, dto);
 | 
			
		||||
        return dto;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取司机驾驶证信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 司机id
 | 
			
		||||
     * @return 司机驾驶证信息
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/{id}/driverLicense")
 | 
			
		||||
    public TruckDriverLicenseDto findOneDriverLicense(@PathVariable(name = "id") Long id) {
 | 
			
		||||
        TruckDriverLicenseEntity driverLicense = truckDriverLicenseService.findOne(id);
 | 
			
		||||
        return BeanUtil.toBean(driverLicense, TruckDriverLicenseDto.class);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 绑定司机列表
 | 
			
		||||
     * @param truckId 车辆ID
 | 
			
		||||
     * @return 司机数量
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/count")
 | 
			
		||||
    public List<TruckDriverDto> findByTruckId(@RequestParam(name = "truckId", required = false) Long truckId) {
 | 
			
		||||
        return  truckDriverService.findByTruckId(truckId)
 | 
			
		||||
                .stream()
 | 
			
		||||
                .map(truckDriverEntity -> BeanUtil.toBean(truckDriverEntity, TruckDriverDto.class))
 | 
			
		||||
                .collect(Collectors.toList());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取司机分页数据
 | 
			
		||||
     *
 | 
			
		||||
     * @param page     页码
 | 
			
		||||
     * @param pageSize 页尺寸
 | 
			
		||||
     * @return 司机分页数据
 | 
			
		||||
     */
 | 
			
		||||
    @GetMapping("/page")
 | 
			
		||||
    public PageResponse<TruckDriverDto> findByPage(@RequestParam(name = "page") Integer page,
 | 
			
		||||
                                                   @RequestParam(name = "pageSize") Integer pageSize) {
 | 
			
		||||
        IPage<TruckDriverEntity> truckPage = truckDriverService.findByPage(page, pageSize);
 | 
			
		||||
        List<TruckDriverDto> dtoList = truckPage.getRecords()
 | 
			
		||||
                .stream()
 | 
			
		||||
                .map(truckDriverEntity -> BeanUtil.toBean(truckDriverEntity, TruckDriverDto.class))
 | 
			
		||||
                .collect(Collectors.toList());
 | 
			
		||||
 | 
			
		||||
        return PageResponse.<TruckDriverDto>builder()
 | 
			
		||||
                .items(dtoList)
 | 
			
		||||
                .pageSize(pageSize)
 | 
			
		||||
                .page(page)
 | 
			
		||||
                .counts(truckPage.getTotal())
 | 
			
		||||
                .pages(truckPage.getPages()).build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/findAll")
 | 
			
		||||
    public List<TruckDriverDto> findAll(@RequestParam(name = "ids", required = false) List<Long> ids) {
 | 
			
		||||
        LambdaQueryWrapper<TruckDriverEntity> wrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        wrapper.in(CollUtil.isNotEmpty(ids), TruckDriverEntity::getId, ids);
 | 
			
		||||
        return truckDriverService.list(wrapper)
 | 
			
		||||
                .stream()
 | 
			
		||||
                .map(truckDriver -> BeanUtil.toBean(truckDriver, TruckDriverDto.class))
 | 
			
		||||
                .collect(Collectors.toList());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,83 @@
 | 
			
		||||
package com.sl.ms.base.entity.base;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableName;
 | 
			
		||||
import com.sl.transport.common.entity.BaseEntity;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 实体类
 | 
			
		||||
 * 行政区域
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
@Data
 | 
			
		||||
 | 
			
		||||
@TableName("sl_area")
 | 
			
		||||
 | 
			
		||||
public class AreaEntity extends BaseEntity implements Serializable {
 | 
			
		||||
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
    /**
 | 
			
		||||
     * 父级行政区域id
 | 
			
		||||
     */
 | 
			
		||||
    private Long parentId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 行政区域名称
 | 
			
		||||
     */
 | 
			
		||||
    private String name;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 行政区域编码
 | 
			
		||||
     */
 | 
			
		||||
    private String areaCode;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 城市编码
 | 
			
		||||
     */
 | 
			
		||||
    private String cityCode;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 合并名称
 | 
			
		||||
     */
 | 
			
		||||
    private String mergerName;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 简称
 | 
			
		||||
     */
 | 
			
		||||
    private String shortName;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 邮政编码
 | 
			
		||||
     */
 | 
			
		||||
    private String zipCode;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 行政区域等级(0: 省级 1:市级 2:县级 3:镇级 4:乡村级)
 | 
			
		||||
     */
 | 
			
		||||
    private Integer level;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 经度
 | 
			
		||||
     */
 | 
			
		||||
    private String lng;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 纬度
 | 
			
		||||
     */
 | 
			
		||||
    private String lat;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 拼音
 | 
			
		||||
     */
 | 
			
		||||
    private String pinyin;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 首字母
 | 
			
		||||
     */
 | 
			
		||||
    private String first;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,44 @@
 | 
			
		||||
package com.sl.ms.base.entity.base;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableName;
 | 
			
		||||
import com.sl.transport.common.entity.BaseEntity;
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import lombok.Builder;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 货物类型表
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@Builder
 | 
			
		||||
@NoArgsConstructor
 | 
			
		||||
@AllArgsConstructor
 | 
			
		||||
@TableName("sl_goods_type")
 | 
			
		||||
public class GoodsTypeEntity extends BaseEntity {
 | 
			
		||||
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 货物类型名称
 | 
			
		||||
     */
 | 
			
		||||
    private String name;
 | 
			
		||||
    /**
 | 
			
		||||
     * 默认重量,单位:千克
 | 
			
		||||
     */
 | 
			
		||||
    private BigDecimal defaultWeight;
 | 
			
		||||
    /**
 | 
			
		||||
     * 默认体积,单位:方
 | 
			
		||||
     */
 | 
			
		||||
    private BigDecimal defaultVolume;
 | 
			
		||||
    /**
 | 
			
		||||
     * 说明
 | 
			
		||||
     */
 | 
			
		||||
    private String remark;
 | 
			
		||||
    /**
 | 
			
		||||
     * 状态 0:禁用 1:正常
 | 
			
		||||
     */
 | 
			
		||||
    private Integer status;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,75 @@
 | 
			
		||||
package com.sl.ms.base.entity.base;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableName;
 | 
			
		||||
import com.sl.transport.common.entity.BaseEntity;
 | 
			
		||||
import lombok.*;
 | 
			
		||||
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 消息表
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@EqualsAndHashCode(callSuper = true)
 | 
			
		||||
@AllArgsConstructor
 | 
			
		||||
@NoArgsConstructor
 | 
			
		||||
@Builder
 | 
			
		||||
@TableName("sl_message")
 | 
			
		||||
public class MessageEntity extends BaseEntity{
 | 
			
		||||
 | 
			
		||||
    private static final long serialVersionUID = 4805339214539835115L;
 | 
			
		||||
    /**
 | 
			
		||||
     * 消息标题
 | 
			
		||||
     */
 | 
			
		||||
    private String title;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 消息内容
 | 
			
		||||
     */
 | 
			
		||||
    private String content;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 1:用户端,2:司机端,3:快递员端,4:后台管理系统
 | 
			
		||||
     */
 | 
			
		||||
    private Integer bussinessType;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 消息接受者
 | 
			
		||||
     */
 | 
			
		||||
    private Long userId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 消息类型,300:快递员端公告,301:寄件相关消息,302:签收相关消息,303:快件取消消息,200:司机端公告,201:司机端系统通知
 | 
			
		||||
     */
 | 
			
		||||
    private Integer contentType;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 消息是否已读,0:未读,1:已读
 | 
			
		||||
     */
 | 
			
		||||
    private Integer isRead;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 读时间
 | 
			
		||||
     */
 | 
			
		||||
    private LocalDateTime readTime;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 相关id
 | 
			
		||||
     */
 | 
			
		||||
    private Long relevantId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建者
 | 
			
		||||
     */
 | 
			
		||||
    private Long createUser;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新者
 | 
			
		||||
     */
 | 
			
		||||
    private Long updateUser;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 逻辑删除,0:未删除,1:已删除
 | 
			
		||||
     */
 | 
			
		||||
    private Integer isDelete;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,27 @@
 | 
			
		||||
package com.sl.ms.base.entity.base;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableName;
 | 
			
		||||
import com.sl.transport.common.entity.BaseEntity;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
@Data
 | 
			
		||||
@TableName("sl_work_history_scheduling")
 | 
			
		||||
public class WorkHistorySchedulingEntity extends BaseEntity {
 | 
			
		||||
    private Long userId;
 | 
			
		||||
 | 
			
		||||
    private String name;
 | 
			
		||||
 | 
			
		||||
    private String phone;
 | 
			
		||||
 | 
			
		||||
    private String employeeNumber;
 | 
			
		||||
 | 
			
		||||
    private Integer workDay;
 | 
			
		||||
 | 
			
		||||
    private String workMonth;
 | 
			
		||||
 | 
			
		||||
    private Byte userType;
 | 
			
		||||
 | 
			
		||||
    private Byte workPatternType;
 | 
			
		||||
 | 
			
		||||
    private Long workPatternId;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,53 @@
 | 
			
		||||
package com.sl.ms.base.entity.base;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableName;
 | 
			
		||||
import com.sl.transport.common.entity.BaseEntity;
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import lombok.Builder;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
 | 
			
		||||
@Data
 | 
			
		||||
@Builder
 | 
			
		||||
@NoArgsConstructor
 | 
			
		||||
@AllArgsConstructor
 | 
			
		||||
@TableName("sl_work_pattern")
 | 
			
		||||
public class WorkPatternEntity extends BaseEntity {
 | 
			
		||||
 | 
			
		||||
    private String name;
 | 
			
		||||
 | 
			
		||||
    private Byte userType;
 | 
			
		||||
 | 
			
		||||
    private Byte workPatternType;
 | 
			
		||||
 | 
			
		||||
    private Byte monday;
 | 
			
		||||
 | 
			
		||||
    private Byte tuesday;
 | 
			
		||||
 | 
			
		||||
    private Byte wednesday;
 | 
			
		||||
 | 
			
		||||
    private Byte thursday;
 | 
			
		||||
 | 
			
		||||
    private Byte friday;
 | 
			
		||||
 | 
			
		||||
    private Byte saturday;
 | 
			
		||||
 | 
			
		||||
    private Byte sunday;
 | 
			
		||||
 | 
			
		||||
    private Integer workDayNum;
 | 
			
		||||
 | 
			
		||||
    private Integer restDayNum;
 | 
			
		||||
 | 
			
		||||
    private Byte status;
 | 
			
		||||
 | 
			
		||||
    private Integer workStartMinute1;
 | 
			
		||||
 | 
			
		||||
    private Integer workEndMinute1;
 | 
			
		||||
 | 
			
		||||
    private Long creater;
 | 
			
		||||
 | 
			
		||||
    private Long updater;
 | 
			
		||||
 | 
			
		||||
    private Boolean isDelete;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,36 @@
 | 
			
		||||
package com.sl.ms.base.entity.base;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableName;
 | 
			
		||||
import com.sl.transport.common.entity.BaseEntity;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
 | 
			
		||||
@TableName("sl_work_scheduling")
 | 
			
		||||
@Data
 | 
			
		||||
public class WorkSchedulingEntity extends BaseEntity {
 | 
			
		||||
    private Long userId;
 | 
			
		||||
 | 
			
		||||
    private Byte userType;
 | 
			
		||||
 | 
			
		||||
    private Long agencyId;
 | 
			
		||||
 | 
			
		||||
    private String employeeNumber;
 | 
			
		||||
 | 
			
		||||
    private String name;
 | 
			
		||||
 | 
			
		||||
    private String phone;
 | 
			
		||||
 | 
			
		||||
    private Byte state;
 | 
			
		||||
 | 
			
		||||
    private Long workPatternId;
 | 
			
		||||
 | 
			
		||||
    private LocalDateTime workContinueStartTime;
 | 
			
		||||
 | 
			
		||||
    private Long creater;
 | 
			
		||||
 | 
			
		||||
    private Long updater;
 | 
			
		||||
 | 
			
		||||
    private Boolean isDelete;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,31 @@
 | 
			
		||||
package com.sl.ms.base.entity.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableName;
 | 
			
		||||
import com.sl.transport.common.entity.BaseEntity;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 车次与车辆关联表
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author itcast
 | 
			
		||||
 * @since 2019-12-20
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@TableName("sl_truck_trips_truck_driver")
 | 
			
		||||
public class TransportTripsTruckDriverEntity extends BaseEntity {
 | 
			
		||||
    private static final long serialVersionUID = 2060686653575483040L;
 | 
			
		||||
    /**
 | 
			
		||||
     * 车辆id
 | 
			
		||||
     */
 | 
			
		||||
    private Long truckId;
 | 
			
		||||
    /**
 | 
			
		||||
     * 车次id
 | 
			
		||||
     */
 | 
			
		||||
    private Long transportTripsId;
 | 
			
		||||
    /**
 | 
			
		||||
     * 司机id
 | 
			
		||||
     */
 | 
			
		||||
    private Long driverId;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,89 @@
 | 
			
		||||
package com.sl.ms.base.entity.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableName;
 | 
			
		||||
import com.sl.ms.base.domain.enums.TruckRunStatusEnum;
 | 
			
		||||
import com.sl.transport.common.entity.BaseEntity;
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import lombok.Builder;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车辆信息表
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@Builder
 | 
			
		||||
@NoArgsConstructor
 | 
			
		||||
@AllArgsConstructor
 | 
			
		||||
@TableName("sl_truck")
 | 
			
		||||
public class TruckEntity extends BaseEntity {
 | 
			
		||||
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 车辆类型id
 | 
			
		||||
     */
 | 
			
		||||
    private Long truckTypeId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 品牌
 | 
			
		||||
     */
 | 
			
		||||
    private String brand;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 车牌号码
 | 
			
		||||
     */
 | 
			
		||||
    private String licensePlate;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * GPS设备id
 | 
			
		||||
     */
 | 
			
		||||
    private String deviceGpsId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 准载重量
 | 
			
		||||
     */
 | 
			
		||||
    private BigDecimal allowableLoad;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 准载体积
 | 
			
		||||
     */
 | 
			
		||||
    private BigDecimal allowableVolume;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 车辆行驶证信息id
 | 
			
		||||
     */
 | 
			
		||||
    private Long truckLicenseId;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * 状态 0:禁用 1:正常
 | 
			
		||||
     */
 | 
			
		||||
    private Integer status;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 运输状态 1:启用 2:停用
 | 
			
		||||
     * @see TruckWorkStatusEnum
 | 
			
		||||
     */
 | 
			
		||||
    private Integer workStatus;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 运输状态 0:已到达 1:运输中
 | 
			
		||||
     * @see TruckRunStatusEnum
 | 
			
		||||
     */
 | 
			
		||||
    private Integer runStatus;
 | 
			
		||||
 | 
			
		||||
    //所在机构id
 | 
			
		||||
    private Long currentOrganId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 图片信息
 | 
			
		||||
     */
 | 
			
		||||
    private String picture;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 满载系数
 | 
			
		||||
     */
 | 
			
		||||
    private Double loadingRatio;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,78 @@
 | 
			
		||||
package com.sl.ms.base.entity.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableName;
 | 
			
		||||
import com.sl.transport.common.entity.BaseEntity;
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import lombok.Builder;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
import java.time.LocalDate;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车辆行驶证表
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@Builder
 | 
			
		||||
@NoArgsConstructor
 | 
			
		||||
@AllArgsConstructor
 | 
			
		||||
@TableName("sl_truck_license")
 | 
			
		||||
public class TruckLicenseEntity extends BaseEntity {
 | 
			
		||||
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 车辆id
 | 
			
		||||
     */
 | 
			
		||||
    private Long truckId;
 | 
			
		||||
    /**
 | 
			
		||||
     * 发动机编号
 | 
			
		||||
     */
 | 
			
		||||
    private String engineNumber;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 注册时间
 | 
			
		||||
     */
 | 
			
		||||
    private LocalDate registrationDate;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 国家强制报废日期
 | 
			
		||||
     */
 | 
			
		||||
    private LocalDate mandatoryScrap;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 检验有效期
 | 
			
		||||
     */
 | 
			
		||||
    private LocalDate expirationDate;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 整备质量
 | 
			
		||||
     */
 | 
			
		||||
    private BigDecimal overallQuality;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 核定载质量
 | 
			
		||||
     */
 | 
			
		||||
    private BigDecimal allowableWeight;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 外廓尺寸
 | 
			
		||||
     */
 | 
			
		||||
    private String outsideDimensions;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 行驶证有效期
 | 
			
		||||
     */
 | 
			
		||||
    private LocalDate validityPeriod;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 行驶证号
 | 
			
		||||
     */
 | 
			
		||||
    private String transportCertificateNumber;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 图片信息
 | 
			
		||||
     */
 | 
			
		||||
    private String picture;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,58 @@
 | 
			
		||||
package com.sl.ms.base.entity.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableName;
 | 
			
		||||
import com.sl.ms.base.domain.enums.TruckPlanScheduleStatusEnum;
 | 
			
		||||
import com.sl.transport.common.entity.BaseEntity;
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import lombok.Builder;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车次与车辆关联表
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@Builder
 | 
			
		||||
@NoArgsConstructor
 | 
			
		||||
@AllArgsConstructor
 | 
			
		||||
@TableName("sl_truck_plan")
 | 
			
		||||
public class TruckPlanEntity extends BaseEntity {
 | 
			
		||||
 | 
			
		||||
    private static final long serialVersionUID = 2060686653575483040L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 车辆id
 | 
			
		||||
     */
 | 
			
		||||
    private Long truckId;
 | 
			
		||||
    /**
 | 
			
		||||
     * 车次id
 | 
			
		||||
     */
 | 
			
		||||
    private Long transportTripsId;
 | 
			
		||||
    /**
 | 
			
		||||
     * 司机id
 | 
			
		||||
     */
 | 
			
		||||
    private String driverIds;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 计划发车时间
 | 
			
		||||
     */
 | 
			
		||||
    private LocalDateTime planDepartureTime;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 计划到达时间
 | 
			
		||||
     */
 | 
			
		||||
    private LocalDateTime planArrivalTime;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 状态
 | 
			
		||||
     * @see com.sl.ms.base.domain.enums.StatusEnum
 | 
			
		||||
     */
 | 
			
		||||
    private Integer status;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @see TruckPlanScheduleStatusEnum
 | 
			
		||||
     */
 | 
			
		||||
    private Integer scheduleStatus;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,119 @@
 | 
			
		||||
package com.sl.ms.base.entity.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableName;
 | 
			
		||||
import com.sl.ms.base.domain.enums.TruckAccidentTypeEnum;
 | 
			
		||||
import com.sl.ms.base.domain.enums.TruckBreakRulesTypeEnum;
 | 
			
		||||
import com.sl.ms.base.domain.enums.TruckFaultTypeEnum;
 | 
			
		||||
import com.sl.transport.common.entity.BaseEntity;
 | 
			
		||||
import lombok.*;
 | 
			
		||||
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 回车登记表
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@EqualsAndHashCode(callSuper = false)
 | 
			
		||||
@Builder
 | 
			
		||||
@NoArgsConstructor
 | 
			
		||||
@AllArgsConstructor
 | 
			
		||||
@TableName("sl_truck_return_register")
 | 
			
		||||
public class TruckReturnRegisterEntity extends BaseEntity {
 | 
			
		||||
    private static final long serialVersionUID = 9041809464760457223L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 主键
 | 
			
		||||
     */
 | 
			
		||||
    private Long id;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 车辆id
 | 
			
		||||
     */
 | 
			
		||||
    private Long truckId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 运输任务id
 | 
			
		||||
     */
 | 
			
		||||
    private Long transportTaskId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 出库时间
 | 
			
		||||
     */
 | 
			
		||||
    private LocalDateTime outStorageTime;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 入库时间
 | 
			
		||||
     */
 | 
			
		||||
    private LocalDateTime intoStorageTime;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 车辆是否违章,1-是,0-否
 | 
			
		||||
     */
 | 
			
		||||
    private boolean isBreakRules;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 违章类型,1-闯红灯,2-无证驾驶,3-超载,4-酒后驾驶,5-超速行驶
 | 
			
		||||
     */
 | 
			
		||||
    private TruckBreakRulesTypeEnum breakRulesType;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 违章说明,类型为“其他”时填写
 | 
			
		||||
     */
 | 
			
		||||
    private String breakRulesDescription;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 罚款金额
 | 
			
		||||
     */
 | 
			
		||||
    private BigDecimal penaltyAmount;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 扣分
 | 
			
		||||
     */
 | 
			
		||||
    private Integer deductPoints;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 车辆是否故障,1-是,0-否
 | 
			
		||||
     */
 | 
			
		||||
    private boolean isFault;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 车辆是否可用,1-是,0-否
 | 
			
		||||
     */
 | 
			
		||||
    private Boolean isAvailable = true;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 故障类型,1-发动机启动困难,2-不着车,3-漏油,4-漏水,5-照明失灵,6-有异响,7-排烟异常,8-温度异常,9-其他
 | 
			
		||||
     */
 | 
			
		||||
    private TruckFaultTypeEnum faultType;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 故障说明,类型为“其他”时填写
 | 
			
		||||
     */
 | 
			
		||||
    private String faultDescription;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 故障图片
 | 
			
		||||
     */
 | 
			
		||||
    private String faultImages;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 车辆是否发生事故,1-是,0-否
 | 
			
		||||
     */
 | 
			
		||||
    private boolean isAccident;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 事故类型,1-直行事故,2-追尾事故,3-超车事故,4-左转弯事故,5-右转弯事故,6-弯道事故,7-坡道事故,8-会车事故,9-其他
 | 
			
		||||
     */
 | 
			
		||||
    private TruckAccidentTypeEnum accidentType;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 事故说明,类型为“其他”时填写
 | 
			
		||||
     */
 | 
			
		||||
    private String accidentDescription;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 事故图片
 | 
			
		||||
     */
 | 
			
		||||
    private String accidentImages;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,51 @@
 | 
			
		||||
package com.sl.ms.base.entity.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableName;
 | 
			
		||||
import com.sl.transport.common.entity.BaseEntity;
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import lombok.Builder;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车次信息表
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@Builder
 | 
			
		||||
@NoArgsConstructor
 | 
			
		||||
@AllArgsConstructor
 | 
			
		||||
@TableName("sl_truck_trips")
 | 
			
		||||
public class TruckTripsEntity extends BaseEntity {
 | 
			
		||||
 | 
			
		||||
    private static final long serialVersionUID = -934311173866081843L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 车次名称
 | 
			
		||||
     */
 | 
			
		||||
    private String name;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 发车时间 分钟
 | 
			
		||||
     */
 | 
			
		||||
    private Integer departureTime;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 持续时间 分钟
 | 
			
		||||
     */
 | 
			
		||||
    private Integer estimatedTime;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 所属线路id
 | 
			
		||||
     */
 | 
			
		||||
    private Long transportLineId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 周期,1为天,2为周,3为月
 | 
			
		||||
     */
 | 
			
		||||
    private Integer period;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 状态  0:禁用   1:正常
 | 
			
		||||
     */
 | 
			
		||||
    private Integer status;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,58 @@
 | 
			
		||||
package com.sl.ms.base.entity.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableName;
 | 
			
		||||
import com.sl.transport.common.entity.BaseEntity;
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import lombok.Builder;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车辆类型表
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@Builder
 | 
			
		||||
@NoArgsConstructor
 | 
			
		||||
@AllArgsConstructor
 | 
			
		||||
@TableName("sl_truck_type")
 | 
			
		||||
public class TruckTypeEntity extends BaseEntity {
 | 
			
		||||
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 车辆类型名称
 | 
			
		||||
     */
 | 
			
		||||
    private String name;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 准载重量
 | 
			
		||||
     */
 | 
			
		||||
    private BigDecimal allowableLoad;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 准载体积
 | 
			
		||||
     */
 | 
			
		||||
    private BigDecimal allowableVolume;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 长
 | 
			
		||||
     */
 | 
			
		||||
    private BigDecimal measureLong;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 宽
 | 
			
		||||
     */
 | 
			
		||||
    private BigDecimal measureWidth;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 高
 | 
			
		||||
     */
 | 
			
		||||
    private BigDecimal measureHigh;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 状态 0:禁用 1:正常
 | 
			
		||||
     */
 | 
			
		||||
    private Integer status;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,32 @@
 | 
			
		||||
package com.sl.ms.base.entity.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableName;
 | 
			
		||||
import com.sl.transport.common.entity.BaseEntity;
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import lombok.Builder;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车辆类型与货物类型关联表
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@Builder
 | 
			
		||||
@NoArgsConstructor
 | 
			
		||||
@AllArgsConstructor
 | 
			
		||||
@TableName("sl_truck_type_goods_type")
 | 
			
		||||
public class TruckTypeGoodsTypeEntity extends BaseEntity {
 | 
			
		||||
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 车辆类型id
 | 
			
		||||
     */
 | 
			
		||||
    private Long truckTypeId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 货物类型id
 | 
			
		||||
     */
 | 
			
		||||
    private Long goodsTypeId;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,47 @@
 | 
			
		||||
package com.sl.ms.base.entity.user;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableName;
 | 
			
		||||
import com.sl.transport.common.entity.BaseEntity;
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import lombok.Builder;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 司机表
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@Builder
 | 
			
		||||
@NoArgsConstructor
 | 
			
		||||
@AllArgsConstructor
 | 
			
		||||
@TableName("sl_truck_driver")
 | 
			
		||||
public class TruckDriverEntity extends BaseEntity {
 | 
			
		||||
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 车辆id
 | 
			
		||||
     */
 | 
			
		||||
    private Long truckId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 用户id,来自用户表
 | 
			
		||||
     */
 | 
			
		||||
    private Long userId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 年龄
 | 
			
		||||
     */
 | 
			
		||||
    private Integer age;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 图片
 | 
			
		||||
     */
 | 
			
		||||
    private String picture;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 驾龄
 | 
			
		||||
     */
 | 
			
		||||
    private Integer drivingAge;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,73 @@
 | 
			
		||||
package com.sl.ms.base.entity.user;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableName;
 | 
			
		||||
import com.sl.transport.common.entity.BaseEntity;
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import lombok.Builder;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
 | 
			
		||||
import java.time.LocalDate;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 司机驾驶证表
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@Builder
 | 
			
		||||
@NoArgsConstructor
 | 
			
		||||
@AllArgsConstructor
 | 
			
		||||
@TableName("sl_truck_driver_license")
 | 
			
		||||
public class TruckDriverLicenseEntity extends BaseEntity {
 | 
			
		||||
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 用户id
 | 
			
		||||
     */
 | 
			
		||||
    private Long userId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 准驾车型
 | 
			
		||||
     */
 | 
			
		||||
    private String allowableType;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 初次领证日期
 | 
			
		||||
     */
 | 
			
		||||
    private LocalDate initialCertificateDate;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 有效期限
 | 
			
		||||
     */
 | 
			
		||||
    private String validPeriod;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 驾驶证号
 | 
			
		||||
     */
 | 
			
		||||
    private String licenseNumber;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 驾龄
 | 
			
		||||
     */
 | 
			
		||||
    private Integer driverAge;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 驾驶证类型
 | 
			
		||||
     */
 | 
			
		||||
    private String licenseType;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 从业资格证信息
 | 
			
		||||
     */
 | 
			
		||||
    private String qualificationCertificate;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 入场证信息
 | 
			
		||||
     */
 | 
			
		||||
    private String passCertificate;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 图片
 | 
			
		||||
     */
 | 
			
		||||
    private String picture;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,81 @@
 | 
			
		||||
package com.sl.ms.base.job;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import cn.hutool.core.date.LocalDateTimeUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.toolkit.SimpleQuery;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkHistorySchedulingEntity;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkPatternEntity;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkSchedulingEntity;
 | 
			
		||||
import com.sl.ms.base.mapper.base.WorkSchedulingMapper;
 | 
			
		||||
import com.sl.ms.base.service.base.WorkHistorySchedulingService;
 | 
			
		||||
import com.sl.ms.base.utils.WorkSchedulingUtils;
 | 
			
		||||
import com.sl.transport.common.util.DateUtils;
 | 
			
		||||
import com.xxl.job.core.handler.annotation.XxlJob;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 历史排班保存
 | 
			
		||||
 * 每晚凌晨2点执行保存前一天排班数据
 | 
			
		||||
 * @author wxb
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 */
 | 
			
		||||
@Slf4j
 | 
			
		||||
@Component
 | 
			
		||||
public class HistoryScheduleJob {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private WorkHistorySchedulingService workHistorySchedulingService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private WorkSchedulingMapper workSchedulingMapper;
 | 
			
		||||
 | 
			
		||||
    @XxlJob("historyScheduleJob")
 | 
			
		||||
    public void execute() {
 | 
			
		||||
        log.info("historyScheduleJob 执行生成排班历史数据任务!!!");
 | 
			
		||||
        // 查询当前排班
 | 
			
		||||
        List<WorkSchedulingEntity> workSchedulingEntities = workSchedulingMapper.selectList(Wrappers.<WorkSchedulingEntity>lambdaQuery().eq(WorkSchedulingEntity::getIsDelete, 0));
 | 
			
		||||
 | 
			
		||||
        // 查询工作模式
 | 
			
		||||
        List<Long> workPatternIds = workSchedulingEntities.parallelStream().map(WorkSchedulingEntity::getWorkPatternId).distinct().collect(Collectors.toList());
 | 
			
		||||
        Map<Long, WorkPatternEntity> workPatternEntityMap = SimpleQuery.keyMap(
 | 
			
		||||
                Wrappers.<WorkPatternEntity>lambdaQuery().in(WorkPatternEntity::getId, workPatternIds),
 | 
			
		||||
                WorkPatternEntity::getId);
 | 
			
		||||
 | 
			
		||||
        // 补充日期数据
 | 
			
		||||
        List<WorkHistorySchedulingEntity> workHistorySchedulingEntities = workSchedulingEntities.parallelStream().map(workSchedulingEntity -> {
 | 
			
		||||
            WorkHistorySchedulingEntity workHistorySchedulingEntity = BeanUtil.toBean(workSchedulingEntity, WorkHistorySchedulingEntity.class);
 | 
			
		||||
            // 重置ID
 | 
			
		||||
            workHistorySchedulingEntity.setId(null);
 | 
			
		||||
            WorkPatternEntity workPatternEntity = workPatternEntityMap.get(workSchedulingEntity.getWorkPatternId());
 | 
			
		||||
            if (ObjectUtil.isEmpty(workPatternEntity)) {
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            workHistorySchedulingEntity.setWorkPatternType(workPatternEntity.getWorkPatternType());
 | 
			
		||||
            // 月 前一天对应的月
 | 
			
		||||
            String workMonth = LocalDateTimeUtil.format(LocalDateTimeUtil.now().minusDays(1), DateUtils.DEFAULT_MONTH_FORMAT);
 | 
			
		||||
            workHistorySchedulingEntity.setWorkMonth(workMonth);
 | 
			
		||||
            // 日 前一天对应的日
 | 
			
		||||
            int dayOfMonth = LocalDateTimeUtil.now().minusDays(1).getDayOfMonth();
 | 
			
		||||
            workHistorySchedulingEntity.setWorkDay(dayOfMonth);
 | 
			
		||||
 | 
			
		||||
            // 只保存上班数据
 | 
			
		||||
            boolean worded = WorkSchedulingUtils.isWorded(workSchedulingEntity, workMonth, dayOfMonth, workPatternEntity, null, true);
 | 
			
		||||
            if (worded) {
 | 
			
		||||
                return workHistorySchedulingEntity;
 | 
			
		||||
            }
 | 
			
		||||
            return null;
 | 
			
		||||
        }).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
 | 
			
		||||
 | 
			
		||||
        // 落库
 | 
			
		||||
        workHistorySchedulingService.saveBatch(workHistorySchedulingEntities);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,17 @@
 | 
			
		||||
package com.sl.ms.base.mapper.base;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import com.sl.ms.base.entity.base.AreaEntity;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * Mapper 接口
 | 
			
		||||
 * 行政区域
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface AreaMapper extends BaseMapper<AreaEntity> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,26 @@
 | 
			
		||||
package com.sl.ms.base.mapper.base;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import com.sl.ms.base.entity.base.GoodsTypeEntity;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
import org.apache.ibatis.annotations.Param;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface GoodsTypeMapper extends BaseMapper<GoodsTypeEntity> {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取分页货物类型数据,如果传入 货物类型名称 或 车辆id 时进行条件搜索
 | 
			
		||||
     *
 | 
			
		||||
     * @param page          分页参数
 | 
			
		||||
     * @param goodsTypeName 货物类型名称(非必须)
 | 
			
		||||
     * @param truckTypeId   车辆id(非必须)
 | 
			
		||||
     * @return 分页货物数据
 | 
			
		||||
     */
 | 
			
		||||
    List<GoodsTypeEntity> findByPage(Page<GoodsTypeEntity> page,
 | 
			
		||||
                                     @Param("goodsTypeName") String goodsTypeName,
 | 
			
		||||
                                     @Param("truckTypeId") Long truckTypeId);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,13 @@
 | 
			
		||||
package com.sl.ms.base.mapper.base;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import com.sl.ms.base.entity.base.MessageEntity;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 消息表 mapper接口
 | 
			
		||||
 */
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface MessageMapper extends BaseMapper<MessageEntity> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
package com.sl.ms.base.mapper.base;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkHistorySchedulingEntity;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface WorkHistorySchedulingMapper extends BaseMapper<WorkHistorySchedulingEntity> {
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
package com.sl.ms.base.mapper.base;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkPatternEntity;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface WorkPatternMapper extends BaseMapper<WorkPatternEntity> {
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,14 @@
 | 
			
		||||
package com.sl.ms.base.mapper.base;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkSchedulingEntity;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
import org.apache.ibatis.annotations.Param;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface WorkSchedulingMapper extends BaseMapper<WorkSchedulingEntity> {
 | 
			
		||||
 | 
			
		||||
    void batchInsert(@Param("entities") List<WorkSchedulingEntity> workSchedulingEntities);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,18 @@
 | 
			
		||||
package com.sl.ms.base.mapper.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TransportTripsTruckDriverEntity;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 车次与车辆关联信息表  Mapper 接口
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author itcast
 | 
			
		||||
 * @since 2019-12-20
 | 
			
		||||
 */
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface TransportTripsTruckDriverMapper extends BaseMapper<TransportTripsTruckDriverEntity> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
package com.sl.ms.base.mapper.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckLicenseEntity;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface TruckLicenseMapper extends BaseMapper<TruckLicenseEntity> {
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
package com.sl.ms.base.mapper.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckEntity;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface TruckMapper extends BaseMapper<TruckEntity> {
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
package com.sl.ms.base.mapper.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckPlanEntity;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface TruckPlanMapper extends BaseMapper<TruckPlanEntity> {
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
package com.sl.ms.base.mapper.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckReturnRegisterEntity;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface TruckReturnRegisterMapper extends BaseMapper<TruckReturnRegisterEntity> {
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,10 @@
 | 
			
		||||
package com.sl.ms.base.mapper.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckTripsEntity;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface TruckTripsMapper extends BaseMapper<TruckTripsEntity> {
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
package com.sl.ms.base.mapper.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckTypeGoodsTypeEntity;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface TruckTypeGoodsTypeMapper extends BaseMapper<TruckTypeGoodsTypeEntity> {
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
package com.sl.ms.base.mapper.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckTypeEntity;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface TruckTypeMapper extends BaseMapper<TruckTypeEntity> {
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
package com.sl.ms.base.mapper.user;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import com.sl.ms.base.entity.user.TruckDriverLicenseEntity;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface TruckDriverLicenseMapper extends BaseMapper<TruckDriverLicenseEntity> {
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,10 @@
 | 
			
		||||
package com.sl.ms.base.mapper.user;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import com.sl.ms.base.entity.user.TruckDriverEntity;
 | 
			
		||||
import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@Mapper
 | 
			
		||||
public interface TruckDriverMapper extends BaseMapper<TruckDriverEntity> {
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,163 @@
 | 
			
		||||
package com.sl.ms.base.mq;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import cn.hutool.json.JSONArray;
 | 
			
		||||
import cn.hutool.json.JSONObject;
 | 
			
		||||
import cn.hutool.json.JSONUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 | 
			
		||||
import com.sl.ms.base.domain.enums.WorkStatusEnum;
 | 
			
		||||
import com.sl.ms.base.domain.enums.WorkUserTypeEnum;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkSchedulingEntity;
 | 
			
		||||
import com.sl.ms.base.service.base.WorkSchedulingService;
 | 
			
		||||
import com.sl.transport.common.constant.Constants;
 | 
			
		||||
import com.sl.transport.common.util.BeanUtil;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.amqp.core.ExchangeTypes;
 | 
			
		||||
import org.springframework.amqp.core.TopicExchange;
 | 
			
		||||
import org.springframework.amqp.rabbit.annotation.Exchange;
 | 
			
		||||
import org.springframework.amqp.rabbit.annotation.Queue;
 | 
			
		||||
import org.springframework.amqp.rabbit.annotation.QueueBinding;
 | 
			
		||||
import org.springframework.amqp.rabbit.annotation.RabbitListener;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Value;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 对于权限管家系统消息的处理
 | 
			
		||||
 *
 | 
			
		||||
 * @author zzj
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 */
 | 
			
		||||
@Slf4j
 | 
			
		||||
@Component
 | 
			
		||||
public class AuthUserMQListener {
 | 
			
		||||
 | 
			
		||||
    @Value("${rabbitmq.exchange}")
 | 
			
		||||
    private String rabbitmqExchange;
 | 
			
		||||
 | 
			
		||||
    @Value("${role.courier}")
 | 
			
		||||
    private String courier;
 | 
			
		||||
 | 
			
		||||
    @Value("${role.driver}")
 | 
			
		||||
    private String driver;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private WorkSchedulingService workSchedulingService;
 | 
			
		||||
 | 
			
		||||
    @RabbitListener(bindings = @QueueBinding(
 | 
			
		||||
            value = @Queue(name = Constants.MQ.Queues.AUTH_USER),
 | 
			
		||||
            exchange = @Exchange(name = "${rabbitmq.exchange}", type = ExchangeTypes.TOPIC),
 | 
			
		||||
            key = "#"
 | 
			
		||||
    ))
 | 
			
		||||
    public void listenUserMsg(String msg) {
 | 
			
		||||
        log.info("接收到消息 -> {}", msg);
 | 
			
		||||
        JSONObject jsonObject = JSONUtil.parseObj(msg);
 | 
			
		||||
        String type = jsonObject.getStr("type");
 | 
			
		||||
        if (!StrUtil.equalsIgnoreCase(type, "USER")) {
 | 
			
		||||
            //非用户消息
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        String operation = jsonObject.getStr("operation");
 | 
			
		||||
        // roles mobile id
 | 
			
		||||
        JSONArray jsonArray = jsonObject.getJSONArray("content");
 | 
			
		||||
 | 
			
		||||
        jsonArray.forEach(v -> {
 | 
			
		||||
            // 转换结构
 | 
			
		||||
            WorkSchedulingEntity user = parse((JSONObject) v);
 | 
			
		||||
            // 处理变更
 | 
			
		||||
            handlerUserChangeMsg(user, operation);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 处理变更
 | 
			
		||||
     *
 | 
			
		||||
     * @param entity    排班模型
 | 
			
		||||
     * @param operation 操作类型
 | 
			
		||||
     */
 | 
			
		||||
    private void handlerUserChangeMsg(WorkSchedulingEntity entity, String operation) {
 | 
			
		||||
        switch (operation) {
 | 
			
		||||
            case "ADD": {
 | 
			
		||||
                entity.setId(IdWorker.getId());
 | 
			
		||||
                //设置默认值
 | 
			
		||||
                BeanUtil.setDefault(entity);
 | 
			
		||||
                workSchedulingService.save(entity);
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            case "UPDATE": {
 | 
			
		||||
                WorkSchedulingEntity byUserId = workSchedulingService.getByUserId(entity.getUserId());
 | 
			
		||||
                if (ObjectUtil.isEmpty(byUserId)) {
 | 
			
		||||
                    log.error("不存在的员工");
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
                entity.setId(byUserId.getId());
 | 
			
		||||
                workSchedulingService.updateById(entity);
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            case "DEL": {
 | 
			
		||||
                WorkSchedulingEntity byUserId = workSchedulingService.getByUserId(entity.getUserId());
 | 
			
		||||
                if (ObjectUtil.isEmpty(byUserId)) {
 | 
			
		||||
                    log.error("不存在的员工");
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
                workSchedulingService.delete(byUserId.getId(), 0L);
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            default:
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 转换数据
 | 
			
		||||
     *
 | 
			
		||||
     * @param content 消息内容
 | 
			
		||||
     * @return 排班信息
 | 
			
		||||
     */
 | 
			
		||||
    private WorkSchedulingEntity parse(JSONObject content) {
 | 
			
		||||
        JSONArray roles = content.getJSONArray("roles");
 | 
			
		||||
        String name = content.getStr("name");
 | 
			
		||||
        String mobile = content.getStr("mobile");
 | 
			
		||||
        Long agentId = content.getLong("orgId");
 | 
			
		||||
        Long id = content.getLong("id");
 | 
			
		||||
        String account = content.getStr("account");
 | 
			
		||||
 | 
			
		||||
        //设置参数
 | 
			
		||||
        WorkSchedulingEntity entity = new WorkSchedulingEntity();
 | 
			
		||||
        entity.setUserId(id);
 | 
			
		||||
        entity.setAgencyId(agentId);
 | 
			
		||||
        entity.setName(name);
 | 
			
		||||
        entity.setPhone(mobile);
 | 
			
		||||
        entity.setEmployeeNumber(account);
 | 
			
		||||
        entity.setState(WorkStatusEnum.NOMAL.getStatus());
 | 
			
		||||
 | 
			
		||||
        //判断角色
 | 
			
		||||
        Byte userType;
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(roles)) {
 | 
			
		||||
            if (roles.contains(courier)) {
 | 
			
		||||
                userType = WorkUserTypeEnum.COURIER.getCode();
 | 
			
		||||
            } else if (roles.contains(driver)) {
 | 
			
		||||
                userType = WorkUserTypeEnum.DRIVER.getCode();
 | 
			
		||||
            } else {
 | 
			
		||||
                userType = WorkUserTypeEnum.USER.getCode();
 | 
			
		||||
            }
 | 
			
		||||
            entity.setUserType(userType);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return entity;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 声明交换机,确保交换机一定存在
 | 
			
		||||
     */
 | 
			
		||||
    @Bean
 | 
			
		||||
    public TopicExchange authUserExchange() {
 | 
			
		||||
        return new TopicExchange(this.rabbitmqExchange, true, false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,51 @@
 | 
			
		||||
package com.sl.ms.base.mq;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.convert.Convert;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import cn.hutool.json.JSONArray;
 | 
			
		||||
import cn.hutool.json.JSONObject;
 | 
			
		||||
import cn.hutool.json.JSONUtil;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckPlanService;
 | 
			
		||||
import com.sl.transport.common.constant.Constants;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.amqp.core.ExchangeTypes;
 | 
			
		||||
import org.springframework.amqp.rabbit.annotation.Exchange;
 | 
			
		||||
import org.springframework.amqp.rabbit.annotation.Queue;
 | 
			
		||||
import org.springframework.amqp.rabbit.annotation.QueueBinding;
 | 
			
		||||
import org.springframework.amqp.rabbit.annotation.RabbitListener;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 更新车辆计划调度状态
 | 
			
		||||
 *
 | 
			
		||||
 * @author wxb
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 */
 | 
			
		||||
@Slf4j
 | 
			
		||||
@Service
 | 
			
		||||
public class TruckPlanScheduledMQListener{
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    TruckPlanService truckPlanService;
 | 
			
		||||
 | 
			
		||||
    @RabbitListener(bindings = @QueueBinding(
 | 
			
		||||
            value = @Queue(name = Constants.MQ.Queues.BASE_TRUCK_PLAN_COMPLETE),
 | 
			
		||||
            exchange = @Exchange(name = Constants.MQ.Exchanges.TRUCK_PLAN, type = ExchangeTypes.TOPIC),
 | 
			
		||||
            key = Constants.MQ.RoutingKeys.TRUCK_PLAN_COMPLETE
 | 
			
		||||
    ))
 | 
			
		||||
    public void listenTruckPlanScheduledMsg(String msg) {
 | 
			
		||||
        log.info("listenTruckPlanScheduledMsg msg {}", msg);
 | 
			
		||||
        // {"ids":[1,2,3], "created":123456}
 | 
			
		||||
        JSONObject jsonObject = JSONUtil.parseObj(msg);
 | 
			
		||||
        if (ObjectUtil.isEmpty(jsonObject)) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        JSONArray ids = jsonObject.getJSONArray("ids");
 | 
			
		||||
        Set<Long> collect = ids.stream().map(Convert::toLong).collect(Collectors.toSet());
 | 
			
		||||
        truckPlanService.scheduledPlan(collect);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,40 @@
 | 
			
		||||
package com.sl.ms.base.service.base;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import com.sl.ms.base.domain.base.AreaDto;
 | 
			
		||||
import com.sl.ms.base.entity.base.AreaEntity;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 业务接口
 | 
			
		||||
 * 行政区域
 | 
			
		||||
 * </p>
 | 
			
		||||
 */
 | 
			
		||||
public interface AreaService extends IService<AreaEntity> {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据编码查询行政区域
 | 
			
		||||
     *
 | 
			
		||||
     * @param code 行政编码
 | 
			
		||||
     * @return 行政区域
 | 
			
		||||
     */
 | 
			
		||||
    AreaEntity getByCode(String code);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据父级id查询子级行政区域
 | 
			
		||||
     *
 | 
			
		||||
     * @param parentId 父级id
 | 
			
		||||
     * @return 子级行政区域列表
 | 
			
		||||
     */
 | 
			
		||||
    List<AreaDto> findChildren(Long parentId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据id批量查询
 | 
			
		||||
     *
 | 
			
		||||
     * @param ids id列表
 | 
			
		||||
     * @return 行政区域列表
 | 
			
		||||
     */
 | 
			
		||||
    List<AreaDto> findBatch(List<Long> ids);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,17 @@
 | 
			
		||||
package com.sl.ms.base.service.base;
 | 
			
		||||
 | 
			
		||||
import com.itheima.auth.sdk.dto.UserDTO;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 权限系统对接服务
 | 
			
		||||
 */
 | 
			
		||||
public interface AuthService {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据用户id获得详细信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 用户id
 | 
			
		||||
     * @return 用户信息
 | 
			
		||||
     */
 | 
			
		||||
    UserDTO getByUserId(Long id);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,39 @@
 | 
			
		||||
package com.sl.ms.base.service.base;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import com.sl.ms.base.entity.base.GoodsTypeEntity;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 货物类型表  服务类
 | 
			
		||||
 */
 | 
			
		||||
public interface GoodsTypeService extends IService<GoodsTypeEntity> {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取分页货物类型数据,如果传入 货物类型名称 或 车辆id 时进行条件搜索
 | 
			
		||||
     *
 | 
			
		||||
     * @param page          页码
 | 
			
		||||
     * @param pageSize      页尺寸
 | 
			
		||||
     * @param goodsTypeName 货物类型名称(非必须)
 | 
			
		||||
     * @param truckTypeId   车辆id(非必须)
 | 
			
		||||
     * @return 分页货物数据
 | 
			
		||||
     */
 | 
			
		||||
    IPage<GoodsTypeEntity> findByPage(Integer page, Integer pageSize, String goodsTypeName, Long truckTypeId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据id列表,获取货物类型列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param ids 货物类型id
 | 
			
		||||
     * @return 货物类型列表
 | 
			
		||||
     */
 | 
			
		||||
    List<GoodsTypeEntity> findAll(List<Long> ids);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 查询所有状态可用的货物类型列表
 | 
			
		||||
     *
 | 
			
		||||
     * @return 货物类型列表
 | 
			
		||||
     */
 | 
			
		||||
    List<GoodsTypeEntity> findAll();
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,77 @@
 | 
			
		||||
package com.sl.ms.base.service.base;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import com.sl.ms.base.domain.base.LatestMessageDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.MessageAddDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.MessageDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.MessageQueryDTO;
 | 
			
		||||
import com.sl.ms.base.entity.base.MessageEntity;
 | 
			
		||||
import com.sl.transport.common.util.PageResponse;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 消息表  服务类
 | 
			
		||||
 */
 | 
			
		||||
public interface MessageService extends IService<MessageEntity> {
 | 
			
		||||
    /**
 | 
			
		||||
     * 新增消息
 | 
			
		||||
     *
 | 
			
		||||
     * @param messageAddDTO 消息新增对象
 | 
			
		||||
     */
 | 
			
		||||
    void add(MessageAddDTO messageAddDTO);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 标记已读
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 消息id
 | 
			
		||||
     */
 | 
			
		||||
    void update2Read(Long id);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 批量已读
 | 
			
		||||
     *
 | 
			
		||||
     * @param ids 消息id列表
 | 
			
		||||
     */
 | 
			
		||||
    void batchRead(List<Long> ids);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 全部已读
 | 
			
		||||
     *
 | 
			
		||||
     * @param userId      用户id
 | 
			
		||||
     * @param contentType 消息类型,300:快递员端公告,301:寄件相关消息,302:签收相关消息,303:快件取消消息,200:司机端公告,201:司机端系统通知
 | 
			
		||||
     */
 | 
			
		||||
    void readAll(Long userId, Integer contentType);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 查询消息列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param messageQueryDTO 消息查询对象
 | 
			
		||||
     * @return 消息列表
 | 
			
		||||
     */
 | 
			
		||||
    List<MessageDTO> queryList(MessageQueryDTO messageQueryDTO);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据类型查询消息数量
 | 
			
		||||
     *
 | 
			
		||||
     * @param messageQueryDTO 消息查询对象
 | 
			
		||||
     * @return 消息条数
 | 
			
		||||
     */
 | 
			
		||||
    Integer countType(MessageQueryDTO messageQueryDTO);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 最新消息查询
 | 
			
		||||
     *
 | 
			
		||||
     * @param messageQueryDTO 消息查询对象
 | 
			
		||||
     * @return 最新消息对象
 | 
			
		||||
     */
 | 
			
		||||
    LatestMessageDTO latestMessage(MessageQueryDTO messageQueryDTO);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分页查询消息列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param messageQueryDTO 消息查询对象
 | 
			
		||||
     * @return 分页数据
 | 
			
		||||
     */
 | 
			
		||||
    PageResponse<MessageDTO> pageQuery(MessageQueryDTO messageQueryDTO);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,11 @@
 | 
			
		||||
package com.sl.ms.base.service.base;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkHistorySchedulingEntity;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 历史排班服务
 | 
			
		||||
 */
 | 
			
		||||
public interface WorkHistorySchedulingService extends IService<WorkHistorySchedulingEntity> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,51 @@
 | 
			
		||||
package com.sl.ms.base.service.base;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkPatternAddDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkPatternDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkPatternQueryDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkPatternUpdateDTO;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkPatternEntity;
 | 
			
		||||
import com.sl.transport.common.util.PageResponse;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 工作模式服务
 | 
			
		||||
 */
 | 
			
		||||
public interface WorkPatternService extends IService<WorkPatternEntity> {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分页查询工作模式
 | 
			
		||||
     * @param workPatternQueryDTO 查询条件
 | 
			
		||||
     * @return 工作模式数据
 | 
			
		||||
     */
 | 
			
		||||
    PageResponse<WorkPatternDTO> page(WorkPatternQueryDTO workPatternQueryDTO);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 工作模式ID查询
 | 
			
		||||
     * @param id 工作模式ID
 | 
			
		||||
     * @return 工作模式
 | 
			
		||||
     */
 | 
			
		||||
    WorkPatternDTO findById(Long id);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 删除工作模式
 | 
			
		||||
     * @param id 工作模式ID
 | 
			
		||||
     */
 | 
			
		||||
    void delete(long id);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新工作模式
 | 
			
		||||
     * @param workPatternUpdateDTO 工作模式
 | 
			
		||||
     */
 | 
			
		||||
    void update(WorkPatternUpdateDTO workPatternUpdateDTO);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 新增工作模式
 | 
			
		||||
     * @param workPatternAddDTO 工作模式
 | 
			
		||||
     */
 | 
			
		||||
    void add(WorkPatternAddDTO workPatternAddDTO);
 | 
			
		||||
 | 
			
		||||
    List<WorkPatternDTO> all();
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,90 @@
 | 
			
		||||
package com.sl.ms.base.service.base;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkSchedulingAddDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkSchedulingDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkSchedulingQueryDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkSchedulingUpdateDTO;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkSchedulingEntity;
 | 
			
		||||
import com.sl.transport.common.util.PageResponse;
 | 
			
		||||
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 排班服务
 | 
			
		||||
 */
 | 
			
		||||
public interface WorkSchedulingService extends IService<WorkSchedulingEntity> {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分页查询排班
 | 
			
		||||
     * @param workSchedulingQueryDTO 查询条件
 | 
			
		||||
     * @return 排班
 | 
			
		||||
     */
 | 
			
		||||
    PageResponse<WorkSchedulingDTO> queryForPage(WorkSchedulingQueryDTO workSchedulingQueryDTO);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 新增排班
 | 
			
		||||
     * @param workSchedulingAddDTO 排班
 | 
			
		||||
     */
 | 
			
		||||
    void add(WorkSchedulingAddDTO workSchedulingAddDTO);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 删除排班
 | 
			
		||||
     * @param id 排班ID
 | 
			
		||||
     * @param operator 操作人
 | 
			
		||||
     */
 | 
			
		||||
    void delete(Long id, Long operator);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 批量新增排班
 | 
			
		||||
     * @param workSchedulingAddDTOList 排班列表
 | 
			
		||||
     */
 | 
			
		||||
    void batchAdd(List<WorkSchedulingAddDTO> workSchedulingAddDTOList);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新排班
 | 
			
		||||
     * @param workSchedulingUpdateDTO 排班
 | 
			
		||||
     */
 | 
			
		||||
    void update(WorkSchedulingUpdateDTO workSchedulingUpdateDTO);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据用户id查询这个月排班计划
 | 
			
		||||
     * @param userId 用户ID
 | 
			
		||||
     * @return 这个月排班计划
 | 
			
		||||
     */
 | 
			
		||||
    WorkSchedulingDTO currentSchedule(Long userId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据用户id查询
 | 
			
		||||
     * @param userId 用户ID
 | 
			
		||||
     * @return 排班数据
 | 
			
		||||
     */
 | 
			
		||||
    WorkSchedulingEntity getByUserId(Long userId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据网点id查询该网点所有员工的排班信息
 | 
			
		||||
     * @param agencyId 机构ID
 | 
			
		||||
     * @return 该网点所有员工的排班信息
 | 
			
		||||
     */
 | 
			
		||||
    List<WorkSchedulingDTO> monthScheduleByAgencyId(Long agencyId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据快递员/司机id列表或网点id查询当前工作排班
 | 
			
		||||
     * @param userIds 用户ID
 | 
			
		||||
     * @param agencyId 机构ID
 | 
			
		||||
     * @param type 用户类型:1:员工,2:快递员,3:司机
 | 
			
		||||
     * @param time 时间
 | 
			
		||||
     * @return 当前工作排班
 | 
			
		||||
     */
 | 
			
		||||
    List<WorkSchedulingDTO> monthSchedule(List<Long> userIds, Long agencyId, Byte type, LocalDateTime time);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取整个计划(运输任务)期间每一天都上班的司机
 | 
			
		||||
     * @param driverIds 司机ID列表
 | 
			
		||||
     * @param planDepartureTime 计划发车时间
 | 
			
		||||
     * @param planArrivalTime 计划到达时间
 | 
			
		||||
     * @return 正常上班的司机ID列表
 | 
			
		||||
     */
 | 
			
		||||
    List<Long> getWorkingDrivers(List<Long> driverIds, LocalDateTime planDepartureTime, LocalDateTime planArrivalTime);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,88 @@
 | 
			
		||||
package com.sl.ms.base.service.base.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import com.sl.ms.base.domain.base.AreaDto;
 | 
			
		||||
import com.sl.ms.base.entity.base.AreaEntity;
 | 
			
		||||
import com.sl.ms.base.mapper.base.AreaMapper;
 | 
			
		||||
import com.sl.ms.base.service.base.AreaService;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 业务实现类
 | 
			
		||||
 * 行政区域
 | 
			
		||||
 */
 | 
			
		||||
@Slf4j
 | 
			
		||||
@Service
 | 
			
		||||
public class AreaServiceImpl extends ServiceImpl<AreaMapper, AreaEntity> implements AreaService {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据编码查询行政区域
 | 
			
		||||
     *
 | 
			
		||||
     * @param code 行政编码
 | 
			
		||||
     * @return 行政区域
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public AreaEntity getByCode(String code) {
 | 
			
		||||
        return baseMapper.selectOne(new LambdaQueryWrapper<AreaEntity>().eq(AreaEntity::getAreaCode, code).last(" limit 1"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据父级id查询子级行政区域
 | 
			
		||||
     *
 | 
			
		||||
     * @param parentId 父级id
 | 
			
		||||
     * @return 子级行政区域列表
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<AreaDto> findChildren(Long parentId) {
 | 
			
		||||
        //1.构造查询条件
 | 
			
		||||
        LambdaQueryWrapper<AreaEntity> queryWrapper = Wrappers.<AreaEntity>lambdaQuery().eq(AreaEntity::getParentId, parentId);
 | 
			
		||||
 | 
			
		||||
        //2.查询子级区域
 | 
			
		||||
        List<AreaEntity> entities = baseMapper.selectList(queryWrapper);
 | 
			
		||||
 | 
			
		||||
        //3.过滤掉不符合条件的数据(业务要求不要 市辖区 的行政区域信息)
 | 
			
		||||
        return entities.stream().map(area -> {
 | 
			
		||||
            if (area.getLevel().equals(2) && "市辖区".equals(area.getName())) {
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
            AreaDto areaDto = BeanUtil.toBean(area, AreaDto.class);
 | 
			
		||||
            areaDto.setName(areaDto.getShortName());
 | 
			
		||||
            return areaDto;
 | 
			
		||||
        }).filter(Objects::nonNull).collect(Collectors.toList());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据id批量查询
 | 
			
		||||
     *
 | 
			
		||||
     * @param ids id列表
 | 
			
		||||
     * @return 行政区域列表
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<AreaDto> findBatch(List<Long> ids) {
 | 
			
		||||
        if (CollUtil.isEmpty(ids)) {
 | 
			
		||||
            return new ArrayList<>();
 | 
			
		||||
        }
 | 
			
		||||
        //1.构造查询条件
 | 
			
		||||
        LambdaQueryWrapper<AreaEntity> queryWrapper = Wrappers.<AreaEntity>lambdaQuery().in(AreaEntity::getId, ids);
 | 
			
		||||
 | 
			
		||||
        //2.查询行政区域列表
 | 
			
		||||
        List<AreaEntity> entities = baseMapper.selectList(queryWrapper);
 | 
			
		||||
 | 
			
		||||
        //3.封装数据
 | 
			
		||||
        return entities.stream().map(area -> {
 | 
			
		||||
            AreaDto areaDto = BeanUtil.toBean(area, AreaDto.class);
 | 
			
		||||
            areaDto.setName(areaDto.getShortName());
 | 
			
		||||
            return areaDto;
 | 
			
		||||
        }).collect(Collectors.toList());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,68 @@
 | 
			
		||||
package com.sl.ms.base.service.base.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.text.CharSequenceUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import cn.hutool.json.JSONUtil;
 | 
			
		||||
import com.itheima.auth.factory.AuthTemplateFactory;
 | 
			
		||||
import com.itheima.auth.sdk.AuthTemplate;
 | 
			
		||||
import com.itheima.auth.sdk.common.Result;
 | 
			
		||||
import com.itheima.auth.sdk.dto.LoginDTO;
 | 
			
		||||
import com.itheima.auth.sdk.dto.UserDTO;
 | 
			
		||||
import com.sl.ms.base.service.base.AuthService;
 | 
			
		||||
import com.sl.transport.common.exception.SLException;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Value;
 | 
			
		||||
import org.springframework.data.redis.core.StringRedisTemplate;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 权限系统对接服务实现
 | 
			
		||||
 */
 | 
			
		||||
@Slf4j
 | 
			
		||||
@Service
 | 
			
		||||
public class AuthServiceImpl implements AuthService {
 | 
			
		||||
    @Value("${sl.auth.account}")
 | 
			
		||||
    private String account;
 | 
			
		||||
    @Value("${sl.auth.password}")
 | 
			
		||||
    private String password;
 | 
			
		||||
    @Resource
 | 
			
		||||
    private AuthTemplate authTemplate;
 | 
			
		||||
    @Resource
 | 
			
		||||
    private StringRedisTemplate stringRedisTemplate;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据用户id获得详细信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 用户id
 | 
			
		||||
     * @return 用户信息
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public UserDTO getByUserId(Long id) {
 | 
			
		||||
        //从redis查询token
 | 
			
		||||
        String redisKey = "AUTHORIZATION";
 | 
			
		||||
        String token = stringRedisTemplate.opsForValue().get(redisKey);
 | 
			
		||||
 | 
			
		||||
        //如果token不存在,则重新登录
 | 
			
		||||
        if (ObjectUtil.isEmpty(token)) {
 | 
			
		||||
            Result<LoginDTO> loginDTO = authTemplate.opsForLogin().token(account, password);
 | 
			
		||||
            if (ObjectUtil.notEqual(loginDTO.getCode(), 0)) {
 | 
			
		||||
                String errorMsg = CharSequenceUtil.format("登录失败,账号:{},密码:{}", account, password);
 | 
			
		||||
                throw new SLException(errorMsg);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            //token存入redis
 | 
			
		||||
            token = loginDTO.getData().getToken().getToken();
 | 
			
		||||
            stringRedisTemplate.opsForValue().set(redisKey, token, 1, TimeUnit.HOURS);
 | 
			
		||||
            log.info("登录结果:{}", JSONUtil.toJsonStr(loginDTO));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //根据id查询用户信息
 | 
			
		||||
        authTemplate = AuthTemplateFactory.get(token);
 | 
			
		||||
        Result<UserDTO> result = authTemplate.opsForUser().getUserById(id);
 | 
			
		||||
        return result.getData();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,64 @@
 | 
			
		||||
package com.sl.ms.base.service.base.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import com.sl.ms.base.entity.base.GoodsTypeEntity;
 | 
			
		||||
import com.sl.ms.base.mapper.base.GoodsTypeMapper;
 | 
			
		||||
import com.sl.ms.base.service.base.GoodsTypeService;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 货物类型相关业务
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class GoodsTypeServiceImpl extends ServiceImpl<GoodsTypeMapper, GoodsTypeEntity> implements GoodsTypeService {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取分页货物类型数据,如果传入 货物类型名称 或 车辆id 时进行条件搜索
 | 
			
		||||
     *
 | 
			
		||||
     * @param page          页码
 | 
			
		||||
     * @param pageSize      页尺寸
 | 
			
		||||
     * @param goodsTypeName 货物类型名称(非必须)
 | 
			
		||||
     * @param truckTypeId   车辆id(非必须)
 | 
			
		||||
     * @return 分页货物数据
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public IPage<GoodsTypeEntity> findByPage(Integer page, Integer pageSize, String goodsTypeName, Long truckTypeId) {
 | 
			
		||||
        Page<GoodsTypeEntity> iPage = new Page<>(page, pageSize);
 | 
			
		||||
        iPage.setRecords(baseMapper.findByPage(iPage, goodsTypeName, truckTypeId));
 | 
			
		||||
        return iPage;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据id列表,获取货物类型列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param ids 货物类型id
 | 
			
		||||
     * @return 货物类型列表
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<GoodsTypeEntity> findAll(List<Long> ids) {
 | 
			
		||||
        LambdaQueryWrapper<GoodsTypeEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        if (CollUtil.isNotEmpty(ids)) {
 | 
			
		||||
            lambdaQueryWrapper.in(GoodsTypeEntity::getId, ids);
 | 
			
		||||
        }
 | 
			
		||||
        lambdaQueryWrapper.eq(GoodsTypeEntity::getStatus, 1);
 | 
			
		||||
        return super.list(lambdaQueryWrapper);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 查询所有状态可用的货物类型列表
 | 
			
		||||
     *
 | 
			
		||||
     * @return 货物类型列表
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<GoodsTypeEntity> findAll() {
 | 
			
		||||
        LambdaQueryWrapper<GoodsTypeEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        lambdaQueryWrapper.eq(GoodsTypeEntity::getStatus, 1);
 | 
			
		||||
        return super.list(lambdaQueryWrapper);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,227 @@
 | 
			
		||||
package com.sl.ms.base.service.base.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import com.sl.ms.base.domain.base.LatestMessageDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.MessageAddDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.MessageDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.MessageQueryDTO;
 | 
			
		||||
import com.sl.ms.base.domain.constants.MessageConstants;
 | 
			
		||||
import com.sl.ms.base.entity.base.MessageEntity;
 | 
			
		||||
import com.sl.ms.base.mapper.base.MessageMapper;
 | 
			
		||||
import com.sl.ms.base.service.base.MessageService;
 | 
			
		||||
import com.sl.transport.common.exception.SLException;
 | 
			
		||||
import com.sl.transport.common.util.PageResponse;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
import org.springframework.transaction.annotation.Transactional;
 | 
			
		||||
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 消息相关业务
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class MessageServiceImpl extends ServiceImpl<MessageMapper, MessageEntity> implements MessageService {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 新增消息
 | 
			
		||||
     *
 | 
			
		||||
     * @param messageAddDTO 消息新增对象
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void add(MessageAddDTO messageAddDTO) {
 | 
			
		||||
        MessageEntity entity = BeanUtil.toBean(messageAddDTO, MessageEntity.class);
 | 
			
		||||
        entity.setIsRead(MessageConstants.UNREAD);
 | 
			
		||||
        entity.setIsDelete(MessageConstants.NOT_DELETED);
 | 
			
		||||
 | 
			
		||||
        this.save(entity);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 标记已读
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 消息id
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    @Transactional(rollbackFor = {SLException.class, Exception.class})
 | 
			
		||||
    public void update2Read(Long id) {
 | 
			
		||||
        //根据id查询消息是否存在
 | 
			
		||||
        MessageEntity entity = this.getById(id);
 | 
			
		||||
        if (entity == null) {
 | 
			
		||||
            throw new SLException("消息不存在");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //更新消息已读状态、读时间、更新时间字段
 | 
			
		||||
        LambdaUpdateWrapper<MessageEntity> updateWrapper = Wrappers.<MessageEntity>lambdaUpdate()
 | 
			
		||||
                .eq(MessageEntity::getId, id)
 | 
			
		||||
                .set(MessageEntity::getIsRead, MessageConstants.IS_READ)
 | 
			
		||||
                .set(MessageEntity::getReadTime, LocalDateTime.now());
 | 
			
		||||
        this.update(updateWrapper);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 批量已读
 | 
			
		||||
     *
 | 
			
		||||
     * @param ids 消息id列表
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void batchRead(List<Long> ids) {
 | 
			
		||||
        //id列表为空则不操作
 | 
			
		||||
        if (CollUtil.isEmpty(ids)) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //根据id查询消息对象
 | 
			
		||||
        List<MessageEntity> entities = this.listByIds(ids);
 | 
			
		||||
 | 
			
		||||
        //更新消息已读状态和已读时间
 | 
			
		||||
        entities.forEach(message -> {
 | 
			
		||||
            message.setIsRead(MessageConstants.IS_READ);
 | 
			
		||||
            message.setReadTime(LocalDateTime.now());
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        //批量更新
 | 
			
		||||
        this.updateBatchById(entities);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 全部已读
 | 
			
		||||
     *
 | 
			
		||||
     * @param userId      用户id
 | 
			
		||||
     * @param contentType 消息类型,300:快递员端公告,301:寄件相关消息,302:签收相关消息,303:快件取消消息,200:司机端公告,201:司机端系统通知
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void readAll(Long userId, Integer contentType) {
 | 
			
		||||
        //条件查询未读消息
 | 
			
		||||
        LambdaQueryWrapper<MessageEntity> queryWrapper = Wrappers.<MessageEntity>lambdaQuery()
 | 
			
		||||
                .eq(ObjectUtil.isNotEmpty(userId), MessageEntity::getUserId, userId)
 | 
			
		||||
                .eq(ObjectUtil.isNotEmpty(contentType), MessageEntity::getContentType, contentType)
 | 
			
		||||
                .eq(MessageEntity::getIsRead, MessageConstants.UNREAD);
 | 
			
		||||
        List<MessageEntity> entities = this.list(queryWrapper);
 | 
			
		||||
        if (CollUtil.isEmpty(entities)) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //更新消息已读状态、读时间、更新时间字段
 | 
			
		||||
        entities.forEach(message -> {
 | 
			
		||||
            message.setIsRead(MessageConstants.IS_READ);
 | 
			
		||||
            message.setReadTime(LocalDateTime.now());
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        //批量更新
 | 
			
		||||
        this.updateBatchById(entities);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 查询消息列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param messageQueryDTO 消息查询对象
 | 
			
		||||
     * @return 消息列表
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<MessageDTO> queryList(MessageQueryDTO messageQueryDTO) {
 | 
			
		||||
        //根据功能端、消息类型、用户id、创建时间构造查询条件
 | 
			
		||||
        LambdaQueryWrapper<MessageEntity> queryWrapper = Wrappers.<MessageEntity>lambdaQuery()
 | 
			
		||||
                .eq(MessageEntity::getBussinessType, messageQueryDTO.getBussinessType())
 | 
			
		||||
                .eq(ObjectUtil.isNotEmpty(messageQueryDTO.getContentType()), MessageEntity::getContentType, messageQueryDTO.getContentType())
 | 
			
		||||
                .eq(ObjectUtil.isNotEmpty(messageQueryDTO.getUserId()), MessageEntity::getUserId, messageQueryDTO.getUserId())
 | 
			
		||||
                .eq(ObjectUtil.isNotEmpty(messageQueryDTO.getIsRead()), MessageEntity::getIsRead, messageQueryDTO.getIsRead())
 | 
			
		||||
                .eq(MessageEntity::getIsDelete, MessageConstants.NOT_DELETED)
 | 
			
		||||
                //查询近一个月的消息列表
 | 
			
		||||
                .ge(MessageEntity::getCreated, LocalDateTime.now().plusMonths(-1))
 | 
			
		||||
                .orderByDesc(MessageEntity::getCreated);
 | 
			
		||||
 | 
			
		||||
        //判断消息列表是否为空,不为空,将其转换为dto返回
 | 
			
		||||
        List<MessageEntity> entityList = this.list(queryWrapper);
 | 
			
		||||
        if (CollUtil.isEmpty(entityList)) {
 | 
			
		||||
            return Collections.emptyList();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return entityList.stream().map(message -> BeanUtil.toBean(message, MessageDTO.class)).collect(Collectors.toList());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据类型查询消息数量
 | 
			
		||||
     *
 | 
			
		||||
     * @param messageQueryDTO 消息查询对象
 | 
			
		||||
     * @return 消息条数
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public Integer countType(MessageQueryDTO messageQueryDTO) {
 | 
			
		||||
        //根据功能端、消息类型、用户id、未读状态构造查询条件
 | 
			
		||||
        LambdaQueryWrapper<MessageEntity> queryWrapper = Wrappers.<MessageEntity>lambdaQuery()
 | 
			
		||||
                .eq(MessageEntity::getBussinessType, messageQueryDTO.getBussinessType())
 | 
			
		||||
                .eq(ObjectUtil.isNotEmpty(messageQueryDTO.getContentType()), MessageEntity::getContentType, messageQueryDTO.getContentType())
 | 
			
		||||
                .eq(ObjectUtil.isNotEmpty(messageQueryDTO.getUserId()), MessageEntity::getUserId, messageQueryDTO.getUserId())
 | 
			
		||||
                .eq(ObjectUtil.isNotEmpty(messageQueryDTO.getIsRead()), MessageEntity::getIsRead, messageQueryDTO.getIsRead());
 | 
			
		||||
 | 
			
		||||
        //消息计数
 | 
			
		||||
        return (int) this.count(queryWrapper);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 最新消息查询
 | 
			
		||||
     *
 | 
			
		||||
     * @param messageQueryDTO 消息查询对象
 | 
			
		||||
     * @return 最新消息对象
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public LatestMessageDTO latestMessage(MessageQueryDTO messageQueryDTO) {
 | 
			
		||||
        //根据功能端、消息类型、用户id构造查询条件
 | 
			
		||||
        LambdaQueryWrapper<MessageEntity> queryWrapper = Wrappers.<MessageEntity>lambdaQuery()
 | 
			
		||||
                .eq(ObjectUtil.isNotEmpty(messageQueryDTO.getBussinessType()), MessageEntity::getBussinessType, messageQueryDTO.getBussinessType())
 | 
			
		||||
                .eq(ObjectUtil.isNotEmpty(messageQueryDTO.getContentType()), MessageEntity::getContentType, messageQueryDTO.getContentType())
 | 
			
		||||
                .eq(ObjectUtil.isNotEmpty(messageQueryDTO.getUserId()), MessageEntity::getUserId, messageQueryDTO.getUserId())
 | 
			
		||||
                .eq(ObjectUtil.isNotEmpty(messageQueryDTO.getIsRead()), MessageEntity::getIsRead, messageQueryDTO.getIsRead())
 | 
			
		||||
                .orderByDesc(MessageEntity::getCreated)
 | 
			
		||||
                .last("LIMIT 1");
 | 
			
		||||
 | 
			
		||||
        //查询出最近一条消息
 | 
			
		||||
        MessageEntity messageEntity = this.getOne(queryWrapper);
 | 
			
		||||
        if (ObjectUtil.isEmpty(messageEntity)) {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //entity转为dto
 | 
			
		||||
        return BeanUtil.toBean(messageEntity, LatestMessageDTO.class);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分页查询消息列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param messageQueryDTO 消息查询对象
 | 
			
		||||
     * @return 分页数据
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public PageResponse<MessageDTO> pageQuery(MessageQueryDTO messageQueryDTO) {
 | 
			
		||||
        //根据功能端、消息类型、用户id、创建时间构造查询条件
 | 
			
		||||
        Page<MessageEntity> iPage = new Page<>(messageQueryDTO.getPage(), messageQueryDTO.getPageSize());
 | 
			
		||||
        LambdaQueryWrapper<MessageEntity> queryWrapper = Wrappers.<MessageEntity>lambdaQuery()
 | 
			
		||||
                .eq(ObjectUtil.isNotEmpty(messageQueryDTO.getBussinessType()), MessageEntity::getBussinessType, messageQueryDTO.getBussinessType())
 | 
			
		||||
                .eq(ObjectUtil.isNotEmpty(messageQueryDTO.getContentType()), MessageEntity::getContentType, messageQueryDTO.getContentType())
 | 
			
		||||
                .eq(ObjectUtil.isNotEmpty(messageQueryDTO.getUserId()), MessageEntity::getUserId, messageQueryDTO.getUserId())
 | 
			
		||||
                .eq(ObjectUtil.isNotEmpty(messageQueryDTO.getIsRead()), MessageEntity::getIsRead, messageQueryDTO.getIsRead())
 | 
			
		||||
                //查询近一个月的消息列表
 | 
			
		||||
                .ge(MessageEntity::getCreated, LocalDateTime.now().plusMonths(-1))
 | 
			
		||||
                .eq(MessageEntity::getIsDelete, MessageConstants.NOT_DELETED)
 | 
			
		||||
                .orderByDesc(MessageEntity::getCreated);
 | 
			
		||||
 | 
			
		||||
        //分页查询
 | 
			
		||||
        Page<MessageEntity> pageResult = this.page(iPage, queryWrapper);
 | 
			
		||||
        if (ObjectUtil.isEmpty(pageResult.getRecords())) {
 | 
			
		||||
            return new PageResponse<>(pageResult);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //封装分页数据
 | 
			
		||||
        return new PageResponse<>(pageResult, MessageDTO.class);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,12 @@
 | 
			
		||||
package com.sl.ms.base.service.base.impl;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkHistorySchedulingEntity;
 | 
			
		||||
import com.sl.ms.base.mapper.base.WorkHistorySchedulingMapper;
 | 
			
		||||
import com.sl.ms.base.service.base.WorkHistorySchedulingService;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
@Service
 | 
			
		||||
public class WorkHistorySchedulingServiceImpl extends ServiceImpl<WorkHistorySchedulingMapper, WorkHistorySchedulingEntity> implements WorkHistorySchedulingService {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,157 @@
 | 
			
		||||
package com.sl.ms.base.service.base.impl;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import com.sl.ms.base.constant.WorkConstants;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkPatternAddDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkPatternDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkPatternQueryDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkPatternUpdateDTO;
 | 
			
		||||
import com.sl.ms.base.domain.enums.WorkPatternEnum;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkPatternEntity;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkSchedulingEntity;
 | 
			
		||||
import com.sl.ms.base.mapper.base.WorkPatternMapper;
 | 
			
		||||
import com.sl.ms.base.service.base.WorkPatternService;
 | 
			
		||||
import com.sl.ms.base.service.base.WorkSchedulingService;
 | 
			
		||||
import com.sl.ms.base.utils.WorkPatternUtils;
 | 
			
		||||
import com.sl.transport.common.exception.SLException;
 | 
			
		||||
import com.sl.transport.common.util.BeanUtil;
 | 
			
		||||
import com.sl.transport.common.util.PageResponse;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
import org.springframework.transaction.annotation.Transactional;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 工作模式服务
 | 
			
		||||
 */
 | 
			
		||||
@Slf4j
 | 
			
		||||
@Service
 | 
			
		||||
public class WorkPatternServiceImpl extends ServiceImpl<WorkPatternMapper, WorkPatternEntity> implements WorkPatternService {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private WorkSchedulingService workSchedulingService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分页查询工作模式
 | 
			
		||||
     *
 | 
			
		||||
     * @param workPatternQueryDTO 查询条件
 | 
			
		||||
     * @return 工作模式数据
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public PageResponse<WorkPatternDTO> page(WorkPatternQueryDTO workPatternQueryDTO) {
 | 
			
		||||
        WorkPatternMapper workPatternMapper = getBaseMapper();
 | 
			
		||||
 | 
			
		||||
        LambdaQueryWrapper<WorkPatternEntity> queryWrapper = Wrappers.lambdaQuery();
 | 
			
		||||
        queryWrapper.eq(WorkPatternEntity::getIsDelete, 0);
 | 
			
		||||
        queryWrapper.orderByDesc(WorkPatternEntity::getCreated);
 | 
			
		||||
        Page<WorkPatternEntity> page = new Page<>(workPatternQueryDTO.getPage(), workPatternQueryDTO.getPageSize());
 | 
			
		||||
 | 
			
		||||
        IPage<WorkPatternEntity> iPage = workPatternMapper.selectPage(page, queryWrapper);
 | 
			
		||||
 | 
			
		||||
        return PageResponse.of(iPage, WorkPatternDTO.class, (entity, workPatternDTO) -> {
 | 
			
		||||
            workPatternDTO.setWorkDate(WorkPatternUtils.toWorkDate(entity));
 | 
			
		||||
            workPatternDTO.setWorkPatternTypeDesc(WorkPatternEnum.desc(entity.getWorkPatternType()));
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 工作模式ID查询
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 工作模式ID
 | 
			
		||||
     * @return 工作模式
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public WorkPatternDTO findById(Long id) {
 | 
			
		||||
        WorkPatternEntity workPatternEntity = getBaseMapper().selectById(id);
 | 
			
		||||
        return BeanUtil.toBean(workPatternEntity, WorkPatternDTO.class, (entity, workPatternDTO) -> {
 | 
			
		||||
            workPatternDTO.setWorkDate(WorkPatternUtils.toWorkDate(entity));
 | 
			
		||||
            workPatternDTO.setWorkPatternTypeDesc(WorkPatternEnum.desc(entity.getWorkPatternType()));
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 删除工作模式
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 工作模式ID
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    @Transactional(rollbackFor = {SLException.class, Exception.class})
 | 
			
		||||
    public void delete(long id) {
 | 
			
		||||
 | 
			
		||||
        // 删除限制
 | 
			
		||||
        long count = workSchedulingService.count(Wrappers.<WorkSchedulingEntity>lambdaQuery().eq(WorkSchedulingEntity::getWorkPatternId, id));
 | 
			
		||||
        if (count > 0) {
 | 
			
		||||
            throw new SLException("改工作模式下有排班,请先把排班修改为其他工作模式后删除");
 | 
			
		||||
        }
 | 
			
		||||
        int number = getBaseMapper().deleteById(id);
 | 
			
		||||
        if (number <= 0) {
 | 
			
		||||
            throw new SLException("工作模式删除失败");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新工作模式
 | 
			
		||||
     *
 | 
			
		||||
     * @param workPatternUpdateDTO 工作模式
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    @Transactional(rollbackFor = {SLException.class, Exception.class})
 | 
			
		||||
    public void update(WorkPatternUpdateDTO workPatternUpdateDTO) {
 | 
			
		||||
        WorkPatternMapper workPatternMapper = getBaseMapper();
 | 
			
		||||
        WorkPatternEntity workPatternEntity = BeanUtil.toBean(workPatternUpdateDTO, WorkPatternEntity.class, (origin, entity) -> {
 | 
			
		||||
            entity.setName(origin.getName());
 | 
			
		||||
            entity.setUpdated(LocalDateTime.now());
 | 
			
		||||
            entity.setStatus(WorkConstants.WorkStatus.STOP);
 | 
			
		||||
        });
 | 
			
		||||
        int result = workPatternMapper.updateById(workPatternEntity);
 | 
			
		||||
        if (result <= 0) {
 | 
			
		||||
            throw new SLException("工作模式更新失败");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 新增工作模式
 | 
			
		||||
     *
 | 
			
		||||
     * @param workPatternAddDTO 工作模式
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    @Transactional(rollbackFor = {SLException.class, Exception.class})
 | 
			
		||||
    public void add(WorkPatternAddDTO workPatternAddDTO) {
 | 
			
		||||
 | 
			
		||||
        WorkPatternEntity workPatternEntity = BeanUtil.toBean(workPatternAddDTO, WorkPatternEntity.class, (dto, entity) -> {
 | 
			
		||||
            entity.setId(IdWorker.getId());
 | 
			
		||||
            entity.setCreater(dto.getOperator());
 | 
			
		||||
            entity.setUpdater(dto.getOperator());
 | 
			
		||||
            entity.setCreated(LocalDateTime.now());
 | 
			
		||||
            entity.setUpdated(LocalDateTime.now());
 | 
			
		||||
            entity.setStatus(WorkConstants.WorkStatus.USING);
 | 
			
		||||
        });
 | 
			
		||||
        BeanUtil.setDefault(workPatternEntity);
 | 
			
		||||
        int result = getBaseMapper().insert(workPatternEntity);
 | 
			
		||||
        if (result <= 0) {
 | 
			
		||||
            throw new SLException("工作模式新增失败");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<WorkPatternDTO> all() {
 | 
			
		||||
        return list(
 | 
			
		||||
                Wrappers.<WorkPatternEntity>lambdaQuery()
 | 
			
		||||
                        .eq(WorkPatternEntity::getIsDelete, 0))
 | 
			
		||||
                .stream()
 | 
			
		||||
                .map(v -> BeanUtil.toBean(v, WorkPatternDTO.class))
 | 
			
		||||
                .collect(Collectors.toList());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,443 @@
 | 
			
		||||
package com.sl.ms.base.service.base.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import cn.hutool.core.date.LocalDateTimeUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.toolkit.SimpleQuery;
 | 
			
		||||
import com.google.common.collect.Lists;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkSchedulingAddDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkSchedulingDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkSchedulingQueryDTO;
 | 
			
		||||
import com.sl.ms.base.domain.base.WorkSchedulingUpdateDTO;
 | 
			
		||||
import com.sl.ms.base.domain.enums.WorkPatternEnum;
 | 
			
		||||
import com.sl.ms.base.domain.enums.WorkStatusEnum;
 | 
			
		||||
import com.sl.ms.base.domain.enums.WorkUserTypeEnum;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkHistorySchedulingEntity;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkPatternEntity;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkSchedulingEntity;
 | 
			
		||||
import com.sl.ms.base.entity.user.TruckDriverEntity;
 | 
			
		||||
import com.sl.ms.base.mapper.base.WorkHistorySchedulingMapper;
 | 
			
		||||
import com.sl.ms.base.mapper.base.WorkSchedulingMapper;
 | 
			
		||||
import com.sl.ms.base.service.base.WorkPatternService;
 | 
			
		||||
import com.sl.ms.base.service.base.WorkSchedulingService;
 | 
			
		||||
import com.sl.ms.base.service.user.TruckDriverService;
 | 
			
		||||
import com.sl.ms.base.utils.WorkSchedulingUtils;
 | 
			
		||||
import com.sl.transport.common.exception.SLException;
 | 
			
		||||
import com.sl.transport.common.util.BeanUtil;
 | 
			
		||||
import com.sl.transport.common.util.DateUtils;
 | 
			
		||||
import com.sl.transport.common.util.PageResponse;
 | 
			
		||||
import org.jetbrains.annotations.Nullable;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
import org.springframework.transaction.annotation.Transactional;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.util.*;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 排班服务
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class WorkSchedulingServiceImpl extends ServiceImpl<WorkSchedulingMapper, WorkSchedulingEntity> implements WorkSchedulingService {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private WorkHistorySchedulingMapper workHistorySchedulingMapper;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private WorkPatternService workPatternService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckDriverService truckDriverService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分页查询排班
 | 
			
		||||
     *
 | 
			
		||||
     * @param workSchedulingQueryDTO 查询条件
 | 
			
		||||
     * @return 排班
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public PageResponse<WorkSchedulingDTO> queryForPage(WorkSchedulingQueryDTO workSchedulingQueryDTO) {
 | 
			
		||||
 | 
			
		||||
        //查询月份
 | 
			
		||||
        final String queryMonth = StringUtils.isEmpty(workSchedulingQueryDTO.getMonth()) ?
 | 
			
		||||
                LocalDateTimeUtil.format(LocalDateTimeUtil.now(), DateUtils.DEFAULT_MONTH_FORMAT) :
 | 
			
		||||
                workSchedulingQueryDTO.getMonth();
 | 
			
		||||
 | 
			
		||||
        boolean isQueryHistory = WorkSchedulingUtils.isQueryHistory(queryMonth); //是否查询历史数据
 | 
			
		||||
 | 
			
		||||
        //查询排班记录
 | 
			
		||||
        LambdaQueryWrapper<WorkSchedulingEntity> queryWrapper = Wrappers.lambdaQuery();
 | 
			
		||||
        // 增加查询条件
 | 
			
		||||
        queryWrapper
 | 
			
		||||
                .eq(WorkSchedulingEntity::getIsDelete, 0)
 | 
			
		||||
                .eq(ObjectUtil.isNotEmpty(workSchedulingQueryDTO.getUserType()), WorkSchedulingEntity::getUserType, workSchedulingQueryDTO.getUserType())
 | 
			
		||||
                .like(ObjectUtil.isNotEmpty(workSchedulingQueryDTO.getName()), WorkSchedulingEntity::getName, workSchedulingQueryDTO.getName())
 | 
			
		||||
                .like(ObjectUtil.isNotEmpty(workSchedulingQueryDTO.getEmployeeNumber()), WorkSchedulingEntity::getEmployeeNumber, workSchedulingQueryDTO.getEmployeeNumber())
 | 
			
		||||
                .like(ObjectUtil.isNotEmpty(workSchedulingQueryDTO.getAgencyId()), WorkSchedulingEntity::getAgencyId, workSchedulingQueryDTO.getAgencyId())
 | 
			
		||||
                .eq(ObjectUtil.isNotEmpty(workSchedulingQueryDTO.getWorkPatternId()), WorkSchedulingEntity::getWorkPatternId, workSchedulingQueryDTO.getWorkPatternId())
 | 
			
		||||
                .orderByDesc(WorkSchedulingEntity::getCreated);
 | 
			
		||||
        Page<WorkSchedulingEntity> entityPage = getBaseMapper().selectPage
 | 
			
		||||
                (new Page<>(workSchedulingQueryDTO.getPage(),
 | 
			
		||||
                        workSchedulingQueryDTO.getPageSize()), queryWrapper);
 | 
			
		||||
 | 
			
		||||
        int dayNumOfQueryMonth = DateUtils.getMonthEndTime(queryMonth).getDayOfMonth();
 | 
			
		||||
        final Map<String, String> historyMap = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
        List<WorkSchedulingEntity> records = entityPage.getRecords();
 | 
			
		||||
        if (CollUtil.isEmpty(records)) { //有数据
 | 
			
		||||
            return PageResponse.of(entityPage, WorkSchedulingDTO.class);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (isQueryHistory) { //查询历史数据
 | 
			
		||||
            List<Long> userIdList = records.stream().map(WorkSchedulingEntity::getUserId).collect(Collectors.toList());
 | 
			
		||||
            List<WorkHistorySchedulingEntity> historyEntity = workHistorySchedulingMapper.selectList(
 | 
			
		||||
                    Wrappers.<WorkHistorySchedulingEntity>lambdaQuery()
 | 
			
		||||
                            .eq(WorkHistorySchedulingEntity::getWorkMonth, queryMonth)
 | 
			
		||||
                            .in(WorkHistorySchedulingEntity::getUserId, userIdList)
 | 
			
		||||
                            .between(WorkHistorySchedulingEntity::getWorkDay, 0, dayNumOfQueryMonth)
 | 
			
		||||
            );
 | 
			
		||||
            if (CollUtil.isNotEmpty(historyEntity)) {
 | 
			
		||||
                historyEntity.parallelStream().forEach(entity -> historyMap.put(entity.getUserId() + "" + entity.getWorkDay(), ""));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 补充工作模式名称
 | 
			
		||||
        Map<Long, WorkPatternEntity> patternByIds = getPatternByIds(records);
 | 
			
		||||
 | 
			
		||||
        return PageResponse.of(entityPage, WorkSchedulingDTO.class, (entity, dto) -> {
 | 
			
		||||
            List<Boolean> workSchedules = new ArrayList<>();
 | 
			
		||||
            for (int count = 1; count <= dayNumOfQueryMonth; count++) {
 | 
			
		||||
                workSchedules.add(WorkSchedulingUtils.isWorded(entity, queryMonth, count, patternByIds.get(entity.getWorkPatternId()), historyMap, false));
 | 
			
		||||
            }
 | 
			
		||||
            dto.setWorkSchedules(workSchedules);
 | 
			
		||||
            appenWorkPatten(dto, patternByIds);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 新增排班
 | 
			
		||||
     *
 | 
			
		||||
     * @param workSchedulingAddDTO 排班
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    @Transactional(rollbackFor = Exception.class)
 | 
			
		||||
    public void add(WorkSchedulingAddDTO workSchedulingAddDTO) {
 | 
			
		||||
        WorkSchedulingEntity workSchedulingEntity = BeanUtil.toBean(workSchedulingAddDTO, WorkSchedulingEntity.class, (dto, entity) -> {
 | 
			
		||||
            entity.setId(IdWorker.getId());
 | 
			
		||||
            entity.setCreater(dto.getOperator());
 | 
			
		||||
            entity.setUpdater(dto.getOperator());
 | 
			
		||||
            entity.setCreated(LocalDateTime.now());
 | 
			
		||||
            entity.setUpdated(LocalDateTime.now());
 | 
			
		||||
        });
 | 
			
		||||
        int insert = getBaseMapper().insert(workSchedulingEntity);
 | 
			
		||||
        if (insert <= 0) {
 | 
			
		||||
            throw new SLException("新增工作品排班失败");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 删除排班
 | 
			
		||||
     *
 | 
			
		||||
     * @param id       排班ID
 | 
			
		||||
     * @param operator 操作人
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    @Transactional(rollbackFor = Exception.class)
 | 
			
		||||
    public void delete(Long id, Long operator) {
 | 
			
		||||
        WorkSchedulingEntity entity = new WorkSchedulingEntity();
 | 
			
		||||
        entity.setId(id);
 | 
			
		||||
        entity.setIsDelete(true);
 | 
			
		||||
        entity.setUpdater(operator);
 | 
			
		||||
        if (getBaseMapper().updateById(entity) <= 0) {
 | 
			
		||||
            throw new SLException("删除操作失败");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 批量新增排班
 | 
			
		||||
     *
 | 
			
		||||
     * @param workSchedulingAddDTOList 排班列表
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    @Transactional(rollbackFor = Exception.class)
 | 
			
		||||
    public void batchAdd(List<WorkSchedulingAddDTO> workSchedulingAddDTOList) {
 | 
			
		||||
 | 
			
		||||
        if (CollUtil.isEmpty(workSchedulingAddDTOList)) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        List<WorkSchedulingEntity> batchAddEntityList = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
        for (int count = 0; count < workSchedulingAddDTOList.size(); count++) {
 | 
			
		||||
            WorkSchedulingEntity workSchedulingEntity = BeanUtil.toBean(workSchedulingAddDTOList.get(count), WorkSchedulingEntity.class, (dto, entity) -> {
 | 
			
		||||
                entity.setId(IdWorker.getId());
 | 
			
		||||
                entity.setCreater(dto.getOperator());
 | 
			
		||||
                entity.setUpdater(dto.getOperator());
 | 
			
		||||
                entity.setCreated(LocalDateTime.now());
 | 
			
		||||
                entity.setUpdated(LocalDateTime.now());
 | 
			
		||||
                entity.setUserId(Long.parseLong(entity.getEmployeeNumber()));
 | 
			
		||||
                entity.setState(WorkStatusEnum.NOMAL.getStatus());
 | 
			
		||||
                if (dto.getWorkPatternType() == WorkPatternEnum.Continuitys.getType()) {
 | 
			
		||||
                    entity.setWorkContinueStartTime(DateUtils.getStartTime(LocalDateTime.now()));
 | 
			
		||||
                }
 | 
			
		||||
                //设置默认值
 | 
			
		||||
                BeanUtil.setDefault(entity);
 | 
			
		||||
            });
 | 
			
		||||
            batchAddEntityList.add(workSchedulingEntity);
 | 
			
		||||
            if (batchAddEntityList.size() % 500 == 0 || count == workSchedulingAddDTOList.size() - 1) {
 | 
			
		||||
                getBaseMapper().batchInsert(batchAddEntityList);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        // 导入排班时候 可能司机表里还没有数据
 | 
			
		||||
        workSchedulingAddDTOList.parallelStream().forEach(v -> {
 | 
			
		||||
            if (ObjectUtil.notEqual(v.getUserType(), WorkUserTypeEnum.DRIVER.getCode())) {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            TruckDriverEntity one = truckDriverService.findOne(v.getUserId());
 | 
			
		||||
            if (ObjectUtil.isEmpty(one)) {
 | 
			
		||||
                TruckDriverEntity truckDriverEntity = new TruckDriverEntity();
 | 
			
		||||
                truckDriverEntity.setUserId(v.getUserId());
 | 
			
		||||
                truckDriverService.save(truckDriverEntity);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新排班
 | 
			
		||||
     *
 | 
			
		||||
     * @param workSchedulingUpdateDTO 排班
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    @Transactional(rollbackFor = Exception.class)
 | 
			
		||||
    public void update(WorkSchedulingUpdateDTO workSchedulingUpdateDTO) {
 | 
			
		||||
 | 
			
		||||
        WorkSchedulingMapper workSchedulingMapper = getBaseMapper();
 | 
			
		||||
        WorkSchedulingEntity entityInDb = workSchedulingMapper.selectById(workSchedulingUpdateDTO.getId());
 | 
			
		||||
        if (entityInDb == null) {
 | 
			
		||||
            throw new SLException("无法进行更新");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        WorkSchedulingEntity workSchedulingEntity = BeanUtil.toBean(workSchedulingUpdateDTO, WorkSchedulingEntity.class, (dto, entity) -> {
 | 
			
		||||
            entity.setUpdated(LocalDateTime.now());
 | 
			
		||||
            entity.setUpdater(dto.getOperator());
 | 
			
		||||
            //如果以前是礼拜制 或者以前无排班,修改连续制,连续制的开始时间为操作当日的开始时间
 | 
			
		||||
            WorkPatternEntity workPatternEntity = workPatternService.getById(entityInDb.getWorkPatternId());
 | 
			
		||||
            if (workSchedulingUpdateDTO.getWorkPatternType() == WorkPatternEnum.Continuitys.getType()
 | 
			
		||||
                    && (ObjectUtil.isEmpty(workPatternEntity) || workPatternEntity.getWorkPatternType() != WorkPatternEnum.Continuitys.getType())) {
 | 
			
		||||
                entity.setWorkContinueStartTime(DateUtils.getStartTime(LocalDateTime.now()));
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        int result = workSchedulingMapper.updateById(workSchedulingEntity);
 | 
			
		||||
        if (result <= 0) {
 | 
			
		||||
            throw new SLException("更新操作失败");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据用户id查询这个月排班计划
 | 
			
		||||
     *
 | 
			
		||||
     * @param userId 用户ID
 | 
			
		||||
     * @return 未来一周排班计划
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public WorkSchedulingDTO currentSchedule(Long userId) {
 | 
			
		||||
 | 
			
		||||
        List<WorkSchedulingEntity> entities = getBaseMapper().
 | 
			
		||||
                selectByMap(Map.of("user_id", userId, "is_delete", 0));
 | 
			
		||||
        List<WorkSchedulingDTO> workSchedulingDTOS = getWorkSchedulingDTOS(entities, null);
 | 
			
		||||
        if (CollUtil.isEmpty(workSchedulingDTOS)) {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        return workSchedulingDTOS.get(0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据用户id查询
 | 
			
		||||
     *
 | 
			
		||||
     * @param userId 用户ID
 | 
			
		||||
     * @return 排班数据
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public WorkSchedulingEntity getByUserId(Long userId) {
 | 
			
		||||
        List<WorkSchedulingEntity> entities = getBaseMapper().
 | 
			
		||||
                selectByMap(Map.of("user_id", userId, "is_delete", 0));
 | 
			
		||||
        if (CollUtil.isNotEmpty(entities)) {
 | 
			
		||||
            return entities.get(0);
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据网点id查询该网点所有员工的排班信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param agencyId 机构ID
 | 
			
		||||
     * @return 今天工作人员排班
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<WorkSchedulingDTO> monthScheduleByAgencyId(Long agencyId) {
 | 
			
		||||
        List<WorkSchedulingEntity> entities = getBaseMapper().
 | 
			
		||||
                selectByMap(Map.of("agency_id", agencyId, "is_delete", 0));
 | 
			
		||||
        return getWorkSchedulingDTOS(entities, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 补充工作模式
 | 
			
		||||
     *
 | 
			
		||||
     * @param entities 排班信息
 | 
			
		||||
     * @param time     时间
 | 
			
		||||
     * @return 排班信息
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    private List<WorkSchedulingDTO> getWorkSchedulingDTOS(List<WorkSchedulingEntity> entities, LocalDateTime time) {
 | 
			
		||||
        Map<Long, WorkPatternEntity> patternByIds = getPatternByIds(entities);
 | 
			
		||||
        if (CollUtil.isNotEmpty(entities)) {
 | 
			
		||||
            return entities.stream().map(entity -> {
 | 
			
		||||
                WorkSchedulingDTO parse = parse(entity, time);
 | 
			
		||||
                return appenWorkPatten(parse, patternByIds);
 | 
			
		||||
            }).collect(Collectors.toList());
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据快递员/司机id列表或网点id查询当前工作排班
 | 
			
		||||
     *
 | 
			
		||||
     * @param userIds  用户ID
 | 
			
		||||
     * @param agencyId 机构ID
 | 
			
		||||
     * @param type     用户类型:1:员工,2:快递员,3:司机
 | 
			
		||||
     * @param time     时间
 | 
			
		||||
     * @return 当前工作排班
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<WorkSchedulingDTO> monthSchedule(List<Long> userIds, Long agencyId, Byte type, LocalDateTime time) {
 | 
			
		||||
        if (CollUtil.isEmpty(userIds) && agencyId == null) {
 | 
			
		||||
            return Collections.emptyList();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        LambdaQueryWrapper<WorkSchedulingEntity> queryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        queryWrapper
 | 
			
		||||
                .in(CollUtil.isNotEmpty(userIds), WorkSchedulingEntity::getUserId, userIds)
 | 
			
		||||
                .eq(ObjectUtil.isNotEmpty(agencyId), WorkSchedulingEntity::getAgencyId, agencyId)
 | 
			
		||||
                .eq(WorkSchedulingEntity::getUserType, type);
 | 
			
		||||
        List<WorkSchedulingEntity> entities = getBaseMapper().selectList(queryWrapper);
 | 
			
		||||
        return getWorkSchedulingDTOS(entities, time);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 补充工作模式信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param workSchedulingDTO    dto
 | 
			
		||||
     * @param workPatternEntityMap 工作模型map
 | 
			
		||||
     * @return 工作模式
 | 
			
		||||
     */
 | 
			
		||||
    private WorkSchedulingDTO appenWorkPatten(WorkSchedulingDTO workSchedulingDTO, Map<Long, WorkPatternEntity> workPatternEntityMap) {
 | 
			
		||||
        if (CollUtil.isNotEmpty(workPatternEntityMap)) {
 | 
			
		||||
            WorkPatternEntity workPatternEntity = workPatternEntityMap.get(workSchedulingDTO.getWorkPatternId());
 | 
			
		||||
            if (ObjectUtil.isNotEmpty(workPatternEntity)) {
 | 
			
		||||
                workSchedulingDTO.setWorkStartMinute1(workPatternEntity.getWorkStartMinute1());
 | 
			
		||||
                workSchedulingDTO.setWorkEndMinute1(workPatternEntity.getWorkEndMinute1());
 | 
			
		||||
                workSchedulingDTO.setWorkPatternName(workPatternEntity.getName());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return workSchedulingDTO;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 结构转换
 | 
			
		||||
     *
 | 
			
		||||
     * @param entity 数据实体
 | 
			
		||||
     * @param time   未来的某个时间
 | 
			
		||||
     * @return 工作模式dto
 | 
			
		||||
     */
 | 
			
		||||
    private WorkSchedulingDTO parse(WorkSchedulingEntity entity, LocalDateTime time) {
 | 
			
		||||
        Map<Long, WorkPatternEntity> patternByIds = getPatternByIds(Lists.newArrayList(entity));
 | 
			
		||||
        return BeanUtil.toBean(entity, WorkSchedulingDTO.class, (workSchedulingEntity, workSchedulingDTO) -> {
 | 
			
		||||
            //暂未排班的情况设置为空
 | 
			
		||||
            if (workSchedulingEntity.getWorkPatternId() == 0) {
 | 
			
		||||
                workSchedulingDTO.setWorkSchedules(null);
 | 
			
		||||
            } else {
 | 
			
		||||
                LocalDateTime startTime = ObjectUtil.isEmpty(time) ? LocalDateTime.now() : time;
 | 
			
		||||
                int currentDay = startTime.getDayOfMonth();
 | 
			
		||||
                int monthNumber = DateUtils.getMonthNumber(startTime);
 | 
			
		||||
                List<Boolean> workList = new ArrayList<>();
 | 
			
		||||
                for (int count = currentDay; count <= monthNumber; count++) {
 | 
			
		||||
                    boolean worded = WorkSchedulingUtils.isWorded(entity, LocalDateTimeUtil.format(startTime, DateUtils.DEFAULT_MONTH_FORMAT),
 | 
			
		||||
                            count, patternByIds.get(workSchedulingEntity.getWorkPatternId()), null, false);
 | 
			
		||||
                    workList.add(worded);
 | 
			
		||||
                }
 | 
			
		||||
                workSchedulingDTO.setWorkSchedules(workList);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取工作模式信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param records 排班
 | 
			
		||||
     * @return 工作模式
 | 
			
		||||
     */
 | 
			
		||||
    private Map<Long, WorkPatternEntity> getPatternByIds(List<WorkSchedulingEntity> records) {
 | 
			
		||||
        if (CollUtil.isEmpty(records)) {
 | 
			
		||||
            return new HashMap<>();
 | 
			
		||||
        }
 | 
			
		||||
        // 补充工作模式名称
 | 
			
		||||
        List<Long> workPatternIds = records.stream().map(WorkSchedulingEntity::getWorkPatternId).collect(Collectors.toList());
 | 
			
		||||
        return SimpleQuery.keyMap(
 | 
			
		||||
                Wrappers.<WorkPatternEntity>lambdaQuery().in(WorkPatternEntity::getId, workPatternIds),
 | 
			
		||||
                WorkPatternEntity::getId);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取整个计划(运输任务)期间每一天都上班的司机
 | 
			
		||||
     *
 | 
			
		||||
     * @param driverIds         司机ID列表
 | 
			
		||||
     * @param planDepartureTime 计划发车时间
 | 
			
		||||
     * @param planArrivalTime   计划到达时间
 | 
			
		||||
     * @return 正常上班的司机ID列表
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<Long> getWorkingDrivers(List<Long> driverIds, LocalDateTime planDepartureTime, LocalDateTime planArrivalTime) {
 | 
			
		||||
 | 
			
		||||
        // 查询排班
 | 
			
		||||
        LambdaQueryWrapper<WorkSchedulingEntity> queryWrapper = Wrappers.<WorkSchedulingEntity>lambdaQuery()
 | 
			
		||||
                // 司机ID
 | 
			
		||||
                .in(WorkSchedulingEntity::getUserId, driverIds)
 | 
			
		||||
                // 用户类型
 | 
			
		||||
                .eq(WorkSchedulingEntity::getUserType, WorkUserTypeEnum.DRIVER.getCode());
 | 
			
		||||
        List<WorkSchedulingEntity> list = list(queryWrapper);
 | 
			
		||||
        Map<Long, WorkPatternEntity> patternByIds = getPatternByIds(list);
 | 
			
		||||
        // 过滤整个计划(运输任务)期间每一天都上班的司机
 | 
			
		||||
        List<Long> workUserIds = list.stream().filter(workSchedulingEntity -> {
 | 
			
		||||
            // 按照一年中365天 天数从小到达遍历 比如 从2020年1月1日 到2020年1月5日
 | 
			
		||||
            for (LocalDateTime count = planDepartureTime; count.isBefore(planArrivalTime); count = count.plusDays(1)) {
 | 
			
		||||
                // 转换为一个月的第几天 比如 2020年1月1日 转为月中的个数为 1
 | 
			
		||||
                int dayOfMonth = count.getDayOfMonth();
 | 
			
		||||
                String month = LocalDateTimeUtil.format(count, DateUtils.DEFAULT_MONTH_FORMAT);
 | 
			
		||||
                // 计算这一天的排班情况
 | 
			
		||||
                boolean worded = WorkSchedulingUtils.isWorded(workSchedulingEntity, month, dayOfMonth, patternByIds.get(workSchedulingEntity.getWorkPatternId()), null, false);
 | 
			
		||||
                // 如果有不上班的天 那这次计划就不应该包含这位司机
 | 
			
		||||
                if (!worded) {
 | 
			
		||||
                    return false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            // 整个计划(运输任务)期间每一天都上班的司机
 | 
			
		||||
            return true;
 | 
			
		||||
        }).map(WorkSchedulingEntity::getUserId).collect(Collectors.toList());
 | 
			
		||||
 | 
			
		||||
        if (workUserIds.size() <= 2) {
 | 
			
		||||
            return workUserIds;
 | 
			
		||||
        }
 | 
			
		||||
        return workUserIds.subList(0, 2);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,50 @@
 | 
			
		||||
package com.sl.ms.base.service.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TransportTripsTruckDriverEntity;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 车次与车辆关联信息表 服务类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author itcast
 | 
			
		||||
 * @since 2019-12-20
 | 
			
		||||
 */
 | 
			
		||||
public interface TransportTripsTruckDriverService extends IService<TransportTripsTruckDriverEntity> {
 | 
			
		||||
    /**
 | 
			
		||||
     * 批量保存车次与车辆关联信息
 | 
			
		||||
     * @param truckTransportTripsId 车次ID
 | 
			
		||||
     * @param truckTransportTrips 车次与车辆关联信息
 | 
			
		||||
     */
 | 
			
		||||
    void batchSave(Long truckTransportTripsId, List<TransportTripsTruckDriverEntity> truckTransportTrips);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取车次与车辆关联列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param transportTripsId 车次id
 | 
			
		||||
     * @param truckId          车辆Id
 | 
			
		||||
     * @param userId           司机id
 | 
			
		||||
     * @return 车次与车辆关联列表
 | 
			
		||||
     */
 | 
			
		||||
    List<TransportTripsTruckDriverEntity> findAll(Long transportTripsId, Long truckId, Long userId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 消除绑定关系
 | 
			
		||||
     * @param transportTripsId 车次ID
 | 
			
		||||
     * @param truckId 车辆ID
 | 
			
		||||
     */
 | 
			
		||||
    void delete(Long transportTripsId, Long truckId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 检查是否可以删除
 | 
			
		||||
     *
 | 
			
		||||
     * @param transportTripsId 车次id
 | 
			
		||||
     * @param truckId          车辆Id
 | 
			
		||||
     * @param userId           司机id
 | 
			
		||||
     * @return 是否可以删除
 | 
			
		||||
     */
 | 
			
		||||
    Boolean canRemove(Long transportTripsId, Long truckId, Long userId);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,19 @@
 | 
			
		||||
package com.sl.ms.base.service.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckLicenseEntity;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车辆行驶证表  服务类
 | 
			
		||||
 */
 | 
			
		||||
public interface TruckLicenseService extends IService<TruckLicenseEntity> {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 保存车辆行驶证信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param truckLicenseEntity 车辆行驶证信息
 | 
			
		||||
     * @return 车辆行驶证信息
 | 
			
		||||
     */
 | 
			
		||||
    TruckLicenseEntity saveTruckLicense(TruckLicenseEntity truckLicenseEntity);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,30 @@
 | 
			
		||||
package com.sl.ms.base.service.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckPlanEntity;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.concurrent.CompletableFuture;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车次计划任务 服务类
 | 
			
		||||
 */
 | 
			
		||||
public interface TruckPlanCreateService extends IService<TruckPlanEntity> {
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建首次计划 首次关系后台新增 安排司机和车辆给车次时候触发
 | 
			
		||||
     *
 | 
			
		||||
     * @param truckPlanEntity 车辆计划
 | 
			
		||||
     */
 | 
			
		||||
    void createPlan(TruckPlanEntity truckPlanEntity);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 异步创建下一次计划
 | 
			
		||||
     * 前一次计划完成触发
 | 
			
		||||
     *
 | 
			
		||||
     * @param truckId        车辆ID
 | 
			
		||||
     * @param driverIds      司机ID列表
 | 
			
		||||
     * @param currentOrganId 当前位置
 | 
			
		||||
     * @return 异步任务
 | 
			
		||||
     */
 | 
			
		||||
    CompletableFuture<String> createNextPlans(Long truckId, List<Long> driverIds, Long currentOrganId);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,38 @@
 | 
			
		||||
package com.sl.ms.base.service.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import com.sl.ms.base.domain.enums.StatusEnum;
 | 
			
		||||
import com.sl.ms.base.domain.truck.TruckPlanDto;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckPlanEntity;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车次计划任务 服务类
 | 
			
		||||
 */
 | 
			
		||||
public interface TruckPlanService extends IService<TruckPlanEntity> {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取未分配运输任务的车次计划列表
 | 
			
		||||
     * @return 未分配运输任务的车次计划列表
 | 
			
		||||
     * @param shardTotal 总片数
 | 
			
		||||
     * @param shardIndex 分片
 | 
			
		||||
     */
 | 
			
		||||
    List<TruckPlanDto> pullUnassignedPlan(Integer shardTotal, Integer shardIndex);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新计划状态为已调度 消费MQ更新调度状态
 | 
			
		||||
     * @param planId          计划ID
 | 
			
		||||
     */
 | 
			
		||||
    void scheduledPlan(Set<Long> planId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 计划完成
 | 
			
		||||
     * @param currentOrganId 结束机构id
 | 
			
		||||
     * @param planId          计划ID
 | 
			
		||||
     * @param truckId 车辆ID
 | 
			
		||||
     * @param statusEnum 车辆状态枚举
 | 
			
		||||
     */
 | 
			
		||||
    void finishedPlan(Long currentOrganId, Long planId, Long truckId, StatusEnum statusEnum);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,29 @@
 | 
			
		||||
package com.sl.ms.base.service.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import com.sl.ms.base.domain.truck.TruckReturnRegisterDTO;
 | 
			
		||||
import com.sl.ms.base.domain.truck.TruckReturnRegisterListDTO;
 | 
			
		||||
import com.sl.ms.base.domain.truck.TruckReturnRegisterPageQueryDTO;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckReturnRegisterEntity;
 | 
			
		||||
import com.sl.transport.common.util.PageResponse;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 回车登记 服务类
 | 
			
		||||
 */
 | 
			
		||||
public interface TruckReturnRegisterService extends IService<TruckReturnRegisterEntity> {
 | 
			
		||||
    /**
 | 
			
		||||
     * 分页查询回车登记列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param dto 分页查询条件
 | 
			
		||||
     * @return 回车登记分页结果
 | 
			
		||||
     */
 | 
			
		||||
    PageResponse<TruckReturnRegisterListDTO> pageQuery(TruckReturnRegisterPageQueryDTO dto);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据id查询回车登记详情
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 回车登记id
 | 
			
		||||
     * @return 回车登记详情
 | 
			
		||||
     */
 | 
			
		||||
    TruckReturnRegisterDTO findById(Long id);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,90 @@
 | 
			
		||||
package com.sl.ms.base.service.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import com.sl.ms.base.domain.enums.StatusEnum;
 | 
			
		||||
import com.sl.ms.base.domain.enums.TruckRunStatusEnum;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckEntity;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车辆信息表 服务类
 | 
			
		||||
 */
 | 
			
		||||
public interface TruckService extends IService<TruckEntity> {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取车辆分页数据
 | 
			
		||||
     *
 | 
			
		||||
     * @param page         页码
 | 
			
		||||
     * @param pageSize     页尺寸
 | 
			
		||||
     * @param truckTypeId  车辆类型id
 | 
			
		||||
     * @param status       状态
 | 
			
		||||
     * @param licensePlate 车辆号牌
 | 
			
		||||
     * @return 线路类型分页数据
 | 
			
		||||
     */
 | 
			
		||||
    IPage<TruckEntity> findByPage(Integer page, Integer pageSize, Long truckTypeId, Integer status, String licensePlate);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取车辆列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param ids 车辆id列表
 | 
			
		||||
     * @return 车辆列表
 | 
			
		||||
     */
 | 
			
		||||
    List<TruckEntity> findAll(List<Long> ids);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 禁用车辆
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 车辆id
 | 
			
		||||
     */
 | 
			
		||||
    void stopById(Long id);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新车辆状态
 | 
			
		||||
     *
 | 
			
		||||
     * @param id     车辆ID
 | 
			
		||||
     * @param status 车辆状态
 | 
			
		||||
     */
 | 
			
		||||
    void updateRunStatus(Long id, TruckRunStatusEnum status);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新当前位置
 | 
			
		||||
     *
 | 
			
		||||
     * @param truckId        车辆ID
 | 
			
		||||
     * @param currentOrganId 当前机构ID
 | 
			
		||||
     * @param statusEnum     {@link StatusEnum}
 | 
			
		||||
     * @return 是否成功
 | 
			
		||||
     */
 | 
			
		||||
    Boolean updateCurrentOrganId(Long truckId, Long currentOrganId, StatusEnum statusEnum);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 启用车辆
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 车辆ID
 | 
			
		||||
     */
 | 
			
		||||
    void workedById(Long id);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 状态分组统计
 | 
			
		||||
     *
 | 
			
		||||
     * @return 统计车辆信息
 | 
			
		||||
     */
 | 
			
		||||
    Map<Integer, Long> groupByStatus();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 车型数量
 | 
			
		||||
     *
 | 
			
		||||
     * @param typeId 车辆类型ID
 | 
			
		||||
     * @return 该车型下的车辆数量
 | 
			
		||||
     */
 | 
			
		||||
    Integer countByType(Long typeId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 删除
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 车辆ID
 | 
			
		||||
     */
 | 
			
		||||
    void del(Long id);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,38 @@
 | 
			
		||||
package com.sl.ms.base.service.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import com.sl.ms.base.domain.truck.OrganIdsDto;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckTripsEntity;
 | 
			
		||||
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车次信息表 服务类
 | 
			
		||||
 */
 | 
			
		||||
public interface TruckTripsService extends IService<TruckTripsEntity> {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取车次列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param transportLineId 线路id
 | 
			
		||||
     * @param ids             车次id列表
 | 
			
		||||
     * @return 车次列表
 | 
			
		||||
     */
 | 
			
		||||
    List<TruckTripsEntity> findAll(Long transportLineId, List<Long> ids);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 删除车次
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 车次ID
 | 
			
		||||
     */
 | 
			
		||||
    void disable(Long id);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据线路ID查询机构
 | 
			
		||||
     * @param values 线路ID
 | 
			
		||||
     * @return 机构信息
 | 
			
		||||
     */
 | 
			
		||||
    Map<Long, OrganIdsDto> getOrganIdsByTripsLineId(HashSet<Long> values);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,29 @@
 | 
			
		||||
package com.sl.ms.base.service.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckTypeGoodsTypeEntity;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车辆类型与货物类型关联表 服务类
 | 
			
		||||
 */
 | 
			
		||||
public interface TruckTypeGoodsTypeService extends IService<TruckTypeGoodsTypeEntity> {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 删除关联关系
 | 
			
		||||
     *
 | 
			
		||||
     * @param truckTypeId 车辆类型id
 | 
			
		||||
     * @param goodsTypeId 货物类型id
 | 
			
		||||
     */
 | 
			
		||||
    void delete(Long truckTypeId, Long goodsTypeId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取车辆类型与货物类型关联
 | 
			
		||||
     *
 | 
			
		||||
     * @param truckTypeId 车辆类型id
 | 
			
		||||
     * @param goodsTypeId 货物类型id
 | 
			
		||||
     * @return 车辆类型与货物类型关联
 | 
			
		||||
     */
 | 
			
		||||
    List<TruckTypeGoodsTypeEntity> findAll(Long truckTypeId, Long goodsTypeId);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,53 @@
 | 
			
		||||
package com.sl.ms.base.service.truck;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckTypeEntity;
 | 
			
		||||
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车辆类型表 服务类
 | 
			
		||||
 */
 | 
			
		||||
public interface TruckTypeService extends IService<TruckTypeEntity> {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取车辆类型分页数据
 | 
			
		||||
     *
 | 
			
		||||
     * @param page               页码
 | 
			
		||||
     * @param pageSize           页尺寸
 | 
			
		||||
     * @param name               车辆类型名称
 | 
			
		||||
     * @param minAllowableLoad   车辆载重最小值(闭区间)
 | 
			
		||||
     * @param maxAllowableLoad   车辆载重最大值(开区间)
 | 
			
		||||
     * @param minAllowableVolume 车辆体积最小值(闭区间)
 | 
			
		||||
     * @param maxAllowableVolume 车辆体积最小值(开区间)
 | 
			
		||||
     * @param id                 车型id
 | 
			
		||||
     * @return 车辆类型分页数据
 | 
			
		||||
     */
 | 
			
		||||
    IPage<TruckTypeEntity> findByPage(Integer page, Integer pageSize, String name, BigDecimal minAllowableLoad, BigDecimal maxAllowableLoad, BigDecimal minAllowableVolume, BigDecimal maxAllowableVolume, Long id);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取车辆类型列表
 | 
			
		||||
     * @param ids 车辆类型ids
 | 
			
		||||
     * @return 车辆类型列表
 | 
			
		||||
     */
 | 
			
		||||
    List<TruckTypeEntity> findAll(List<Long> ids);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 删除车辆类型
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 车型ID
 | 
			
		||||
     */
 | 
			
		||||
    void disable(Long id);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取map类型车辆类型数据集合
 | 
			
		||||
     *
 | 
			
		||||
     * @param truckTypeSet 车辆类型id列表
 | 
			
		||||
     * @return 执行结果
 | 
			
		||||
     */
 | 
			
		||||
    Map<Long, TruckTypeEntity> truckTypeMap(Set<Long> truckTypeSet);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,146 @@
 | 
			
		||||
package com.sl.ms.base.service.truck.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import com.sl.ms.base.domain.enums.TruckPlanScheduleStatusEnum;
 | 
			
		||||
import com.sl.ms.base.domain.enums.TruckPlanStatusEnum;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TransportTripsTruckDriverEntity;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckPlanEntity;
 | 
			
		||||
import com.sl.ms.base.entity.user.TruckDriverEntity;
 | 
			
		||||
import com.sl.ms.base.mapper.truck.TransportTripsTruckDriverMapper;
 | 
			
		||||
import com.sl.ms.base.service.truck.TransportTripsTruckDriverService;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckPlanCreateService;
 | 
			
		||||
import com.sl.ms.base.service.user.TruckDriverService;
 | 
			
		||||
import com.sl.transport.common.exception.SLException;
 | 
			
		||||
import org.apache.commons.lang3.ObjectUtils;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
import org.springframework.transaction.annotation.Transactional;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车次与车辆关联信息表 服务实现类
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class TransportTripsTruckDriverServiceImpl extends ServiceImpl<TransportTripsTruckDriverMapper, TransportTripsTruckDriverEntity>
 | 
			
		||||
        implements TransportTripsTruckDriverService {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    TruckDriverService truckDriverService;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    TruckPlanCreateService truckPlanCreateService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 批量保存车次与车辆关联信息
 | 
			
		||||
     * @param truckTransportTripsId 车次ID
 | 
			
		||||
     * @param truckTransportTripsTruckDriverEntityList 车次与车辆关联信息
 | 
			
		||||
     */
 | 
			
		||||
    @Transactional
 | 
			
		||||
    @Override
 | 
			
		||||
    public void batchSave(Long truckTransportTripsId, List<TransportTripsTruckDriverEntity> truckTransportTripsTruckDriverEntityList) {
 | 
			
		||||
        // 保存车辆和车次关联关系
 | 
			
		||||
        // 1,清除关系
 | 
			
		||||
        delete(truckTransportTripsId, null);
 | 
			
		||||
        List<TransportTripsTruckDriverEntity> saveList = new ArrayList<>();
 | 
			
		||||
        //遍历传入数据
 | 
			
		||||
        truckTransportTripsTruckDriverEntityList.forEach(transportTripsTruckDriver -> {
 | 
			
		||||
            List<TruckDriverEntity> driverEntities = truckDriverService.findByTruckId(transportTripsTruckDriver.getTruckId());
 | 
			
		||||
            if (CollUtil.isEmpty(driverEntities)) {
 | 
			
		||||
                throw new SLException(StrUtil.format("请先为该车辆绑定司机"));
 | 
			
		||||
            }
 | 
			
		||||
            driverEntities.forEach(truckDriverEntity -> {
 | 
			
		||||
                TransportTripsTruckDriverEntity saveData = BeanUtil.toBean(transportTripsTruckDriver, TransportTripsTruckDriverEntity.class);
 | 
			
		||||
                saveData.setDriverId(truckDriverEntity.getUserId());
 | 
			
		||||
                saveData.setTransportTripsId(truckTransportTripsId);
 | 
			
		||||
                saveList.add(saveData);
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            // 触发创建首次车辆计划
 | 
			
		||||
            List<Long> driverIds = driverEntities.stream().map(TruckDriverEntity::getUserId).collect(Collectors.toList());
 | 
			
		||||
            TruckPlanEntity build = TruckPlanEntity.builder()
 | 
			
		||||
                    .truckId(transportTripsTruckDriver.getTruckId())
 | 
			
		||||
                    .transportTripsId(truckTransportTripsId)
 | 
			
		||||
                    .driverIds(StrUtil.join(",", driverIds))
 | 
			
		||||
                    .status(TruckPlanStatusEnum.NORMAL.getCode())
 | 
			
		||||
                    .build();
 | 
			
		||||
            truckPlanCreateService.createPlan(build);
 | 
			
		||||
        });
 | 
			
		||||
        saveBatch(saveList);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取车次与车辆关联列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param transportTripsId 车次id
 | 
			
		||||
     * @param truckId          车辆Id
 | 
			
		||||
     * @param userId           司机id
 | 
			
		||||
     * @return 车次与车辆关联列表
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<TransportTripsTruckDriverEntity> findAll(Long transportTripsId, Long truckId, Long userId) {
 | 
			
		||||
        LambdaQueryWrapper<TransportTripsTruckDriverEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        if (ObjectUtils.isNotEmpty(transportTripsId)) {
 | 
			
		||||
            lambdaQueryWrapper.eq(TransportTripsTruckDriverEntity::getTransportTripsId, transportTripsId);
 | 
			
		||||
        }
 | 
			
		||||
        if (ObjectUtils.isNotEmpty(truckId)) {
 | 
			
		||||
            lambdaQueryWrapper.eq(TransportTripsTruckDriverEntity::getTruckId, truckId);
 | 
			
		||||
        }
 | 
			
		||||
        if (ObjectUtils.isNotEmpty(userId)) {
 | 
			
		||||
            lambdaQueryWrapper.eq(TransportTripsTruckDriverEntity::getDriverId, userId);
 | 
			
		||||
        }
 | 
			
		||||
        return baseMapper.selectList(lambdaQueryWrapper);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 检查是否可以删除
 | 
			
		||||
     *
 | 
			
		||||
     * @param transportTripsId 车次id
 | 
			
		||||
     * @param truckId          车辆Id
 | 
			
		||||
     * @param userId           司机id
 | 
			
		||||
     * @return 是否可以删除
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public Boolean canRemove(Long transportTripsId, Long truckId, Long userId) {
 | 
			
		||||
        LambdaQueryWrapper<TransportTripsTruckDriverEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        if (ObjectUtils.isNotEmpty(transportTripsId)) {
 | 
			
		||||
            lambdaQueryWrapper.eq(TransportTripsTruckDriverEntity::getTransportTripsId, transportTripsId);
 | 
			
		||||
        }
 | 
			
		||||
        if (ObjectUtils.isNotEmpty(truckId)) {
 | 
			
		||||
            lambdaQueryWrapper.eq(TransportTripsTruckDriverEntity::getTruckId, truckId);
 | 
			
		||||
        }
 | 
			
		||||
        if (ObjectUtils.isNotEmpty(userId)) {
 | 
			
		||||
            lambdaQueryWrapper.eq(TransportTripsTruckDriverEntity::getDriverId, userId);
 | 
			
		||||
        }
 | 
			
		||||
        return baseMapper.selectCount(lambdaQueryWrapper) == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 消除绑定关系
 | 
			
		||||
     * @param transportTripsId 车次ID
 | 
			
		||||
     * @param truckId 车辆ID
 | 
			
		||||
     */
 | 
			
		||||
    @Transactional
 | 
			
		||||
    @Override
 | 
			
		||||
    public void delete(Long transportTripsId, Long truckId) {
 | 
			
		||||
        // 删除车辆和车次关联关系
 | 
			
		||||
        LambdaQueryWrapper<TransportTripsTruckDriverEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        lambdaQueryWrapper.eq(ObjectUtils.isNotEmpty(transportTripsId), TransportTripsTruckDriverEntity::getTransportTripsId, transportTripsId)
 | 
			
		||||
        .eq(ObjectUtils.isNotEmpty(truckId), TransportTripsTruckDriverEntity::getTruckId, truckId);
 | 
			
		||||
        //清除关系
 | 
			
		||||
        baseMapper.delete(lambdaQueryWrapper);
 | 
			
		||||
 | 
			
		||||
        // 删除没有被调度的计划
 | 
			
		||||
        truckPlanCreateService.remove(Wrappers.<TruckPlanEntity>lambdaUpdate()
 | 
			
		||||
                .eq(ObjectUtils.isNotEmpty(transportTripsId), TruckPlanEntity::getTransportTripsId, transportTripsId)
 | 
			
		||||
                .eq(ObjectUtils.isNotEmpty(truckId), TruckPlanEntity::getTruckId, truckId)
 | 
			
		||||
                .eq(TruckPlanEntity::getScheduleStatus, TruckPlanScheduleStatusEnum.UNASSIGNED.getCode()));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,46 @@
 | 
			
		||||
package com.sl.ms.base.service.truck.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckEntity;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckLicenseEntity;
 | 
			
		||||
import com.sl.ms.base.mapper.truck.TruckLicenseMapper;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckLicenseService;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckService;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
import org.springframework.transaction.annotation.Transactional;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车辆行驶证表  服务类
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class TruckLicenseServiceImpl extends ServiceImpl<TruckLicenseMapper, TruckLicenseEntity> implements TruckLicenseService {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckService truckService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 保存车辆行驶证信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param truckLicenseEntity 车辆行驶证信息
 | 
			
		||||
     * @return 车辆行驶证信息
 | 
			
		||||
     */
 | 
			
		||||
    @Transactional
 | 
			
		||||
    @Override
 | 
			
		||||
    public TruckLicenseEntity saveTruckLicense(TruckLicenseEntity truckLicenseEntity) {
 | 
			
		||||
        if (truckLicenseEntity.getId() == null) {
 | 
			
		||||
            super.save(truckLicenseEntity);
 | 
			
		||||
            // 处理车辆信息中的关联字段
 | 
			
		||||
            if (ObjectUtil.isNotEmpty(truckLicenseEntity.getTruckId())) {
 | 
			
		||||
                TruckEntity truckEntity = truckService.getById(truckLicenseEntity.getTruckId());
 | 
			
		||||
                truckEntity.setTruckLicenseId(truckLicenseEntity.getId());
 | 
			
		||||
                truckService.updateById(truckEntity);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            super.updateById(truckLicenseEntity);
 | 
			
		||||
        }
 | 
			
		||||
        return truckLicenseEntity;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,177 @@
 | 
			
		||||
package com.sl.ms.base.service.truck.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.toolkit.SimpleQuery;
 | 
			
		||||
import com.sl.ms.base.domain.enums.TruckPlanScheduleStatusEnum;
 | 
			
		||||
import com.sl.ms.base.domain.enums.TruckPlanStatusEnum;
 | 
			
		||||
import com.sl.ms.base.domain.enums.TruckTripsPeriodEnum;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TransportTripsTruckDriverEntity;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckPlanEntity;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckTripsEntity;
 | 
			
		||||
import com.sl.ms.base.entity.user.TruckDriverEntity;
 | 
			
		||||
import com.sl.ms.base.mapper.truck.TruckPlanMapper;
 | 
			
		||||
import com.sl.ms.base.service.base.WorkSchedulingService;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckPlanCreateService;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckTripsService;
 | 
			
		||||
import com.sl.ms.base.service.user.TruckDriverService;
 | 
			
		||||
import com.sl.transport.common.exception.SLException;
 | 
			
		||||
import com.sl.transport.common.util.DateUtils;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.scheduling.annotation.Async;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.concurrent.CompletableFuture;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
@Service
 | 
			
		||||
@Slf4j
 | 
			
		||||
public class TruckPlanCreateServiceImpl extends ServiceImpl<TruckPlanMapper, TruckPlanEntity>
 | 
			
		||||
        implements TruckPlanCreateService {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckTripsService truckTripsService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private WorkSchedulingService workSchedulingService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckDriverService truckDriverService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建首次计划 首次关系后台新增 安排司机和车辆给车次时候触发
 | 
			
		||||
     *
 | 
			
		||||
     * @param truckPlanEntity 车辆计划
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void createPlan(TruckPlanEntity truckPlanEntity) {
 | 
			
		||||
        truckPlanEntity.setScheduleStatus(TruckPlanScheduleStatusEnum.UNASSIGNED.getCode());
 | 
			
		||||
 | 
			
		||||
        // 根据车次周期计算间隔天数
 | 
			
		||||
        TruckTripsEntity truckTripsEntity = truckTripsService.getById(truckPlanEntity.getTransportTripsId());
 | 
			
		||||
        // 计划发车时间 车次的发车时间 今日的分钟数
 | 
			
		||||
        LocalDateTime planDepartureTime = DateUtils.getStartTime(LocalDateTime.now()).plusMinutes(truckTripsEntity.getDepartureTime());
 | 
			
		||||
        truckPlanEntity.setPlanDepartureTime(planDepartureTime);
 | 
			
		||||
        // 计划到达时间
 | 
			
		||||
        LocalDateTime planArrivalTime = truckPlanEntity.getPlanDepartureTime().plusMinutes(truckTripsEntity.getEstimatedTime());
 | 
			
		||||
        truckPlanEntity.setPlanArrivalTime(planArrivalTime);
 | 
			
		||||
 | 
			
		||||
        // 排班
 | 
			
		||||
        List<TruckDriverEntity> truckDriverEntities = truckDriverService.findByTruckId(truckPlanEntity.getTruckId());
 | 
			
		||||
        List<Long> driverIds = truckDriverEntities.stream().map(TruckDriverEntity::getUserId).collect(Collectors.toList());
 | 
			
		||||
        List<Long> workingDrivers = workSchedulingService.getWorkingDrivers(driverIds, planDepartureTime, planArrivalTime);
 | 
			
		||||
        if (workingDrivers.size() < 2) {
 | 
			
		||||
            throw new SLException("车辆至少配置俩名上班的司机才能执行运输任务");
 | 
			
		||||
        }
 | 
			
		||||
        // 设置司机
 | 
			
		||||
        truckPlanEntity.setDriverIds(StrUtil.join(",", workingDrivers));
 | 
			
		||||
        // 插入一条新数据
 | 
			
		||||
        super.save(truckPlanEntity);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 异步创建下一次计划
 | 
			
		||||
     * 前一次计划完成触发
 | 
			
		||||
     *
 | 
			
		||||
     * @param truckId        车辆ID
 | 
			
		||||
     * @param driverIds      司机ID列表
 | 
			
		||||
     * @param currentOrganId 当前位置
 | 
			
		||||
     * @return 异步任务
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    @Async
 | 
			
		||||
    public CompletableFuture<String> createNextPlans(Long truckId, List<Long> driverIds, Long currentOrganId) {
 | 
			
		||||
        // 根据车辆ID获取车次IDs  如果解除了绑定 计划也会被弃用
 | 
			
		||||
        List<Long> transportTripsIds = SimpleQuery.list(
 | 
			
		||||
                Wrappers.<TransportTripsTruckDriverEntity>lambdaQuery().eq(TransportTripsTruckDriverEntity::getTruckId, truckId),
 | 
			
		||||
                TransportTripsTruckDriverEntity::getTransportTripsId);
 | 
			
		||||
        if (CollectionUtils.isEmpty(transportTripsIds)) {
 | 
			
		||||
            log.error("选举车次 车次不存在 truckId {} currentOrganId {}", truckId, currentOrganId);
 | 
			
		||||
            return CompletableFuture.completedFuture("ok");
 | 
			
		||||
        }
 | 
			
		||||
        // 创建所有车次的计划
 | 
			
		||||
        transportTripsIds.stream().distinct().forEach(v -> createNextPlan(truckId, driverIds, v));
 | 
			
		||||
        // 异步任务返回
 | 
			
		||||
        return CompletableFuture.completedFuture("ok");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建某个节点后续每条线路的计划
 | 
			
		||||
     *
 | 
			
		||||
     * @param truckId          车辆ID
 | 
			
		||||
     * @param driverIds        司机ID列表
 | 
			
		||||
     * @param transportTripsId 车次ID
 | 
			
		||||
     */
 | 
			
		||||
    private void createNextPlan(Long truckId, List<Long> driverIds, Long transportTripsId) {
 | 
			
		||||
        // 查询最新一条车次计划
 | 
			
		||||
        TruckPlanEntity last = getOne(Wrappers.<TruckPlanEntity>lambdaQuery()
 | 
			
		||||
                .eq(TruckPlanEntity::getTruckId, truckId)
 | 
			
		||||
                .eq(TruckPlanEntity::getTransportTripsId, transportTripsId)
 | 
			
		||||
                .orderByDesc(TruckPlanEntity::getPlanDepartureTime)
 | 
			
		||||
                // 1条
 | 
			
		||||
                .last("limit 1")
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        TruckPlanEntity truckPlanEntityNew = TruckPlanEntity.builder()
 | 
			
		||||
                // 车辆id
 | 
			
		||||
                .truckId(truckId)
 | 
			
		||||
                // 设置计划状态
 | 
			
		||||
                .status(TruckPlanStatusEnum.NORMAL.getCode())
 | 
			
		||||
                // 调度状态
 | 
			
		||||
                .scheduleStatus(TruckPlanScheduleStatusEnum.UNASSIGNED.getCode())
 | 
			
		||||
                // 车次id
 | 
			
		||||
                .transportTripsId(transportTripsId).build();
 | 
			
		||||
 | 
			
		||||
        // 根据车次周期计算间隔天数
 | 
			
		||||
        TruckTripsEntity truckTripsEntity = truckTripsService.getById(transportTripsId);
 | 
			
		||||
 | 
			
		||||
        // 最后的发车时间
 | 
			
		||||
        LocalDateTime prePlanDepartureTime = last.getPlanDepartureTime();
 | 
			
		||||
 | 
			
		||||
        // 计划发车时间
 | 
			
		||||
        LocalDateTime planDepartureTime;
 | 
			
		||||
        if (truckTripsEntity.getPeriod().equals(TruckTripsPeriodEnum.MONTH.getCode())) {
 | 
			
		||||
            // 周期为月的情况 循环直到是未来的时间
 | 
			
		||||
            planDepartureTime = prePlanDepartureTime.plusMonths(1);
 | 
			
		||||
            while (planDepartureTime.isBefore(LocalDateTime.now())) {
 | 
			
		||||
                planDepartureTime = prePlanDepartureTime.plusMonths(1);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            int day = truckTripsEntity.getPeriod().equals(TruckTripsPeriodEnum.WEEK.getCode()) ? 7 : 1;
 | 
			
		||||
            // 周期为周 / 日 的情况 循环直到是未来的时间
 | 
			
		||||
            planDepartureTime = prePlanDepartureTime.plusDays(day);
 | 
			
		||||
            while (planDepartureTime.isBefore(LocalDateTime.now())) {
 | 
			
		||||
                planDepartureTime = prePlanDepartureTime.plusDays(day);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        // 按照最新的车次时间设置计划发车时间
 | 
			
		||||
        LocalDateTime planDepartureTimeNew = DateUtils.getStartTime(planDepartureTime).plusMinutes(truckTripsEntity.getDepartureTime());
 | 
			
		||||
        truckPlanEntityNew.setPlanDepartureTime(planDepartureTimeNew);
 | 
			
		||||
 | 
			
		||||
        // 计划到达时间
 | 
			
		||||
        LocalDateTime planArrivalTime = planDepartureTime.plusMinutes(truckTripsEntity.getEstimatedTime());
 | 
			
		||||
        truckPlanEntityNew.setPlanArrivalTime(planArrivalTime);
 | 
			
		||||
 | 
			
		||||
        // 整合排班
 | 
			
		||||
        List<Long> workingDrivers = workSchedulingService.getWorkingDrivers(driverIds, planDepartureTime, planArrivalTime);
 | 
			
		||||
        // 设置司机
 | 
			
		||||
        truckPlanEntityNew.setDriverIds(StrUtil.join(",", workingDrivers));
 | 
			
		||||
 | 
			
		||||
        // 去重复
 | 
			
		||||
        long count = count(Wrappers.<TruckPlanEntity>lambdaQuery()
 | 
			
		||||
                        .eq(TruckPlanEntity::getTruckId, truckId)
 | 
			
		||||
//                .eq(TruckPlanEntity::getDriverId, driverId)
 | 
			
		||||
                        .eq(TruckPlanEntity::getTransportTripsId, transportTripsId)
 | 
			
		||||
                        .between(TruckPlanEntity::getPlanDepartureTime, truckPlanEntityNew.getPlanDepartureTime().minusMinutes(1), truckPlanEntityNew.getPlanDepartureTime().plusMinutes(1))
 | 
			
		||||
        );
 | 
			
		||||
        if (count == 0) {
 | 
			
		||||
            // 插入一条新数据
 | 
			
		||||
            super.save(truckPlanEntityNew);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,254 @@
 | 
			
		||||
package com.sl.ms.base.service.truck.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.toolkit.SimpleQuery;
 | 
			
		||||
import com.sl.ms.base.domain.enums.StatusEnum;
 | 
			
		||||
import com.sl.ms.base.domain.enums.TruckPlanScheduleStatusEnum;
 | 
			
		||||
import com.sl.ms.base.domain.enums.TruckPlanStatusEnum;
 | 
			
		||||
import com.sl.ms.base.domain.truck.OrganIdsDto;
 | 
			
		||||
import com.sl.ms.base.domain.truck.TruckDto;
 | 
			
		||||
import com.sl.ms.base.domain.truck.TruckPlanDto;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckEntity;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckPlanEntity;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckTripsEntity;
 | 
			
		||||
import com.sl.ms.base.entity.user.TruckDriverEntity;
 | 
			
		||||
import com.sl.ms.base.mapper.truck.TruckPlanMapper;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckPlanCreateService;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckPlanService;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckService;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckTripsService;
 | 
			
		||||
import com.sl.ms.base.service.user.TruckDriverService;
 | 
			
		||||
import com.sl.ms.transport.api.DispatchConfigurationFeign;
 | 
			
		||||
import com.sl.transport.common.exception.SLException;
 | 
			
		||||
import com.sl.transport.domain.DispatchConfigurationDTO;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
import org.springframework.transaction.annotation.Transactional;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.util.*;
 | 
			
		||||
import java.util.concurrent.CompletableFuture;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车次与车辆关联信息表 服务类
 | 
			
		||||
 */
 | 
			
		||||
@Slf4j
 | 
			
		||||
@Service
 | 
			
		||||
public class TruckPlanServiceImpl extends ServiceImpl<TruckPlanMapper, TruckPlanEntity>
 | 
			
		||||
        implements TruckPlanService {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    TruckService truckService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    TruckPlanCreateService truckPlanCreateService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    TruckTripsService truckTripsService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckDriverService truckDriverService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private DispatchConfigurationFeign dispatchConfigurationFeign;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取未分配运输任务的车次计划列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param shardTotal 总片数
 | 
			
		||||
     * @param shardIndex 分片
 | 
			
		||||
     * @return 未分配运输任务的车次计划列表
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<TruckPlanDto> pullUnassignedPlan(Integer shardTotal, Integer shardIndex) {
 | 
			
		||||
        //调度时间配置
 | 
			
		||||
        Integer dispatchTime = null;
 | 
			
		||||
        DispatchConfigurationDTO configuration = dispatchConfigurationFeign.findConfiguration();
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(configuration)) {
 | 
			
		||||
            dispatchTime = configuration.getDispatchTime();
 | 
			
		||||
        }
 | 
			
		||||
        int time = dispatchTime != null ? dispatchTime : 2;
 | 
			
		||||
 | 
			
		||||
        // 分片拉取 保证多个调度器均衡负载
 | 
			
		||||
        LambdaQueryWrapper<TruckPlanEntity> lambdaQueryWrapper = new LambdaQueryWrapper<TruckPlanEntity>()
 | 
			
		||||
                // 车辆状态是待分配
 | 
			
		||||
                .eq(TruckPlanEntity::getScheduleStatus, TruckPlanScheduleStatusEnum.UNASSIGNED.getCode())
 | 
			
		||||
                // 后俩小时之前
 | 
			
		||||
                .le(TruckPlanEntity::getPlanDepartureTime, LocalDateTime.now().plusHours(time))
 | 
			
		||||
                // 状态正常
 | 
			
		||||
                .eq(TruckPlanEntity::getStatus, TruckPlanStatusEnum.NORMAL.getCode())
 | 
			
		||||
                // ID取模分片
 | 
			
		||||
                .apply(" MOD(id, {0}) = {1}", shardTotal, shardIndex)
 | 
			
		||||
                // 增序
 | 
			
		||||
                .orderByAsc(TruckPlanEntity::getPlanDepartureTime)
 | 
			
		||||
                // 最多1000条
 | 
			
		||||
                .last("limit 1000");
 | 
			
		||||
        // 查询
 | 
			
		||||
        List<TruckPlanEntity> records = super.list(lambdaQueryWrapper);
 | 
			
		||||
        if (CollectionUtils.isEmpty(records)) {
 | 
			
		||||
            log.error("获取未分配运输任务的车次计划列表 暂无满足条件计划 shardTotal {} shardIndex {}", shardTotal, shardIndex);
 | 
			
		||||
            return new ArrayList<>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 补充数据
 | 
			
		||||
        List<TruckPlanDto> truckPlanDtos = toUnassignedDto(records, shardTotal, shardIndex);
 | 
			
		||||
        if (CollectionUtils.isEmpty(truckPlanDtos)) {
 | 
			
		||||
            return new ArrayList<>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 修改计划调度状态
 | 
			
		||||
        LambdaUpdateWrapper<TruckPlanEntity> updateWrapper = Wrappers.lambdaUpdate(TruckPlanEntity.class)
 | 
			
		||||
                // 设置为已分配
 | 
			
		||||
                .set(TruckPlanEntity::getScheduleStatus, TruckPlanScheduleStatusEnum.ASSIGNED.getCode())
 | 
			
		||||
                // 条件为待分配 保证不会因为同一shardIndex并发导致数据不一致
 | 
			
		||||
                .eq(TruckPlanEntity::getScheduleStatus, TruckPlanScheduleStatusEnum.UNASSIGNED.getCode())
 | 
			
		||||
                // 修改范围
 | 
			
		||||
                .in(TruckPlanEntity::getId, records.stream().map(TruckPlanEntity::getId).collect(Collectors.toSet()));
 | 
			
		||||
        // 修改
 | 
			
		||||
        if (update(updateWrapper)) {
 | 
			
		||||
            // 返回修改后的数据
 | 
			
		||||
            return truckPlanDtos;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return new ArrayList<>();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 转换结构
 | 
			
		||||
     *
 | 
			
		||||
     * @param records    计划数据
 | 
			
		||||
     * @param shardTotal 总片数
 | 
			
		||||
     * @param shardIndex 当前片数
 | 
			
		||||
     * @return 车辆计划DTO
 | 
			
		||||
     */
 | 
			
		||||
    private List<TruckPlanDto> toUnassignedDto(List<TruckPlanEntity> records, Integer shardTotal, Integer shardIndex) {
 | 
			
		||||
        // 转换为dto
 | 
			
		||||
        List<TruckPlanDto> truckPlanDtos = records.stream()
 | 
			
		||||
                .map(truckPlanEntity -> {
 | 
			
		||||
                    TruckPlanDto truckPlanDto = BeanUtil.toBean(truckPlanEntity, TruckPlanDto.class);
 | 
			
		||||
                    String[] split = truckPlanEntity.getDriverIds().split(",");
 | 
			
		||||
                    if (ObjectUtil.isEmpty(split)) {
 | 
			
		||||
                        List<Long> list = Arrays.stream(split).map(Long::valueOf).collect(Collectors.toList());
 | 
			
		||||
                        truckPlanDto.setDriverIds(list);
 | 
			
		||||
                    }
 | 
			
		||||
                    return truckPlanDto;
 | 
			
		||||
                })
 | 
			
		||||
                .collect(Collectors.toList());
 | 
			
		||||
 | 
			
		||||
        // 根据车辆ID查询车辆
 | 
			
		||||
        List<Long> truckIds = truckPlanDtos.parallelStream().map(TruckPlanDto::getTruckId).collect(Collectors.toList());
 | 
			
		||||
        Map<Long, TruckEntity> longTruckEntityMap = SimpleQuery.keyMap(
 | 
			
		||||
                Wrappers.<TruckEntity>lambdaQuery().in(TruckEntity::getId, truckIds),
 | 
			
		||||
                TruckEntity::getId);
 | 
			
		||||
        if (CollectionUtils.isEmpty(longTruckEntityMap)) {
 | 
			
		||||
            log.error("获取未分配运输任务的车次计划列表 暂无满足条件车辆 shardTotal {} shardIndex {}", shardTotal, shardIndex);
 | 
			
		||||
            return new ArrayList<>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 根据车次ID获取<车次ID,线路ID>map
 | 
			
		||||
        List<Long> transportTripsIds = truckPlanDtos.parallelStream().map(TruckPlanDto::getTransportTripsId).collect(Collectors.toList());
 | 
			
		||||
        Map<Long, Long> truckTripsLineMap = SimpleQuery.map(
 | 
			
		||||
                Wrappers.<TruckTripsEntity>lambdaQuery().in(TruckTripsEntity::getId, transportTripsIds),
 | 
			
		||||
                TruckTripsEntity::getId,
 | 
			
		||||
                TruckTripsEntity::getTransportLineId);
 | 
			
		||||
        if (CollectionUtils.isEmpty(truckTripsLineMap)) {
 | 
			
		||||
            log.error("获取未分配运输任务的车次计划列表 暂无满足条件线路 shardTotal {} shardIndex {}", shardTotal, shardIndex);
 | 
			
		||||
            return new ArrayList<>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 根据线路ID查询起始位置
 | 
			
		||||
        Map<Long, OrganIdsDto> organIdsMap = truckTripsService.getOrganIdsByTripsLineId(new HashSet<>(truckTripsLineMap.values()));
 | 
			
		||||
        if (CollectionUtils.isEmpty(organIdsMap)) {
 | 
			
		||||
            log.error("获取未分配运输任务的车次计划列表 远端暂无满足条件机构ids shardTotal {} shardIndex {}", shardTotal, shardIndex);
 | 
			
		||||
            return new ArrayList<>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 合并
 | 
			
		||||
        truckPlanDtos.parallelStream().forEach(v -> {
 | 
			
		||||
            // 车辆
 | 
			
		||||
            TruckEntity truckEntity = longTruckEntityMap.get(v.getTruckId());
 | 
			
		||||
            v.setTruckDto(BeanUtil.toBean(truckEntity, TruckDto.class));
 | 
			
		||||
            // 线路ID
 | 
			
		||||
            Long truckTripsLineId = truckTripsLineMap.get(v.getTransportTripsId());
 | 
			
		||||
            // 起始位置
 | 
			
		||||
            OrganIdsDto organIdsDto = organIdsMap.get(truckTripsLineId);
 | 
			
		||||
            v.setTransportLineId(truckTripsLineId);
 | 
			
		||||
            if (ObjectUtil.isNotEmpty(organIdsDto)) {
 | 
			
		||||
                BeanUtil.copyProperties(organIdsDto, v);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        return truckPlanDtos;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新计划状态为已调度 消费MQ更新调度状态
 | 
			
		||||
     *
 | 
			
		||||
     * @param planIds 计划ID
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void scheduledPlan(Set<Long> planIds) {
 | 
			
		||||
        // 修改计划调度状态
 | 
			
		||||
        LambdaUpdateWrapper<TruckPlanEntity> updateWrapper = Wrappers.lambdaUpdate(TruckPlanEntity.class)
 | 
			
		||||
                // 设置为已调度
 | 
			
		||||
                .set(TruckPlanEntity::getScheduleStatus, TruckPlanScheduleStatusEnum.SCHEDULED.getCode())
 | 
			
		||||
                // 条件为已分配
 | 
			
		||||
                .eq(TruckPlanEntity::getScheduleStatus, TruckPlanScheduleStatusEnum.ASSIGNED.getCode())
 | 
			
		||||
                // 修改范围
 | 
			
		||||
                .in(TruckPlanEntity::getId, planIds);
 | 
			
		||||
        // 修改
 | 
			
		||||
        update(updateWrapper);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 计划完成
 | 
			
		||||
     *
 | 
			
		||||
     * @param currentOrganId 结束机构id
 | 
			
		||||
     * @param planId         计划ID
 | 
			
		||||
     * @param truckId        车辆ID
 | 
			
		||||
     * @param statusEnum     车辆状态枚举
 | 
			
		||||
     */
 | 
			
		||||
    @Transactional
 | 
			
		||||
    @Override
 | 
			
		||||
    public void finishedPlan(Long currentOrganId, Long planId, Long truckId, StatusEnum statusEnum) {
 | 
			
		||||
        log.info("计划完成 currentOrganId {} planId {} ", currentOrganId, planId);
 | 
			
		||||
        TruckPlanEntity truckPlanEntity = getById(planId);
 | 
			
		||||
        if (ObjectUtil.isEmpty(truckPlanEntity)) {
 | 
			
		||||
            throw new SLException(StrUtil.format("计划不存在currentOrganId {} planId {} ", currentOrganId, planId));
 | 
			
		||||
        }
 | 
			
		||||
        // 本次计划完成
 | 
			
		||||
        truckPlanEntity.setStatus(TruckPlanStatusEnum.ARRIVED.getCode());
 | 
			
		||||
        boolean updateById = updateById(truckPlanEntity);
 | 
			
		||||
        if (!updateById) {
 | 
			
		||||
            log.error("更新计划状态失败 currentOrganId {} planId {} ", currentOrganId, planId);
 | 
			
		||||
            throw new SLException(StrUtil.format("更新计划状态失败currentOrganId {} planId {} ", currentOrganId, planId));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 设置车辆位置 可能回车登记的车辆 并不是计划中的车辆
 | 
			
		||||
        Boolean updateCurrentOrganId = truckService.updateCurrentOrganId(truckId, currentOrganId, statusEnum);
 | 
			
		||||
        if (!updateCurrentOrganId) {
 | 
			
		||||
            log.error("更新车辆位置失败 currentOrganId {} planId {} ", currentOrganId, planId);
 | 
			
		||||
            throw new SLException(StrUtil.format("更新车辆位置失败currentOrganId {} planId {} ", currentOrganId, planId));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 构建下一次计划 异步
 | 
			
		||||
        // 司机应该是和该车关联的所有司机
 | 
			
		||||
        List<TruckDriverEntity> truckDriverEntities = truckDriverService.findByTruckId(truckPlanEntity.getTruckId());
 | 
			
		||||
        List<Long> driverIds = truckDriverEntities.stream().map(TruckDriverEntity::getUserId).collect(Collectors.toList());
 | 
			
		||||
        CompletableFuture<String> nextPlans = truckPlanCreateService.createNextPlans(truckPlanEntity.getTruckId(), driverIds, currentOrganId);
 | 
			
		||||
        nextPlans.whenComplete((s, throwable) -> {
 | 
			
		||||
            if (!s.equals("ok")) {
 | 
			
		||||
                log.info("构建下一次计划 失败 truckPlanEntity {}", truckPlanEntity);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,111 @@
 | 
			
		||||
package com.sl.ms.base.service.truck.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import com.sl.ms.base.domain.truck.TruckReturnRegisterDTO;
 | 
			
		||||
import com.sl.ms.base.domain.truck.TruckReturnRegisterListDTO;
 | 
			
		||||
import com.sl.ms.base.domain.truck.TruckReturnRegisterPageQueryDTO;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckEntity;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckReturnRegisterEntity;
 | 
			
		||||
import com.sl.ms.base.mapper.truck.TruckReturnRegisterMapper;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckReturnRegisterService;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckService;
 | 
			
		||||
import com.sl.transport.common.exception.SLException;
 | 
			
		||||
import com.sl.transport.common.util.PageResponse;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 回车登记 服务类
 | 
			
		||||
 */
 | 
			
		||||
@Slf4j
 | 
			
		||||
@Service
 | 
			
		||||
public class TruckReturnRegisterServiceImpl extends ServiceImpl<TruckReturnRegisterMapper, TruckReturnRegisterEntity> implements TruckReturnRegisterService {
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckService truckService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分页查询回车登记列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param dto 分页查询条件
 | 
			
		||||
     * @return 回车登记分页结果
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public PageResponse<TruckReturnRegisterListDTO> pageQuery(TruckReturnRegisterPageQueryDTO dto) {
 | 
			
		||||
        //1. 构造分页查询条件
 | 
			
		||||
        Page<TruckReturnRegisterEntity> iPage = new Page<>(dto.getPage(), dto.getPageSize());
 | 
			
		||||
        LambdaQueryWrapper<TruckReturnRegisterEntity> queryWrapper = Wrappers.<TruckReturnRegisterEntity>lambdaQuery()
 | 
			
		||||
                .like(ObjectUtil.isNotEmpty(dto.getTransportTaskId()), TruckReturnRegisterEntity::getTransportTaskId, dto.getTransportTaskId())
 | 
			
		||||
                .in(ObjectUtil.isNotEmpty(dto.getTransportTaskIds()), TruckReturnRegisterEntity::getTransportTaskId, dto.getTransportTaskIds())
 | 
			
		||||
                .between(ObjectUtil.isNotEmpty(dto.getIntoStorageStartTime()), TruckReturnRegisterEntity::getIntoStorageTime, dto.getIntoStorageStartTime(), dto.getIntoStorageEndTime())
 | 
			
		||||
                .eq(ObjectUtil.isNotEmpty(dto.getIsAvailable()), TruckReturnRegisterEntity::getIsAvailable, dto.getIsAvailable())
 | 
			
		||||
                .orderByDesc(TruckReturnRegisterEntity::getIntoStorageTime);
 | 
			
		||||
 | 
			
		||||
        //2. 分页查询
 | 
			
		||||
        Page<TruckReturnRegisterEntity> returnRegisterEntityPage = this.page(iPage, queryWrapper);
 | 
			
		||||
 | 
			
		||||
        // 3.1 分页查询结果为空,直接返回
 | 
			
		||||
        if (ObjectUtil.isEmpty(returnRegisterEntityPage.getRecords())) {
 | 
			
		||||
            return new PageResponse<>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 3.2 分页查询结果不为空,封装返回数据
 | 
			
		||||
        List<TruckReturnRegisterListDTO> list = this.convertEntity2ListDTO(returnRegisterEntityPage.getRecords());
 | 
			
		||||
 | 
			
		||||
        // 4. 封装分页对象
 | 
			
		||||
        return PageResponse.<TruckReturnRegisterListDTO>builder()
 | 
			
		||||
                .page(dto.getPage())
 | 
			
		||||
                .pageSize(dto.getPageSize())
 | 
			
		||||
                .pages(returnRegisterEntityPage.getPages())
 | 
			
		||||
                .counts(returnRegisterEntityPage.getTotal())
 | 
			
		||||
                .items(list)
 | 
			
		||||
                .build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 回车登记实体类转换为TruckReturnRegisterListDTO
 | 
			
		||||
     *
 | 
			
		||||
     * @param returnRegisterEntities 实体类
 | 
			
		||||
     * @return 分页结果列表
 | 
			
		||||
     */
 | 
			
		||||
    private List<TruckReturnRegisterListDTO> convertEntity2ListDTO(List<TruckReturnRegisterEntity> returnRegisterEntities) {
 | 
			
		||||
        //先根据id批量查询车辆信息
 | 
			
		||||
        List<Long> truckIds = returnRegisterEntities.stream().map(TruckReturnRegisterEntity::getTruckId).collect(Collectors.toList());
 | 
			
		||||
        List<TruckEntity> truckEntities = truckService.listByIds(truckIds);
 | 
			
		||||
        return returnRegisterEntities.stream().map(entity -> {
 | 
			
		||||
            //根据id查询车辆
 | 
			
		||||
            Optional<TruckEntity> optional = truckEntities.stream().filter(item -> item.getId().equals(entity.getTruckId())).findFirst();
 | 
			
		||||
            if (optional.isEmpty()) {
 | 
			
		||||
                throw new SLException("id为:" + entity.getTruckId() + "车辆不存在!");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            //封装回车登记列表数据
 | 
			
		||||
            TruckReturnRegisterListDTO truckReturnRegisterListDTO = BeanUtil.toBean(entity, TruckReturnRegisterListDTO.class);
 | 
			
		||||
            truckReturnRegisterListDTO.setLicensePlate(optional.get().getLicensePlate());
 | 
			
		||||
            return truckReturnRegisterListDTO;
 | 
			
		||||
        }).collect(Collectors.toList());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据id查询回车登记详情
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 回车登记id
 | 
			
		||||
     * @return 回车登记详情
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public TruckReturnRegisterDTO findById(Long id) {
 | 
			
		||||
        TruckReturnRegisterEntity entity = this.getById(id);
 | 
			
		||||
        return BeanUtil.toBean(entity, TruckReturnRegisterDTO.class);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,235 @@
 | 
			
		||||
package com.sl.ms.base.service.truck.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.toolkit.SimpleQuery;
 | 
			
		||||
import com.sl.ms.base.domain.enums.StatusEnum;
 | 
			
		||||
import com.sl.ms.base.domain.enums.TruckRunStatusEnum;
 | 
			
		||||
import com.sl.ms.base.domain.enums.TruckWorkStatusEnum;
 | 
			
		||||
import com.sl.ms.base.domain.enums.WorkUserTypeEnum;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkSchedulingEntity;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TransportTripsTruckDriverEntity;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckEntity;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckLicenseEntity;
 | 
			
		||||
import com.sl.ms.base.entity.user.TruckDriverEntity;
 | 
			
		||||
import com.sl.ms.base.mapper.truck.TruckMapper;
 | 
			
		||||
import com.sl.ms.base.service.base.WorkSchedulingService;
 | 
			
		||||
import com.sl.ms.base.service.truck.TransportTripsTruckDriverService;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckLicenseService;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckService;
 | 
			
		||||
import com.sl.ms.base.service.user.TruckDriverService;
 | 
			
		||||
import com.sl.transport.common.exception.SLException;
 | 
			
		||||
import com.sl.ms.base.domain.constants.TruckConstant;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车辆信息表 服务类
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class TruckServiceImpl extends ServiceImpl<TruckMapper, TruckEntity> implements TruckService {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckDriverService truckDriverService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private WorkSchedulingService workSchedulingService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckLicenseService truckLicenseService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TransportTripsTruckDriverService transportTripsTruckDriverService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取车辆分页数据
 | 
			
		||||
     *
 | 
			
		||||
     * @param page         页码
 | 
			
		||||
     * @param pageSize     页尺寸
 | 
			
		||||
     * @param truckTypeId  车辆类型id
 | 
			
		||||
     * @param status       状态
 | 
			
		||||
     * @param licensePlate 车辆号牌
 | 
			
		||||
     * @return 线路类型分页数据
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public IPage<TruckEntity> findByPage(Integer page, Integer pageSize, Long truckTypeId, Integer status, String licensePlate) {
 | 
			
		||||
        Page<TruckEntity> iPage = new Page<>(page, pageSize);
 | 
			
		||||
        LambdaQueryWrapper<TruckEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        if (StrUtil.isNotEmpty(licensePlate)) {
 | 
			
		||||
            lambdaQueryWrapper.like(TruckEntity::getLicensePlate, licensePlate);
 | 
			
		||||
        }
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(truckTypeId)) {
 | 
			
		||||
            lambdaQueryWrapper.eq(TruckEntity::getTruckTypeId, truckTypeId);
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(status)) {
 | 
			
		||||
            lambdaQueryWrapper.eq(TruckEntity::getWorkStatus, status);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        lambdaQueryWrapper.orderByDesc(TruckEntity::getCreated);
 | 
			
		||||
        return super.page(iPage, lambdaQueryWrapper);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取车辆列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param ids 车辆id列表
 | 
			
		||||
     * @return 车辆列表
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<TruckEntity> findAll(List<Long> ids) {
 | 
			
		||||
        LambdaQueryWrapper<TruckEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        if (CollUtil.isNotEmpty(ids)) {
 | 
			
		||||
            lambdaQueryWrapper.in(TruckEntity::getId, ids);
 | 
			
		||||
        }
 | 
			
		||||
        lambdaQueryWrapper.eq(TruckEntity::getStatus, StatusEnum.NORMAL.getCode());
 | 
			
		||||
        lambdaQueryWrapper.orderByDesc(TruckEntity::getCreated);
 | 
			
		||||
        return super.list(lambdaQueryWrapper);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 禁用车辆
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 车辆ID
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void stopById(Long id) {
 | 
			
		||||
        // 车次绑定 运输任务检查
 | 
			
		||||
        List<TransportTripsTruckDriverEntity> all = transportTripsTruckDriverService.findAll(null, id, null);
 | 
			
		||||
        if (all.size() > 0) {
 | 
			
		||||
            throw new SLException("请先解除车次绑定关系");
 | 
			
		||||
        }
 | 
			
		||||
        TruckEntity truckEntity = new TruckEntity();
 | 
			
		||||
        truckEntity.setId(id);
 | 
			
		||||
        truckEntity.setWorkStatus(TruckWorkStatusEnum.STOP.getCode());
 | 
			
		||||
        // 解除司机绑定
 | 
			
		||||
        truckDriverService.disableTruckId(id);
 | 
			
		||||
        super.updateById(truckEntity);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新车辆状态
 | 
			
		||||
     *
 | 
			
		||||
     * @param id     车辆ID
 | 
			
		||||
     * @param status 车辆状态
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void updateRunStatus(Long id, TruckRunStatusEnum status) {
 | 
			
		||||
        TruckEntity truckEntity = new TruckEntity();
 | 
			
		||||
        truckEntity.setId(id);
 | 
			
		||||
        truckEntity.setRunStatus(status.getCode());
 | 
			
		||||
        super.updateById(truckEntity);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新当前位置
 | 
			
		||||
     *
 | 
			
		||||
     * @param truckId        车辆ID
 | 
			
		||||
     * @param currentOrganId 当前机构ID
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public Boolean updateCurrentOrganId(Long truckId, Long currentOrganId, StatusEnum statusEnum) {
 | 
			
		||||
        UpdateWrapper<TruckEntity> wrapper = new UpdateWrapper<>();
 | 
			
		||||
 | 
			
		||||
        wrapper.lambda()
 | 
			
		||||
                // 更新位置
 | 
			
		||||
                .set(TruckEntity::getCurrentOrganId, currentOrganId)
 | 
			
		||||
                // 更新车辆状态
 | 
			
		||||
                .set(TruckEntity::getRunStatus, TruckRunStatusEnum.ARRIVED.getCode())
 | 
			
		||||
                // 禁用状态
 | 
			
		||||
                .set(TruckEntity::getStatus, statusEnum.getCode())
 | 
			
		||||
                .eq(TruckEntity::getId, truckId);
 | 
			
		||||
        return super.update(wrapper);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 启用
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 车辆ID
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void workedById(Long id) {
 | 
			
		||||
        // 车辆信息完整 行驶证照片必须有
 | 
			
		||||
        TruckEntity truckEntity = getById(id);
 | 
			
		||||
        if (ObjectUtil.isEmpty(truckEntity) || ObjectUtil.isEmpty(truckEntity.getTruckLicenseId())) {
 | 
			
		||||
            throw new SLException("车辆行驶证不存在");
 | 
			
		||||
        }
 | 
			
		||||
        TruckLicenseEntity truckLicenseEntity = truckLicenseService.getById(truckEntity.getTruckLicenseId());
 | 
			
		||||
        if (ObjectUtil.isEmpty(truckLicenseEntity) || ObjectUtil.isEmpty(truckLicenseEntity.getPicture())) {
 | 
			
		||||
            throw new SLException("请上传行驶证照片");
 | 
			
		||||
        }
 | 
			
		||||
        // 检查司机绑定关系 有司机2个
 | 
			
		||||
        List<TruckDriverEntity> driverEntities = truckDriverService.findByTruckId(id);
 | 
			
		||||
        if (CollUtil.isEmpty(driverEntities) || driverEntities.size() < 2) {
 | 
			
		||||
            throw new SLException(StrUtil.format("请先绑定2个司机"));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        List<Long> drivers = driverEntities.parallelStream().map(TruckDriverEntity::getUserId).collect(Collectors.toList());
 | 
			
		||||
        // 有排班才可以启用
 | 
			
		||||
        long count = workSchedulingService.count(
 | 
			
		||||
                Wrappers.<WorkSchedulingEntity>lambdaQuery()
 | 
			
		||||
                        .in(WorkSchedulingEntity::getUserId, drivers)
 | 
			
		||||
                        .eq(WorkSchedulingEntity::getIsDelete, 0)
 | 
			
		||||
                        .eq(WorkSchedulingEntity::getUserType, WorkUserTypeEnum.DRIVER.getCode()));
 | 
			
		||||
        if (count < 2) {
 | 
			
		||||
            throw new SLException(StrUtil.format("请先为司机安排排班"));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        truckEntity.setWorkStatus(TruckWorkStatusEnum.WORKING.getCode());
 | 
			
		||||
        super.updateById(truckEntity);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 状态分组统计
 | 
			
		||||
     *
 | 
			
		||||
     * @return 统计车辆信息
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public Map<Integer, Long> groupByStatus() {
 | 
			
		||||
        return SimpleQuery.group(Wrappers.lambdaQuery(), TruckEntity::getWorkStatus, Collectors.counting());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 删除
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 车辆ID
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void del(Long id) {
 | 
			
		||||
        // 检查司机绑定关系
 | 
			
		||||
        List<TruckDriverEntity> driverEntities = truckDriverService.findByTruckId(id);
 | 
			
		||||
        if (CollUtil.isNotEmpty(driverEntities)) {
 | 
			
		||||
            throw new SLException(StrUtil.format("请先解绑该车辆下绑定的司机"));
 | 
			
		||||
        }
 | 
			
		||||
        TruckEntity truckEntity = new TruckEntity();
 | 
			
		||||
        truckEntity.setStatus(TruckConstant.DATA_DISABLE_STATUS);
 | 
			
		||||
        updateById(truckEntity);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 车型数量
 | 
			
		||||
     *
 | 
			
		||||
     * @param typeId 车辆类型ID
 | 
			
		||||
     * @return 该车型下的车辆数量
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public Integer countByType(Long typeId) {
 | 
			
		||||
        return SimpleQuery.list(
 | 
			
		||||
                Wrappers.<TruckEntity>lambdaQuery()
 | 
			
		||||
                        .eq(TruckEntity::getTruckTypeId, typeId)
 | 
			
		||||
                        .eq(TruckEntity::getStatus, StatusEnum.NORMAL.getCode()),
 | 
			
		||||
                TruckEntity::getId).size();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,95 @@
 | 
			
		||||
package com.sl.ms.base.service.truck.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import com.sl.ms.base.domain.truck.OrganIdsDto;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckTripsEntity;
 | 
			
		||||
import com.sl.ms.base.mapper.truck.TruckTripsMapper;
 | 
			
		||||
import com.sl.ms.base.service.truck.TransportTripsTruckDriverService;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckTripsService;
 | 
			
		||||
import com.sl.ms.transport.api.TransportLineFeign;
 | 
			
		||||
import com.sl.transport.common.exception.SLException;
 | 
			
		||||
import com.sl.ms.base.domain.constants.TruckConstant;
 | 
			
		||||
import com.sl.transport.domain.TransportLineDTO;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车次信息表 服务类
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class TruckTripsServiceImpl extends ServiceImpl<TruckTripsMapper, TruckTripsEntity> implements TruckTripsService {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    TransportLineFeign transportLineFeign;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TransportTripsTruckDriverService transportTripsTruckDriverService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取车次列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param transportLineId 线路id
 | 
			
		||||
     * @param ids             车次id列表
 | 
			
		||||
     * @return 车次列表
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<TruckTripsEntity> findAll(Long transportLineId, List<Long> ids) {
 | 
			
		||||
        LambdaQueryWrapper<TruckTripsEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(transportLineId)) {
 | 
			
		||||
            lambdaQueryWrapper.eq(TruckTripsEntity::getTransportLineId, transportLineId);
 | 
			
		||||
        }
 | 
			
		||||
        if (CollUtil.isNotEmpty(ids)) {
 | 
			
		||||
            lambdaQueryWrapper.in(TruckTripsEntity::getId, ids);
 | 
			
		||||
        }
 | 
			
		||||
        lambdaQueryWrapper.orderByDesc(TruckTripsEntity::getCreated);
 | 
			
		||||
        lambdaQueryWrapper.eq(TruckTripsEntity::getStatus, TruckConstant.DATA_DEFAULT_STATUS);
 | 
			
		||||
        return super.list(lambdaQueryWrapper);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 删除车次
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 车次ID
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void disable(Long id) {
 | 
			
		||||
        // 检查车次绑定关系
 | 
			
		||||
        Boolean remove = transportTripsTruckDriverService.canRemove(id, null, null);
 | 
			
		||||
        if (!remove) {
 | 
			
		||||
            throw new SLException("该车次下存在绑定车辆,请先解除绑定后删除");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TruckTripsEntity truckTripsEntity = new TruckTripsEntity();
 | 
			
		||||
        truckTripsEntity.setId(id);
 | 
			
		||||
        truckTripsEntity.setStatus(TruckConstant.DATA_DISABLE_STATUS);
 | 
			
		||||
        baseMapper.updateById(truckTripsEntity);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据线路ID查询机构
 | 
			
		||||
     * @param values 线路ID
 | 
			
		||||
     * @return 机构信息
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public Map<Long, OrganIdsDto> getOrganIdsByTripsLineId(HashSet<Long> values) {
 | 
			
		||||
        HashMap<Long, OrganIdsDto> hashMap = new HashMap<>();
 | 
			
		||||
        List<TransportLineDTO> listR = transportLineFeign.queryByIds(values.toArray(Long[]::new));
 | 
			
		||||
 | 
			
		||||
        listR.forEach(v -> {
 | 
			
		||||
            OrganIdsDto organIdsDto = new OrganIdsDto();
 | 
			
		||||
            organIdsDto.setStartOrganId(v.getStartOrganId());
 | 
			
		||||
            organIdsDto.setEndOrganId(v.getEndOrganId());
 | 
			
		||||
            hashMap.put(v.getId(), organIdsDto);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        return hashMap;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,62 @@
 | 
			
		||||
package com.sl.ms.base.service.truck.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckTypeGoodsTypeEntity;
 | 
			
		||||
import com.sl.ms.base.mapper.truck.TruckTypeGoodsTypeMapper;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckTypeGoodsTypeService;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车辆类型与货物类型关联表 服务实现类
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class TruckTypeGoodsTypeServiceImpl extends ServiceImpl<TruckTypeGoodsTypeMapper, TruckTypeGoodsTypeEntity>
 | 
			
		||||
        implements TruckTypeGoodsTypeService {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 删除关联关系
 | 
			
		||||
     *
 | 
			
		||||
     * @param truckTypeId 车辆类型id
 | 
			
		||||
     * @param goodsTypeId 货物类型id
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void delete(Long truckTypeId, Long goodsTypeId) {
 | 
			
		||||
        LambdaQueryWrapper<TruckTypeGoodsTypeEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        boolean canExecute = false;
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(truckTypeId)) {
 | 
			
		||||
            lambdaQueryWrapper.eq(TruckTypeGoodsTypeEntity::getTruckTypeId, truckTypeId);
 | 
			
		||||
            canExecute = true;
 | 
			
		||||
        }
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(goodsTypeId)) {
 | 
			
		||||
            lambdaQueryWrapper.eq(TruckTypeGoodsTypeEntity::getGoodsTypeId, goodsTypeId);
 | 
			
		||||
            canExecute = true;
 | 
			
		||||
        }
 | 
			
		||||
        if (canExecute) {
 | 
			
		||||
            super.remove(lambdaQueryWrapper);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取车辆类型与货物类型关联
 | 
			
		||||
     *
 | 
			
		||||
     * @param truckTypeId 车辆类型id
 | 
			
		||||
     * @param goodsTypeId 货物类型id
 | 
			
		||||
     * @return 车辆类型与货物类型关联
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<TruckTypeGoodsTypeEntity> findAll(Long truckTypeId, Long goodsTypeId) {
 | 
			
		||||
        LambdaQueryWrapper<TruckTypeGoodsTypeEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(truckTypeId)) {
 | 
			
		||||
            lambdaQueryWrapper.eq(TruckTypeGoodsTypeEntity::getTruckTypeId, truckTypeId);
 | 
			
		||||
        }
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(goodsTypeId)) {
 | 
			
		||||
            lambdaQueryWrapper.eq(TruckTypeGoodsTypeEntity::getGoodsTypeId, goodsTypeId);
 | 
			
		||||
        }
 | 
			
		||||
        return super.list(lambdaQueryWrapper);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,111 @@
 | 
			
		||||
package com.sl.ms.base.service.truck.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import cn.hutool.core.text.CharSequenceUtil;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckEntity;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckTypeEntity;
 | 
			
		||||
import com.sl.ms.base.mapper.truck.TruckTypeMapper;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckService;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckTypeService;
 | 
			
		||||
import com.sl.transport.common.exception.SLException;
 | 
			
		||||
import com.sl.ms.base.domain.constants.TruckConstant;
 | 
			
		||||
import com.sl.transport.common.util.ObjectUtil;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 车辆类型表 服务实现类
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class TruckTypeServiceImpl extends ServiceImpl<TruckTypeMapper, TruckTypeEntity>
 | 
			
		||||
        implements TruckTypeService {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private TruckService truckService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取车辆类型分页数据
 | 
			
		||||
     *
 | 
			
		||||
     * @param page               页码
 | 
			
		||||
     * @param pageSize           页尺寸
 | 
			
		||||
     * @param name               车辆类型名称
 | 
			
		||||
     * @param minAllowableLoad   车辆载重最小值(闭区间)
 | 
			
		||||
     * @param maxAllowableLoad   车辆载重最大值(开区间)
 | 
			
		||||
     * @param minAllowableVolume 车辆体积最小值(闭区间)
 | 
			
		||||
     * @param maxAllowableVolume 车辆体积最小值(开区间)
 | 
			
		||||
     * @param id                 车型id
 | 
			
		||||
     * @return 车辆类型分页数据
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public IPage<TruckTypeEntity> findByPage(Integer page, Integer pageSize, String name, BigDecimal minAllowableLoad, BigDecimal maxAllowableLoad, BigDecimal minAllowableVolume, BigDecimal maxAllowableVolume, Long id) {
 | 
			
		||||
        Page<TruckTypeEntity> iPage = new Page<>(page, pageSize);
 | 
			
		||||
        LambdaQueryWrapper<TruckTypeEntity> lambdaQueryWrapper = Wrappers.<TruckTypeEntity>lambdaQuery()
 | 
			
		||||
                .like(CharSequenceUtil.isNotBlank(name), TruckTypeEntity::getName, name)
 | 
			
		||||
                .like(ObjectUtil.isNotEmpty(id), TruckTypeEntity::getId, id)
 | 
			
		||||
                .ge(ObjectUtil.isNotEmpty(minAllowableLoad),TruckTypeEntity::getAllowableLoad, minAllowableLoad)
 | 
			
		||||
                .lt(ObjectUtil.isNotEmpty(maxAllowableLoad),TruckTypeEntity::getAllowableLoad, maxAllowableLoad)
 | 
			
		||||
                .ge(ObjectUtil.isNotEmpty(minAllowableVolume),TruckTypeEntity::getAllowableVolume, minAllowableVolume)
 | 
			
		||||
                .lt(ObjectUtil.isNotEmpty(maxAllowableVolume),TruckTypeEntity::getAllowableVolume, maxAllowableVolume)
 | 
			
		||||
                .eq(TruckTypeEntity::getStatus, TruckConstant.DATA_DEFAULT_STATUS)
 | 
			
		||||
                .orderByDesc(TruckTypeEntity::getCreated);
 | 
			
		||||
        return super.page(iPage, lambdaQueryWrapper);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取车辆类型列表
 | 
			
		||||
     *
 | 
			
		||||
     * @return 车辆类型列表
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<TruckTypeEntity> findAll(List<Long> ids) {
 | 
			
		||||
        LambdaQueryWrapper<TruckTypeEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        if (CollUtil.isNotEmpty(ids)) {
 | 
			
		||||
            lambdaQueryWrapper.in(TruckTypeEntity::getId, ids);
 | 
			
		||||
        }
 | 
			
		||||
        lambdaQueryWrapper.eq(TruckTypeEntity::getStatus, TruckConstant.DATA_DEFAULT_STATUS);
 | 
			
		||||
        return super.list(lambdaQueryWrapper);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 删除车辆类型
 | 
			
		||||
     *
 | 
			
		||||
     * @param id 车型ID
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void disable(Long id) {
 | 
			
		||||
        Long count = truckService.getBaseMapper().selectCount(Wrappers.<TruckEntity>lambdaQuery().eq(TruckEntity::getTruckTypeId, id));
 | 
			
		||||
        if (count > 0) {
 | 
			
		||||
            throw new SLException(StrUtil.format("车型中有使用的车辆,不可以删除 >>> msg = {}", id));
 | 
			
		||||
        }
 | 
			
		||||
        TruckTypeEntity truckType = new TruckTypeEntity();
 | 
			
		||||
        truckType.setId(id);
 | 
			
		||||
        truckType.setStatus(TruckConstant.DATA_DISABLE_STATUS);
 | 
			
		||||
        updateById(truckType);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取map类型车辆类型数据集合
 | 
			
		||||
     *
 | 
			
		||||
     * @param truckTypeSet 车辆类型id列表
 | 
			
		||||
     * @return 执行结果
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public Map<Long, TruckTypeEntity> truckTypeMap(Set<Long> truckTypeSet) {
 | 
			
		||||
        List<TruckTypeEntity> truckTypeDtoList = findAll(new ArrayList<>(truckTypeSet));
 | 
			
		||||
        return truckTypeDtoList.stream().collect(Collectors.toMap(TruckTypeEntity::getId, vo -> vo));
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,18 @@
 | 
			
		||||
package com.sl.ms.base.service.user;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import com.sl.ms.base.entity.user.TruckDriverLicenseEntity;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 司机驾驶证表  服务类
 | 
			
		||||
 */
 | 
			
		||||
public interface TruckDriverLicenseService extends IService<TruckDriverLicenseEntity> {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取司机驾驶证信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param userId 司机id
 | 
			
		||||
     * @return 司机驾驶证信息
 | 
			
		||||
     */
 | 
			
		||||
    TruckDriverLicenseEntity findOne(Long userId);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,63 @@
 | 
			
		||||
package com.sl.ms.base.service.user;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
import com.sl.ms.base.domain.user.TruckDriverDto;
 | 
			
		||||
import com.sl.ms.base.entity.user.TruckDriverEntity;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 司机表 服务类
 | 
			
		||||
 */
 | 
			
		||||
public interface TruckDriverService extends IService<TruckDriverEntity> {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取司机基本信息列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param userIds 司机id列表
 | 
			
		||||
     * @return 司机基本信息列表
 | 
			
		||||
     */
 | 
			
		||||
    List<TruckDriverEntity> findAll(List<Long> userIds);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取司机基本信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param userId 司机id
 | 
			
		||||
     * @return 司机基本信息
 | 
			
		||||
     */
 | 
			
		||||
    TruckDriverEntity findOne(Long userId);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 绑定司机列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param truckId 车辆id
 | 
			
		||||
     * @return 司机数量
 | 
			
		||||
     */
 | 
			
		||||
    List<TruckDriverEntity> findByTruckId(Long truckId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取司机分页数据
 | 
			
		||||
     *
 | 
			
		||||
     * @param page     页码
 | 
			
		||||
     * @param pageSize 页尺寸
 | 
			
		||||
     * @return 司机分页数据
 | 
			
		||||
     */
 | 
			
		||||
    IPage<TruckDriverEntity> findByPage(Integer page, Integer pageSize);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 解除车辆和司机的绑定关系
 | 
			
		||||
     *
 | 
			
		||||
     * @param truckId 车辆ID
 | 
			
		||||
     */
 | 
			
		||||
    void disableTruckId(Long truckId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 保存
 | 
			
		||||
     *
 | 
			
		||||
     * @param dto 司机
 | 
			
		||||
     * @return 司机
 | 
			
		||||
     */
 | 
			
		||||
    TruckDriverDto saveDriver(TruckDriverDto dto);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,32 @@
 | 
			
		||||
package com.sl.ms.base.service.user.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import com.sl.ms.base.entity.user.TruckDriverLicenseEntity;
 | 
			
		||||
import com.sl.ms.base.mapper.user.TruckDriverLicenseMapper;
 | 
			
		||||
import com.sl.ms.base.service.user.TruckDriverLicenseService;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 司机驾驶证
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class TruckDriverLicenseServiceImpl extends ServiceImpl<TruckDriverLicenseMapper, TruckDriverLicenseEntity>
 | 
			
		||||
        implements TruckDriverLicenseService {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取司机驾驶证信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param userId 司机id
 | 
			
		||||
     * @return 司机驾驶证信息
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public TruckDriverLicenseEntity findOne(Long userId) {
 | 
			
		||||
        LambdaQueryWrapper<TruckDriverLicenseEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(userId)) {
 | 
			
		||||
            lambdaQueryWrapper.eq(TruckDriverLicenseEntity::getUserId, userId);
 | 
			
		||||
        }
 | 
			
		||||
        return super.getOne(lambdaQueryWrapper);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,162 @@
 | 
			
		||||
package com.sl.ms.base.service.user.impl;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import com.sl.ms.base.domain.user.TruckDriverDto;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TransportTripsTruckDriverEntity;
 | 
			
		||||
import com.sl.ms.base.entity.truck.TruckTripsEntity;
 | 
			
		||||
import com.sl.ms.base.entity.user.TruckDriverEntity;
 | 
			
		||||
import com.sl.ms.base.mapper.user.TruckDriverMapper;
 | 
			
		||||
import com.sl.ms.base.service.truck.TransportTripsTruckDriverService;
 | 
			
		||||
import com.sl.ms.base.service.truck.TruckTripsService;
 | 
			
		||||
import com.sl.ms.base.service.user.TruckDriverService;
 | 
			
		||||
import com.sl.ms.transport.api.TransportLineFeign;
 | 
			
		||||
import com.sl.transport.common.exception.SLException;
 | 
			
		||||
import com.sl.transport.domain.TransportLineDTO;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 司机相关业务
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class TruckDriverServiceImpl extends ServiceImpl<TruckDriverMapper, TruckDriverEntity>
 | 
			
		||||
        implements TruckDriverService {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TransportTripsTruckDriverService transportTripsTruckDriverService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TransportLineFeign transportLineFeign;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TruckTripsService truckTripsService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取司机基本信息列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param userIds 司机id列表
 | 
			
		||||
     * @return 司机基本信息列表
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<TruckDriverEntity> findAll(List<Long> userIds) {
 | 
			
		||||
        if (ObjectUtil.isAllEmpty(userIds)) {
 | 
			
		||||
            return Collections.emptyList();
 | 
			
		||||
        }
 | 
			
		||||
        LambdaQueryWrapper<TruckDriverEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        if (CollUtil.isNotEmpty(userIds)) {
 | 
			
		||||
            lambdaQueryWrapper.in(TruckDriverEntity::getUserId, userIds);
 | 
			
		||||
        }
 | 
			
		||||
        lambdaQueryWrapper.orderByDesc(TruckDriverEntity::getCreated);
 | 
			
		||||
        return super.list(lambdaQueryWrapper);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取司机基本信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param userId 司机id
 | 
			
		||||
     * @return 司机基本信息
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public TruckDriverEntity findOne(Long userId) {
 | 
			
		||||
        LambdaQueryWrapper<TruckDriverEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        lambdaQueryWrapper.eq(TruckDriverEntity::getUserId, userId);
 | 
			
		||||
        return super.getOne(lambdaQueryWrapper);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 绑定司机列表
 | 
			
		||||
     *
 | 
			
		||||
 | 
			
		||||
     * @return 司机数量
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<TruckDriverEntity> findByTruckId(Long truckId) {
 | 
			
		||||
        LambdaQueryWrapper<TruckDriverEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        lambdaQueryWrapper.eq(TruckDriverEntity::getTruckId,truckId);
 | 
			
		||||
        return list(lambdaQueryWrapper);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 解除车辆和司机的绑定关系
 | 
			
		||||
     * @param truckId 车辆ID
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void disableTruckId(Long truckId) {
 | 
			
		||||
        LambdaUpdateWrapper<TruckDriverEntity> lambdaQueryWrapper = new LambdaUpdateWrapper<>();
 | 
			
		||||
        lambdaQueryWrapper.eq(TruckDriverEntity::getTruckId,truckId)
 | 
			
		||||
                .set(TruckDriverEntity::getTruckId, null);
 | 
			
		||||
        update(lambdaQueryWrapper);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 保存
 | 
			
		||||
     * @param dto 司机
 | 
			
		||||
     * @return 保存结果
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public TruckDriverDto saveDriver(TruckDriverDto dto) {
 | 
			
		||||
 | 
			
		||||
        TruckDriverEntity driver = BeanUtil.toBean(dto, TruckDriverEntity.class);
 | 
			
		||||
        TruckDriverEntity one = findOne(dto.getUserId());
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(one)) {
 | 
			
		||||
            // 检查是否能够解除原有绑定车辆
 | 
			
		||||
            checkCanBingingTruck(one);
 | 
			
		||||
            driver.setId(one.getId());
 | 
			
		||||
            updateById(driver);
 | 
			
		||||
        } else {
 | 
			
		||||
            save(driver);
 | 
			
		||||
        }
 | 
			
		||||
        BeanUtil.copyProperties(driver, dto);
 | 
			
		||||
        return dto;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * check 是否有车次绑定关系
 | 
			
		||||
     * @param oldDriver 旧数据
 | 
			
		||||
     */
 | 
			
		||||
    private void checkCanBingingTruck(TruckDriverEntity oldDriver) {
 | 
			
		||||
        // 如果原有绑定车辆不为空 则需要判断是否能够解除原有车辆绑定关系
 | 
			
		||||
        if (ObjectUtil.isNotEmpty(oldDriver.getTruckId())) {
 | 
			
		||||
            // 检查车次绑定关系
 | 
			
		||||
            List<TransportTripsTruckDriverEntity> all = transportTripsTruckDriverService.findAll(null, oldDriver.getTruckId(), oldDriver.getUserId());
 | 
			
		||||
            if (all.size() > 0) {
 | 
			
		||||
                // 不能解除
 | 
			
		||||
                List<Long> tripsIds = all.parallelStream().map(TransportTripsTruckDriverEntity::getTransportTripsId).distinct().collect(Collectors.toList());
 | 
			
		||||
                List<TruckTripsEntity> truckTripsEntities = truckTripsService.findAll(null, tripsIds);
 | 
			
		||||
                List<String> tripsNames = truckTripsEntities.parallelStream().map(TruckTripsEntity::getName).distinct().collect(Collectors.toList());
 | 
			
		||||
                List<Long> lineIds = truckTripsEntities.parallelStream().map(TruckTripsEntity::getTransportLineId).distinct().collect(Collectors.toList());
 | 
			
		||||
                List<TransportLineDTO> lineDTOS = transportLineFeign.queryByIds(lineIds.toArray(Long[]::new));
 | 
			
		||||
                List<String> names = lineDTOS.parallelStream().map(TransportLineDTO::getName).collect(Collectors.toList());
 | 
			
		||||
                throw new SLException(StrUtil.format("请先解除原有车辆对应的车次绑定关系 详细: 线路名称 {} 车次名称{}", names, tripsNames));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取司机分页数据
 | 
			
		||||
     *
 | 
			
		||||
     * @param page     页码
 | 
			
		||||
     * @param pageSize 页尺寸
 | 
			
		||||
     * @return 司机分页数据
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public IPage<TruckDriverEntity> findByPage(Integer page, Integer pageSize) {
 | 
			
		||||
        Page<TruckDriverEntity> iPage = new Page<>(page, pageSize);
 | 
			
		||||
        LambdaQueryWrapper<TruckDriverEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        lambdaQueryWrapper.orderByDesc(TruckDriverEntity::getCreated);
 | 
			
		||||
        return super.page(iPage, lambdaQueryWrapper);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,21 @@
 | 
			
		||||
package com.sl.ms.base.utils;
 | 
			
		||||
 | 
			
		||||
import com.sl.ms.base.constant.WorkConstants;
 | 
			
		||||
import com.sl.ms.base.domain.enums.WorkPatternEnum;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkPatternEntity;
 | 
			
		||||
 | 
			
		||||
public class WorkPatternUtils {
 | 
			
		||||
 | 
			
		||||
    public static String toWorkDate(WorkPatternEntity entity) {
 | 
			
		||||
        byte workPatternType = entity.getWorkPatternType();
 | 
			
		||||
        if (workPatternType == WorkPatternEnum.Weeks.getType()) { //周期制
 | 
			
		||||
            String workDate = String.format(WorkConstants.WORK_DATE_WEEKS, entity.getMonday(), entity.getTuesday(),
 | 
			
		||||
                    entity.getWednesday(), entity.getThursday(), entity.getFriday(),
 | 
			
		||||
                    entity.getSaturday(), entity.getSunday());
 | 
			
		||||
            return workDate.replace("1", "上").replace("2", "休");
 | 
			
		||||
        } else {
 | 
			
		||||
            return String.format(WorkConstants.WORK_DATE_CONTINUITYS,
 | 
			
		||||
                    entity.getWorkDayNum(), entity.getRestDayNum());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,97 @@
 | 
			
		||||
package com.sl.ms.base.utils;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import cn.hutool.core.date.LocalDateTimeUtil;
 | 
			
		||||
import com.sl.ms.base.domain.enums.WorkPatternEnum;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkPatternEntity;
 | 
			
		||||
import com.sl.ms.base.entity.base.WorkSchedulingEntity;
 | 
			
		||||
import com.sl.transport.common.util.DateUtils;
 | 
			
		||||
import com.sl.transport.common.util.ObjectUtil;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.time.ZoneOffset;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
@Slf4j
 | 
			
		||||
public class WorkSchedulingUtils {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 查询列表信息时是否需要查询历史列表
 | 
			
		||||
     * 当前月份1号查询的时候不需要查询历史数据
 | 
			
		||||
     * @param queryMonth 月份
 | 
			
		||||
     * @return 是否需要
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean isQueryHistory(String queryMonth){
 | 
			
		||||
        LocalDateTime now = LocalDateTimeUtil.now(); //当前时间
 | 
			
		||||
        String currentMonth = LocalDateTimeUtil.format( now, DateUtils.DEFAULT_MONTH_FORMAT);
 | 
			
		||||
        int result = queryMonth.compareTo(currentMonth);
 | 
			
		||||
        if(result > 0) { //查询未来月份不用查询历史记录
 | 
			
		||||
            return false;
 | 
			
		||||
        }else if (result == 0) { //当前月份
 | 
			
		||||
            int dayOfMonth = now.getDayOfMonth();
 | 
			
		||||
            return dayOfMonth > 1;
 | 
			
		||||
        }else { //查询以前月份,直接查询历史
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 是否上班
 | 
			
		||||
     * @param workSchedulingEntity 排班数据
 | 
			
		||||
     * @param month 月
 | 
			
		||||
     * @param dayOfMonth 日
 | 
			
		||||
     * @param patternEntity 工作模式
 | 
			
		||||
     * @param workHistory 历史数据
 | 
			
		||||
     * @param forceUserWorkPattern 是否强制使用工作模式推断
 | 
			
		||||
     * @return 是否上班
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean isWorded(WorkSchedulingEntity workSchedulingEntity, String month, int dayOfMonth,
 | 
			
		||||
                                   WorkPatternEntity patternEntity, Map<String,String> workHistory, Boolean forceUserWorkPattern){
 | 
			
		||||
        String nowDay = LocalDateTimeUtil.format(LocalDateTime.now(), DateUtils.DEFAULT_DATE_FORMAT);
 | 
			
		||||
        String queryDay = String.format("%s-%s", month, dayOfMonth >= 10 ? "" + dayOfMonth : "0" + dayOfMonth);
 | 
			
		||||
        if(nowDay.compareTo(queryDay) > 0 && !forceUserWorkPattern) { //查询历史数据
 | 
			
		||||
            return CollUtil.isEmpty(workHistory) ? false : workHistory.containsKey(workSchedulingEntity.getUserId() + "" + dayOfMonth);
 | 
			
		||||
        }else { //根据排班推断
 | 
			
		||||
            if (ObjectUtil.isEmpty(patternEntity)) {
 | 
			
		||||
                // 默认不上班
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
            Byte workPatternType = patternEntity.getWorkPatternType();
 | 
			
		||||
            if(workPatternType.byteValue() == WorkPatternEnum.Weeks.getType()) { //礼拜制
 | 
			
		||||
                int dayOfWeek = LocalDateTimeUtil.parse(queryDay,DateUtils.DEFAULT_DATE_FORMAT).getDayOfWeek().getValue();
 | 
			
		||||
                return isWorked(dayOfWeek, patternEntity);
 | 
			
		||||
            }else { //连续制
 | 
			
		||||
                long workContinueStartTime = DateUtils.getStartTime(workSchedulingEntity.getWorkContinueStartTime())
 | 
			
		||||
                        .toEpochSecond(ZoneOffset.of("+8"));
 | 
			
		||||
                long queryDayStartTime = DateUtils.getStartTime(LocalDateTimeUtil.parse(queryDay, DateUtils.DEFAULT_DATE_FORMAT))
 | 
			
		||||
                        .toEpochSecond(ZoneOffset.of("+8"));
 | 
			
		||||
                int day = (int)(queryDayStartTime - workContinueStartTime) / (24 * 3600) ; //已经连续工作和休息的天数
 | 
			
		||||
                int dayNum = patternEntity.getRestDayNum() + patternEntity.getWorkDayNum() == 0 ? 0: day % ( patternEntity.getRestDayNum() + patternEntity.getWorkDayNum()); //连续工作休息n个周期后的第几天
 | 
			
		||||
                return dayNum < patternEntity.getWorkDayNum(); //dayNum小于等于连续工作天数则今天在上班,否则在休息
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static boolean isWorked(int dayOfWeek, WorkPatternEntity entity) {
 | 
			
		||||
        switch (dayOfWeek) {
 | 
			
		||||
            case 1 : //周一是否上班
 | 
			
		||||
                return entity.getMonday() == 1;
 | 
			
		||||
            case 2: //周二是否上班
 | 
			
		||||
                return entity.getTuesday() == 1;
 | 
			
		||||
            case 3: //周三是否上班
 | 
			
		||||
                return entity.getWednesday() == 1;
 | 
			
		||||
            case 4: //周四是否上班
 | 
			
		||||
                return entity.getThursday() == 1;
 | 
			
		||||
            case 5: //周五是否上班
 | 
			
		||||
                return entity.getFriday() == 1;
 | 
			
		||||
            case 6: //周六是否上班
 | 
			
		||||
                return entity.getSaturday() == 1;
 | 
			
		||||
            case 7: //周日是否上班
 | 
			
		||||
                return entity.getSunday() == 1;
 | 
			
		||||
            default:
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										7
									
								
								sl-express-ms-base-service/src/main/resources/banner.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								sl-express-ms-base-service/src/main/resources/banner.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
 | 
			
		||||
       _                                                     ${spring.application.name} ${application.version}
 | 
			
		||||
  ___ | |         ___ __  __ _ __   _ __  ___  ___  ___      Port: ${server.port}
 | 
			
		||||
 / __|| | _____  / _ \\ \/ /| '_ \ | '__|/ _ \/ __|/ __|     Pid: ${pid}  Profile(s): ${AnsiColor.GREEN}${spring.profiles.active}${AnsiColor.DEFAULT}
 | 
			
		||||
 \__ \| ||_____||  __/ >  < | |_) || |  |  __/\__ \\__ \
 | 
			
		||||
 |___/|_|        \___|/_/\_\| .__/ |_|   \___||___/|___/     https://sl-express.itheima.net/
 | 
			
		||||
                            |_|
 | 
			
		||||
@@ -0,0 +1,40 @@
 | 
			
		||||
server:
 | 
			
		||||
  port: 18081
 | 
			
		||||
  tomcat:
 | 
			
		||||
    uri-encoding: UTF-8
 | 
			
		||||
    threads:
 | 
			
		||||
      max: 1000
 | 
			
		||||
      min-spare: 30
 | 
			
		||||
spring:
 | 
			
		||||
  cloud:
 | 
			
		||||
    nacos:
 | 
			
		||||
      username: nacos
 | 
			
		||||
      password: nacos
 | 
			
		||||
      server-addr: 192.168.150.101:8848
 | 
			
		||||
      discovery:
 | 
			
		||||
        namespace: ecae68ba-7b43-4473-a980-4ddeb6157bdc
 | 
			
		||||
        ip: 192.168.150.1
 | 
			
		||||
      config:
 | 
			
		||||
        namespace: ecae68ba-7b43-4473-a980-4ddeb6157bdc
 | 
			
		||||
        shared-configs: #共享配置
 | 
			
		||||
          - data-id: shared-spring-seata.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-rabbitmq.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-mysql.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-mybatis-plus.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-xxl-job.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-authority.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-redis.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
@@ -0,0 +1,39 @@
 | 
			
		||||
server:
 | 
			
		||||
  port: 18081
 | 
			
		||||
  tomcat:
 | 
			
		||||
    uri-encoding: UTF-8
 | 
			
		||||
    threads:
 | 
			
		||||
      max: 1000
 | 
			
		||||
      min-spare: 30
 | 
			
		||||
spring:
 | 
			
		||||
  cloud:
 | 
			
		||||
    nacos:
 | 
			
		||||
      username: nacos
 | 
			
		||||
      password: vO5/dZ9,iL
 | 
			
		||||
      server-addr: nacos-service.yjy-public-slwl-java-prod.svc.cluster.local:8848
 | 
			
		||||
      discovery:
 | 
			
		||||
        namespace: 92312ba8-1119-440f-81af-c29618df303b
 | 
			
		||||
      config:
 | 
			
		||||
        namespace: 92312ba8-1119-440f-81af-c29618df303b
 | 
			
		||||
        shared-configs: #共享配置
 | 
			
		||||
          - data-id: shared-spring-seata.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-rabbitmq.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-mysql.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-mybatis-plus.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-xxl-job.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-authority.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-redis.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
@@ -0,0 +1,39 @@
 | 
			
		||||
server:
 | 
			
		||||
  port: 18081
 | 
			
		||||
  tomcat:
 | 
			
		||||
    uri-encoding: UTF-8
 | 
			
		||||
    threads:
 | 
			
		||||
      max: 1000
 | 
			
		||||
      min-spare: 30
 | 
			
		||||
spring:
 | 
			
		||||
  cloud:
 | 
			
		||||
    nacos:
 | 
			
		||||
      username: nacos
 | 
			
		||||
      password: nacos
 | 
			
		||||
      server-addr: 192.168.150.101:8848
 | 
			
		||||
      discovery:
 | 
			
		||||
        namespace: ecae68ba-7b43-4473-a980-4ddeb6157bdc
 | 
			
		||||
      config:
 | 
			
		||||
        namespace: ecae68ba-7b43-4473-a980-4ddeb6157bdc
 | 
			
		||||
        shared-configs: #共享配置
 | 
			
		||||
          - data-id: shared-spring-seata.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-rabbitmq.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-mysql.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-mybatis-plus.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-xxl-job.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-authority.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-redis.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
@@ -0,0 +1,39 @@
 | 
			
		||||
server:
 | 
			
		||||
  port: 18081
 | 
			
		||||
  tomcat:
 | 
			
		||||
    uri-encoding: UTF-8
 | 
			
		||||
    threads:
 | 
			
		||||
      max: 1000
 | 
			
		||||
      min-spare: 30
 | 
			
		||||
spring:
 | 
			
		||||
  cloud:
 | 
			
		||||
    nacos:
 | 
			
		||||
      username: nacos
 | 
			
		||||
      password: nacos
 | 
			
		||||
      server-addr: nacos-service.yjy-public-slwl-java.svc.cluster.local:8848
 | 
			
		||||
      discovery:
 | 
			
		||||
        namespace: 92312ba8-1119-440f-81af-c29618df303b
 | 
			
		||||
      config:
 | 
			
		||||
        namespace: 92312ba8-1119-440f-81af-c29618df303b
 | 
			
		||||
        shared-configs: #共享配置
 | 
			
		||||
          - data-id: shared-spring-seata.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-rabbitmq.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-mysql.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-mybatis-plus.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-xxl-job.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-authority.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
          - data-id: shared-spring-redis.yml
 | 
			
		||||
            group: SHARED_GROUP
 | 
			
		||||
            refresh: false
 | 
			
		||||
							
								
								
									
										27
									
								
								sl-express-ms-base-service/src/main/resources/bootstrap.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								sl-express-ms-base-service/src/main/resources/bootstrap.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
application:
 | 
			
		||||
  version: v1.0
 | 
			
		||||
logging:
 | 
			
		||||
  config: classpath:logback-spring.xml
 | 
			
		||||
spring:
 | 
			
		||||
  application:
 | 
			
		||||
    name: sl-express-ms-base
 | 
			
		||||
  main:
 | 
			
		||||
    allow-circular-references: true #允许bean循环依赖
 | 
			
		||||
  profiles:
 | 
			
		||||
    active: local
 | 
			
		||||
  mvc:
 | 
			
		||||
    pathmatch:
 | 
			
		||||
      #解决异常:swagger Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException
 | 
			
		||||
      #因为Springfox使用的路径匹配是基于AntPathMatcher的,而Spring Boot 2.6.X使用的是PathPatternMatcher
 | 
			
		||||
      matching-strategy: ant_path_matcher
 | 
			
		||||
sl:
 | 
			
		||||
  mq:
 | 
			
		||||
    enable: true #开启MQ,可以注入MQService使用,但是必须保证数据库有sl_fail_msg表
 | 
			
		||||
  swagger:
 | 
			
		||||
    package-path: com.sl.ms.base.controller
 | 
			
		||||
    title: 神领物流 - 基础微服务接口文档
 | 
			
		||||
    description: 该微服务完成车辆、省市区等基础数据的管理。
 | 
			
		||||
    contact-name: 传智教育·研究院
 | 
			
		||||
    contact-url: http://www.itcast.cn/
 | 
			
		||||
    contact-email: yjy@itcast.cn
 | 
			
		||||
    version: ${application.version}
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user