xieb
2024-12-02 9f204e8842e1688858889a67b702d9e19bb18b15
Merge remote-tracking branch 'origin/jtdev' into jtdev
5 files modified
22 files added
1172 ■■■■■ changed files
skjcmanager/skjcmanager-service-api/pom.xml 1 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-by-api/pom.xml 18 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/pom.xml 5 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/pom.xml 132 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/ByApplication.java 27 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/HttpUploadFileHandler.java 325 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/HttpUploadFileInitialzer.java 74 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/HttpUploadFileServer.java 62 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/config/NettyHttpConfig.java 22 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/controller/NettyHttpService.java 28 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/utils/BeenUtils.java 70 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/utils/ExceptionUtils.java 18 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/utils/HttpResponseUtils.java 68 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/utils/UriUtils.java 55 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/picUpload/entity/BaiyiPicEntity.java 47 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/picUpload/entity/XfByPic.java 39 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/picUpload/mapper/BaiyiPicMapper.java 13 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/picUpload/mapper/BaiyiPicMapper.xml 31 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/picUpload/service/BaiyiPicService.java 11 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/picUpload/service/impl/BaiyiPicServiceImpl.java 25 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/webInterface/controller/test.java 11 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/resources/application-dev.yml 25 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/resources/application-prod.yml 25 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/resources/application-test.yml 25 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/mapper/SgProgressReportMapper.java 2 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/mapper/SgProgressReportMapper.xml 10 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/service/impl/SgProgressReportServiceImpl.java 3 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/pom.xml
@@ -26,6 +26,7 @@
        <module>skjcmanager-xxljob-api</module>
        <module>skjcmanager-nky-api</module>
        <module>skjcmanager-pwd-api</module>
        <module>skjcmanager-by-api</module>
    </modules>
    <dependencies>
skjcmanager/skjcmanager-service-api/skjcmanager-by-api/pom.xml
New file
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>skjcmanager-service-api</artifactId>
        <groupId>cn.gistack</groupId>
        <version>3.0.1.RELEASE</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>skjcmanager-by-api</artifactId>
    <name>${project.artifactId}</name>
    <version>${bladex.project.version}</version>
    <packaging>jar</packaging>
</project>
skjcmanager/skjcmanager-service/pom.xml
@@ -26,6 +26,7 @@
        <module>skjcmanager-xxljob</module>
        <module>skjcmanager-nky</module>
        <module>skjcmanager-pwd</module>
        <module>skjcmanager-by</module>
    </modules>
    <dependencies>
@@ -56,6 +57,10 @@
            <artifactId>skjcmanager-scope-api</artifactId>
            <version>3.0.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springblade</groupId>
            <artifactId>blade-core-cloud</artifactId>
        </dependency>
    </dependencies>
</project>
skjcmanager/skjcmanager-service/skjcmanager-by/pom.xml
New file
@@ -0,0 +1,132 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>skjcmanager-service</artifactId>
        <groupId>cn.gistack</groupId>
        <version>3.0.1.RELEASE</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>skjcmanager-by</artifactId>
    <name>${project.artifactId}</name>
    <version>${bladex.project.version}</version>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>org.springblade</groupId>
            <artifactId>blade-core-boot</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springblade</groupId>
            <artifactId>blade-starter-swagger</artifactId>
        </dependency>
        <!--hk Hikvision AI 安全认证库-->
        <dependency>
            <groupId>com.hikvision.ga</groupId>
            <artifactId>artemis-http-client</artifactId>
            <version>1.1.3</version>
        </dependency>
        <!--引入 sms 短信 sdk -->
        <!--开启多数据源-->
        <dependency>
            <groupId>org.springblade</groupId>
            <artifactId>blade-core-auto</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>cn.gistack</groupId>
            <artifactId>skjcmanager-by-api</artifactId>
            <version>3.0.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>cn.gistack</groupId>
            <artifactId>skjcmanager-flow-api</artifactId>
            <version>3.0.1.RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>cn.gistack</groupId>
            <artifactId>skjcmanager-user-api</artifactId>
            <version>3.0.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>cn.gistack</groupId>
            <artifactId>skjcmanager-alerts-api</artifactId>
            <version>3.0.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>cn.gistack</groupId>
            <artifactId>skjcmanager-nky-api</artifactId>
            <version>3.0.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>cn.gistack</groupId>
            <artifactId>skjcmanager-pwd-api</artifactId>
            <version>3.0.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>cn.gistack</groupId>
            <artifactId>skjcmanager-system-api</artifactId>
            <version>3.0.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springblade</groupId>
            <artifactId>blade-starter-excel</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.gistack</groupId>
            <artifactId>skjcmanager-resource-api</artifactId>
            <version>3.0.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.25</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-mock</artifactId>
            <version>2.0.8</version>
        </dependency>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.50.Final</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <configuration>
                    <username>${docker.username}</username>
                    <password>${docker.password}</password>
                    <repository>${docker.registry.url}/${docker.namespace}/${project.artifactId}</repository>
                    <tag>${project.version}</tag>
                    <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
                    <buildArgs>
                        <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
                    </buildArgs>
                    <skip>false</skip>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/ByApplication.java
New file
@@ -0,0 +1,27 @@
package cn.gistack.by;
import org.mybatis.spring.annotation.MapperScan;
import org.springblade.core.cloud.client.BladeCloudApplication;
import org.springblade.core.launch.BladeApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@BladeCloudApplication
@EnableFeignClients({"cn.gistack"})
@MapperScan({"org.springblade.**.mapper.**","cn.gistack.by.**.mapper.**"})
public class ByApplication {
    public static void main(String[] args) {
        BladeApplication.run("blade-by", ByApplication.class, args);
    }
//    @Bean
//    public RestTemplate restTemplate(RestTemplateBuilder builder){
//        return builder.build();
//    }
}
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/HttpUploadFileHandler.java
New file
@@ -0,0 +1,325 @@
package cn.gistack.by.nettyUpload;
import cn.gistack.by.nettyUpload.config.NettyHttpConfig;
import cn.gistack.by.nettyUpload.utils.BeenUtils;
import cn.gistack.by.nettyUpload.utils.HttpResponseUtils;
import cn.gistack.by.nettyUpload.utils.UriUtils;
import cn.gistack.by.nettyUpload.utils.ExceptionUtils;
import cn.gistack.by.picUpload.entity.BaiyiPicEntity;
import cn.gistack.by.picUpload.entity.XfByPic;
import cn.gistack.by.picUpload.service.BaiyiPicService;
import cn.gistack.resource.feign.IOssClient;
import cn.hutool.core.date.DateUtil;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.*;
import io.netty.handler.codec.http.multipart.*;
import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
import static cn.gistack.by.nettyUpload.utils.ExceptionUtils.getStackString;
/**
 * 文件上传处理类
 * @author chenhaijian
 * @date 2020-05-21 14:45
 */
@Slf4j
public class  HttpUploadFileHandler extends SimpleChannelInboundHandler<FullHttpRequest> {
    // http请求中可选参数
    private static final String FILENAME_PARAM = "filename";
    // http请求中必选的参数
    private static final String FILE_EXTNAME_PARAM = "fileextname";
    private static final String UPLOAD_DATA_URL = "/termite/syncDeviceState";
    private static final String UPLOAD_FILE_URL = "/termite/termiteDataup";
    private NettyHttpConfig nettyHttpConfig;
    private BaiyiPicService baiyiPicService;
    /**
     * 对象存储构建类
     */
    private   IOssClient iOssClient;
    static {
        // should delete file on exit (in normal exit)
        DiskFileUpload.deleteOnExitTemporaryFile = true;
        DiskFileUpload.baseDirectory = null; // system temp directory
        DiskAttribute.deleteOnExitTemporaryFile = true; // should delete file on
        // exit (in normal exit)
        DiskAttribute.baseDirectory = null; // system temp directory
    }
    public HttpUploadFileHandler(NettyHttpConfig nettyHttpConfig, IOssClient iOssClient,BaiyiPicService baiyiPicService) {
        this.nettyHttpConfig = nettyHttpConfig;
        this.iOssClient = iOssClient;
        this.baiyiPicService = baiyiPicService;
    }
    protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest fullRequest) throws Exception {
        // Authorization验证
        boolean isRequestValid = isValidHttpRequest(ctx, fullRequest);
        if (!isRequestValid) {
            HttpResponseUtils.sendResponseJson2(ctx, HttpResponseStatus.BAD_REQUEST, "验证失败",null);
            return ;
        }
        // 请求路径验证
        String urlyz = urlyz(ctx, fullRequest);
        if (UPLOAD_FILE_URL.equals(urlyz)) { //传图片
            HttpPostMultipartRequestDecoder test = new HttpPostMultipartRequestDecoder(fullRequest);
            List<InterfaceHttpData> bodyHttpDatas = test.getBodyHttpDatas();
            XfByPic xfByPic = new XfByPic();
            for (InterfaceHttpData item : bodyHttpDatas ) {
                if ( item instanceof Attribute){
                    Attribute attribute = (Attribute)item;
                    System.out.println("getName:::"+attribute.getName());
                    System.out.println("getValue:::"+attribute.getValue());
                    String value = attribute.getValue();
                    switch(attribute.getName()){
                        case "mnNo":
                            xfByPic.setMnNo(value);
                            break;
                        case "order":
                            xfByPic.setOrder(value);
                            break;
                        case "sn":
                            xfByPic.setSn(value);
                            break;
                        case "ap":
                            xfByPic.setAp(value);
                            break;
                        case "camera":
                            xfByPic.setCamera(value);
                            break;
                        case "hardware":
                            xfByPic.setHardware(value);
                            break;
                        case "rssi":
                            xfByPic.setRssi(value);
                            break;
                        case "software":
                            xfByPic.setSoftware(value);
                            break;
                        case "temperature":
                            xfByPic.setTemperature(value);
                            break;
                        case "voltage":
                            xfByPic.setVoltage(value);
                            break;
                    }
                } else if (item instanceof FileUpload) {
                    FileUpload file = (FileUpload)item;
                    String filename = file.getFilename();
                    ByteArrayInputStream stream = new ByteArrayInputStream(ByteBufUtil.getBytes(file.getByteBuf()));
                    MockMultipartFile multipartFile
                        = new MockMultipartFile("11", filename, "application/octet-stream", stream);
                    String picurl = iOssClient.uploadFile(filename, multipartFile);
                    log.info("图片上传地址::"+picurl);
                    xfByPic.setImageurl(picurl);
                }
            }
            xfByPic.setCreatedAt(new Date());
            // 保存入库xfByPic
            baiyiPicService.inserXfPicUrl(xfByPic);
        } else if(UPLOAD_DATA_URL.equals(urlyz)) { //传数据
            HttpPostMultipartRequestDecoder test = new HttpPostMultipartRequestDecoder(fullRequest);
            List<InterfaceHttpData> bodyHttpDatas = test.getBodyHttpDatas();
            for (InterfaceHttpData item : bodyHttpDatas ) {
                if (  item instanceof Attribute){
//                    FileUpload file = (FileUpload)item;
//                    String filename = file.getFilename();
//                    ByteArrayInputStream stream = new ByteArrayInputStream(ByteBufUtil.getBytes(file.getByteBuf()));
//                    MockMultipartFile multipartFile
//                        = new MockMultipartFile("11", filename, "application/octet-stream", stream);
//                    String picurl = iOssClient.uploadFile(filename, multipartFile);
//                    log.info("图片上传地址::"+picurl);
                } else if (item instanceof FileUpload) {
                    System.out.println("Attribute:::"+item.getName());
                }
            }
        } else {
            HttpResponseUtils.sendResponseJson2(ctx, HttpResponseStatus.BAD_REQUEST, "验证失败",null);
            return ;
        }
        HttpResponseUtils.sendResponseJson(ctx, HttpResponseStatus.OK, "上传成功");
    }
    // 请求路径验证
    public  String  urlyz(ChannelHandlerContext ctx, FullHttpRequest request) {
        try {
            URI uri = UriUtils.getURI(request);
            System.err.println("uri.getPath()::::"+uri.getPath());
            System.err.println(""+uri.getPath());
            if (uri.getPath().startsWith(UPLOAD_DATA_URL)) {
                return UPLOAD_DATA_URL;
            } else if (uri.getPath().startsWith(UPLOAD_FILE_URL)) {
                return UPLOAD_FILE_URL;
            }
        } catch (Exception exception) {
            exception.printStackTrace();
            log.error(getStackString(exception));
            return null;
        }
        return null;
    }
    public static MultipartFile convert(File file) throws IOException {
        FileInputStream input = new FileInputStream(file);
        MultipartFile multipartFile = new MockMultipartFile("file",
            file.getName(), "application/octet-stream", input);
        return multipartFile;
    }
    private String parseFilePath(FullHttpRequest fullRequest) throws URISyntaxException {
        String dirPath = this.nettyHttpConfig.getFileSaveRootPath();
        String fileName = this.parseFileName(fullRequest);
        return dirPath +  File.separator + fileName;
    }
    private RandomAccessFile getSaveFile(String filePath) {
        try {
            RandomAccessFile file = new RandomAccessFile(filePath, "rw");
            return file;
        } catch (Exception exception) {
            log.error(getStackString(exception));
            return null;
        }
    }
    private boolean isValidHttpRequest(ChannelHandlerContext ctx, FullHttpRequest request) {
        try {
            URI uri = UriUtils.getURI(request);
//            log.info(uri.getPath());
            // authorization效验
            String authorization = request.headers().get("Authorization");
            if(!this.nettyHttpConfig.getAuthorization().equals(authorization)) {
                log.warn("Authorization校验失败!!");
                // 校验不通过
                HttpResponseUtils.sendResponseJson(ctx, HttpResponseStatus.UNAUTHORIZED, HttpResponseStatus.UNAUTHORIZED.toString());
                // 校验不通过
                return false;
            }
            // 密码校验
//            boolean authFlag = auth(ctx, uri);
//            if (!authFlag) {
//                // 校验不通过
//                HttpResponseUtils.sendResponseJson(ctx, HttpResponseStatus.UNAUTHORIZED, HttpResponseStatus.UNAUTHORIZED.toString());
//                // 校验不通过
//                return false;
//            }
            // uri 路径校验
//            if (!uri.getPath().startsWith(UPLOAD_FILE_URL)) {
//                HttpResponseUtils.sendResponseJson(ctx, HttpResponseStatus.BAD_REQUEST,"the url must starts with /postfile");
//                return false;
//            }
            return true;
        } catch (Exception exception) {
            exception.printStackTrace();
            log.error(getStackString(exception));
            return false;
        }
    }
    private String parseFileName(FullHttpRequest fullRequest) throws URISyntaxException {
        URI uri = UriUtils.getURI(fullRequest);
        Map<String, String> queryParams = UriUtils.getQueryParams(uri);
        try {
            if (queryParams.containsKey(FILENAME_PARAM)) {
                return queryParams.get(FILENAME_PARAM);
            } else {
                SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY_MM_dd_HH_MM_SS_sss");
                String filePureName = dateFormat.format(new Date());
                return filePureName + "." + queryParams.get(FILE_EXTNAME_PARAM);
            }
        } catch (Exception exception) {
            log.error(ExceptionUtils.getStackString(exception));
            return String.valueOf(System.currentTimeMillis());
        }
    }
    private void writeResponse(ChannelHandlerContext ctx, String context) {
        ByteBuf buf = Unpooled.copiedBuffer(context, CharsetUtil.UTF_8);
        FullHttpResponse response = new DefaultFullHttpResponse(
                HttpVersion.HTTP_1_1, HttpResponseStatus.OK, buf);
        response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/html;charset=utf-8");
        //设置短连接 addListener 写完马上关闭连接
        ctx.channel().writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
    }
    /**
     * 进行请求的密码校验
     * @param ctx
     * @param uri
     * @return
     */
    private boolean auth(ChannelHandlerContext ctx, URI uri) {
        Map<String, String> queryParams = UriUtils.getQueryParams(uri);
        String passwd = queryParams.get("passwd");
        if (this.nettyHttpConfig.getFileUpPasswd().equals(passwd)) {
            return true;
        }
        return false;
    }
    @Override
    public void channelInactive(ChannelHandlerContext ctx) {
        ctx.close();
    }
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        log.error(getStackString(cause));
        cause.printStackTrace();
        ctx.close();
    }
}
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/HttpUploadFileInitialzer.java
New file
@@ -0,0 +1,74 @@
package cn.gistack.by.nettyUpload;
import cn.gistack.by.nettyUpload.config.NettyHttpConfig;
import cn.gistack.by.picUpload.service.BaiyiPicService;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpContentCompressor;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpRequestDecoder;
import io.netty.handler.codec.http.HttpResponseEncoder;
import io.netty.util.concurrent.DefaultEventExecutorGroup;
import io.netty.util.concurrent.EventExecutorGroup;
import io.netty.util.concurrent.RejectedExecutionHandler;
import io.netty.util.concurrent.SingleThreadEventExecutor;
import lombok.extern.slf4j.Slf4j;
import cn.gistack.resource.feign.IOssClient;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.concurrent.ThreadFactory;
/**
 *
 * @author chenhaijian
 * @date 2020-05-21 14:42
 */
@Slf4j
public class HttpUploadFileInitialzer extends ChannelInitializer<SocketChannel> {
    /**
     * 所有的工作线程的线程池。
     */
    private static EventExecutorGroup executorGroup = null;
    private NettyHttpConfig nettyHttpConfig;
    private  IOssClient iOssClient;
    private BaiyiPicService baiyiPicService;
    public HttpUploadFileInitialzer(NettyHttpConfig nettyHttpConfig,IOssClient iOssClient,BaiyiPicService baiyiPicService) {
        this.nettyHttpConfig = nettyHttpConfig;
        this.iOssClient = iOssClient;
        this.baiyiPicService = baiyiPicService;
        if (executorGroup == null) {
            ThreadFactory threadFactory = (new ThreadFactoryBuilder()).setNameFormat("netty-business-%d")
                .setDaemon(false).build();
            executorGroup = new DefaultEventExecutorGroup(nettyHttpConfig.getBusinessThreadsCoreNum(), threadFactory,
                nettyHttpConfig.getBusinessThreadsQueueCapacity(),
                new RejectedExecutionHandler() {
                    @Override
                    public void rejected(Runnable runnable, SingleThreadEventExecutor singleThreadEventExecutor) {
                        log.error("Server will discard the runnale {}.", runnable.toString());
                        singleThreadEventExecutor.shutdownGracefully();
                    }
                });
        }
    }
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        pipeline.addLast("decoder", new HttpRequestDecoder());
        pipeline.addLast("encoder", new HttpResponseEncoder());
        pipeline.addLast(new HttpContentCompressor());
        // 聚合器,负责将http聚合成完整的消息,而不是原始的多个部分
        pipeline.addLast(new HttpObjectAggregator(nettyHttpConfig.getMaxContentLength()));
        pipeline.addLast(executorGroup, "httpUploadFileHandler", new HttpUploadFileHandler(nettyHttpConfig,iOssClient,baiyiPicService));
    }
}
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/HttpUploadFileServer.java
New file
@@ -0,0 +1,62 @@
package cn.gistack.by.nettyUpload;
import cn.gistack.by.nettyUpload.config.NettyHttpConfig;
import cn.gistack.by.nettyUpload.utils.ExceptionUtils;
import cn.gistack.by.picUpload.service.BaiyiPicService;
import cn.gistack.resource.feign.IOssClient;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import lombok.extern.slf4j.Slf4j;
/**
 * netty实现http协议上传文件 服务端
 *
 * @author Kai.Shan
 * @date 2024-11-13 14:33
 */
@Slf4j
public class HttpUploadFileServer implements Runnable {
    private NettyHttpConfig nettyHttpConfig;
    private IOssClient iOssClient;
    private BaiyiPicService baiyiPicService;
    public HttpUploadFileServer(NettyHttpConfig nettyHttpConfig, IOssClient iOssClient ,BaiyiPicService baiyiPicService) {
        this.nettyHttpConfig = nettyHttpConfig;
        this.iOssClient = iOssClient;
        this.baiyiPicService = baiyiPicService;
    }
    public void run() {
        NioEventLoopGroup bossGroup = new NioEventLoopGroup(this.nettyHttpConfig.getBossGroupThreads());
        NioEventLoopGroup workerGroup = new NioEventLoopGroup(this.nettyHttpConfig.getWorkerGroupThreads());
        try {
            ServerBootstrap bootstrap = new ServerBootstrap();
            bootstrap.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .option(ChannelOption.SO_BACKLOG, nettyHttpConfig.getNettySoBacklog())
                    .handler(new LoggingHandler(LogLevel.INFO))
                    .childHandler(new HttpUploadFileInitialzer(nettyHttpConfig,iOssClient,baiyiPicService));
            Channel channel = bootstrap.bind(this.nettyHttpConfig.getServerSocketIp(),this.nettyHttpConfig.getServerSocketPort())
                    .sync().channel();
            System.out.println("upload server started ....");
            channel.closeFuture().sync();
        } catch (Exception exception) {
            exception.printStackTrace();
            log.error(ExceptionUtils.getStackString(exception));
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/config/NettyHttpConfig.java
New file
@@ -0,0 +1,22 @@
package cn.gistack.by.nettyUpload.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "netty.http")
@Component
@Data
public class NettyHttpConfig {
    private String serverSocketIp;
    private int serverSocketPort;
    private int bossGroupThreads;
    private int workerGroupThreads;
    private int maxContentLength;
    private int nettySoBacklog;
    private String fileSaveRootPath;
    private String fileUpPasswd;
    private int businessThreadsQueueCapacity;
    private int businessThreadsCoreNum;
    private String authorization;
}
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/controller/NettyHttpService.java
New file
@@ -0,0 +1,28 @@
package cn.gistack.by.nettyUpload.controller;
import cn.gistack.by.nettyUpload.HttpUploadFileServer;
import cn.gistack.by.nettyUpload.config.NettyHttpConfig;
import cn.gistack.by.picUpload.service.BaiyiPicService;
import cn.gistack.resource.feign.IOssClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
//@Component
@RestController
public class NettyHttpService {
    @Autowired
    private NettyHttpConfig nettyHttpConfig;
    @Autowired
    private IOssClient ossClient;
    @Autowired
    private BaiyiPicService baiyiPicService;
    @PostConstruct
    public void postConstructService() {
        new Thread(new HttpUploadFileServer(nettyHttpConfig,ossClient,baiyiPicService)).start();
    }
}
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/utils/BeenUtils.java
New file
@@ -0,0 +1,70 @@
package cn.gistack.by.nettyUpload.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class BeenUtils implements ApplicationContextAware {
    /**
     * 上下文对象实例
     */
    private static ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        BeenUtils.applicationContext = applicationContext;
    }
    /**
     * 获取applicationContext
     *
     * @return
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
    /**
     * 通过name获取 Bean.
     *
     * @param name
     * @return
     */
    public static Object getBean(String name) {
        if (applicationContext == null){
            throw new RuntimeException("applicationContext注入失败");
        }
        return getApplicationContext().getBean(name);
    }
    /**
     * 通过class获取Bean.
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(Class<T> clazz) {
        if (applicationContext == null){
            throw new RuntimeException("applicationContext注入失败");
        }
        return getApplicationContext().getBean(clazz);
    }
    /**
     * 通过name,以及Clazz返回指定的Bean
     *
     * @param name
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(String name, Class<T> clazz) {
        if (applicationContext == null){
            throw new RuntimeException("applicationContext注入失败");
        }
        return getApplicationContext().getBean(name, clazz);
    }
}
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/utils/ExceptionUtils.java
New file
@@ -0,0 +1,18 @@
package cn.gistack.by.nettyUpload.utils;
import java.io.PrintWriter;
import java.io.StringWriter;
public class ExceptionUtils {
    /**
     * 获取异常堆栈字符串。
     *
     * @param t {@link Throwable}
     * @return
     */
    public static String getStackString(Throwable t) {
        StringWriter sw  = new StringWriter();
        t.printStackTrace(new PrintWriter(sw, true));
        return  sw.getBuffer().toString();
    }
}
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/utils/HttpResponseUtils.java
New file
@@ -0,0 +1,68 @@
package cn.gistack.by.nettyUpload.utils;
import com.alibaba.fastjson.JSONObject;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.DefaultFullHttpResponse;
import io.netty.handler.codec.http.FullHttpResponse;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.CharsetUtil;
import java.util.Map;
import static io.netty.handler.codec.http.HttpHeaders.Names.CONTENT_TYPE;
import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1;
/**
 * response工具
 * @author chenhaijian
 * @date 2020-05-21 17:11
 */
public class HttpResponseUtils {
    /**
     * 向客户端发送消息提示
     * @param ctx
     * @param status
     */
    public static void sendError(ChannelHandlerContext ctx, HttpResponseStatus status) {
        FullHttpResponse response = new DefaultFullHttpResponse(
                HTTP_1_1, status, Unpooled.copiedBuffer("Failure: " + status.toString() + "\r\n", CharsetUtil.UTF_8));
        response.headers().set(CONTENT_TYPE, "text/plain; charset=UTF-8");
        ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
    }
    /**
     * 向客户端发送消息提示
     * @param ctx
     * @param status
     * @param message
     */
    public static void sendResponseJson(ChannelHandlerContext ctx, HttpResponseStatus status, String message) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("code", status.code());
        jsonObject.put("msg", message);
        FullHttpResponse response = new DefaultFullHttpResponse(
                HTTP_1_1, status, Unpooled.copiedBuffer(jsonObject.toJSONString(), CharsetUtil.UTF_8));
        response.headers().set(CONTENT_TYPE, "application/json; charset=UTF-8");
        ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
    }
    public static void sendResponseJson2(ChannelHandlerContext ctx, HttpResponseStatus status,
                                         String message,Map<String, Object> map) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("code", status.code());
        jsonObject.put("msg", message);
        jsonObject.put("data", map);
        FullHttpResponse response = new DefaultFullHttpResponse(
            HTTP_1_1, status, Unpooled.copiedBuffer(jsonObject.toJSONString(), CharsetUtil.UTF_8));
        response.headers().set(CONTENT_TYPE, "application/json; charset=UTF-8");
        ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
    }
}
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/utils/UriUtils.java
New file
@@ -0,0 +1,55 @@
package cn.gistack.by.nettyUpload.utils;
import io.netty.handler.codec.http.HttpRequest;
import org.apache.commons.lang3.StringUtils;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
/**
 * URI 工具类
 * @author chenhaijian
 * @date 2020-05-21 16:43
 */
public class UriUtils {
    /**
     * 获取HttpRequest中的uri封装成URI对象
     * @param httpRequest
     * @return
     * @throws URISyntaxException
     */
    public static URI getURI(HttpRequest httpRequest) throws URISyntaxException {
        return new URI(httpRequest.uri());
    }
    /**
     * 获取URI对象中的参数
     * @param uri
     * @return
     */
    public static Map<String, String> getQueryParams(URI uri) {
        Map<String, String> params = new HashMap<>();
        String query = uri.getQuery();
        if (StringUtils.isNotBlank(query)) {
            String[] paramsItems = query.split("&");
            for (String item : paramsItems) {
                String[] kv = item.split("=");
                params.put(kv[0], kv[1]);
            }
        }
        return params;
    }
    /**
     * 获取HttpRequest中的 query params
     * @param httpRequest
     * @return
     */
    public static Map<String, String> getQueryParams(HttpRequest httpRequest) throws URISyntaxException {
        URI uri = getURI(httpRequest);
        return getQueryParams(uri);
    }
}
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/picUpload/entity/BaiyiPicEntity.java
New file
@@ -0,0 +1,47 @@
package cn.gistack.by.picUpload.entity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.Date;
@Data
public class BaiyiPicEntity {
    @NotBlank(message = "设备编码不能为空")
    @ApiModelProperty("设备编码")
    private String mnNo;
    @NotBlank(message = "白蚁图片地址不能为空")
    @ApiModelProperty("白蚁图片地址")
    private String picUrl;
    @ApiModelProperty("白蚁图片状态")
    private Integer picStatus;
    @NotBlank(message = "白蚁设备安装的点位顺序不能为空")
    @ApiModelProperty("白蚁设备安装的点位顺序")
    private String order;
    @ApiModelProperty("创建时间")
    private Date createdAt;
    @NotBlank(message = "观测时间不能为空")
    @ApiModelProperty("观测时间")
    private String obTime;
    @NotBlank(message = "观测时间2不能为空")
    @ApiModelProperty("观测时间2")
    private Date obDate;
    @NotBlank(message = "中心站地址不能为空")
    @ApiModelProperty("中心站地址")
    private Integer stationId;
    @NotBlank(message = "站点名称不能为空")
    @ApiModelProperty("站点名称")
    private String stationName;
    @NotBlank(message = "设备id不能为空")
    @ApiModelProperty("设备id")
    private Integer deviceId;
    @NotBlank(message = "设备名称不能为空")
    @ApiModelProperty("设备名称")
    private String deviceName;
    @NotBlank(message = "接收类型不能为空")
    @ApiModelProperty("接收类型")
    private Integer receiveType;
}
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/picUpload/entity/XfByPic.java
New file
@@ -0,0 +1,39 @@
package cn.gistack.by.picUpload.entity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.Date;
@Data
public class XfByPic {
    @NotBlank(message = "设备编码不能为空")
    @ApiModelProperty("RTU编码")
    private String mnNo;
    @NotBlank(message = "白蚁设备安装的点位顺序不能为空")
    @ApiModelProperty("白蚁设备安装的点位顺序")
    private String order;
    @ApiModelProperty("白蚁设备编号顺序")
    private String sn;
    private String ap;
    private String camera;
    private String hardware;
    private String imageurl;
    private String rssi;
    private String software;
    private String temperature;
    private String voltage;
    @ApiModelProperty("创建时间")
    private Date createdAt;
}
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/picUpload/mapper/BaiyiPicMapper.java
New file
@@ -0,0 +1,13 @@
package cn.gistack.by.picUpload.mapper;
import cn.gistack.by.picUpload.entity.BaiyiPicEntity;
import cn.gistack.by.picUpload.entity.XfByPic;
import org.apache.ibatis.annotations.Param;
public interface BaiyiPicMapper {
    void inserpicData(@Param("item") BaiyiPicEntity entity);
    void inserXfPicUrl(@Param("item") XfByPic entity);
}
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/picUpload/mapper/BaiyiPicMapper.xml
New file
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.gistack.by.picUpload.mapper.BaiyiPicMapper">
    <insert id="inserpicData" >
        insert into
            SJZT_ODS."water_data_termites_pic"
            ("mn_no", "pic_url", "pic_status", "order", "created_at", "ob_time",
            "ob_date","station_id", "station_name", "device_id", "device_name",  "receive_type")
        VALUE
            (
             #{item.mnNo},#{item.picUrl},#{item.picStatus},#{item.order},#{item.createdAt},#{item.obTime},#{item.obDate},
            #{item.stationId},#{item.stationName},#{item.deviceId},#{item.deviceName},#{item.receiveType}
            )
    </insert>
    <insert id="inserXfPicUrl" >
        insert into
            SJZT_ODS."water_data_termites_url_xf"
        ("mn_no",  "order", "sn", "ap",
         "camera","hardware", "imageurl", "rssi", "software",  "temperature" , "voltage" ,"created_at")
            VALUE
            (
            #{item.mnNo},#{item.order},#{item.sn},#{item.ap},#{item.camera},#{item.hardware},#{item.imageurl},
            #{item.rssi},#{item.software},#{item.temperature},#{item.voltage},#{item.createdAt}
            )
    </insert>
</mapper>
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/picUpload/service/BaiyiPicService.java
New file
@@ -0,0 +1,11 @@
package cn.gistack.by.picUpload.service;
import cn.gistack.by.picUpload.entity.BaiyiPicEntity;
import cn.gistack.by.picUpload.entity.XfByPic;
public interface BaiyiPicService {
    void inserpicData(BaiyiPicEntity entity);
    void inserXfPicUrl(XfByPic entity);
}
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/picUpload/service/impl/BaiyiPicServiceImpl.java
New file
@@ -0,0 +1,25 @@
package cn.gistack.by.picUpload.service.impl;
import cn.gistack.by.picUpload.entity.BaiyiPicEntity;
import cn.gistack.by.picUpload.entity.XfByPic;
import cn.gistack.by.picUpload.mapper.BaiyiPicMapper;
import cn.gistack.by.picUpload.service.BaiyiPicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BaiyiPicServiceImpl implements BaiyiPicService {
    @Autowired
    private BaiyiPicMapper baiyiPicMapper;
    @Override
    public void inserpicData(BaiyiPicEntity entity) {
        baiyiPicMapper.inserpicData(entity);
    }
    @Override
    public void inserXfPicUrl(XfByPic entity) {
        baiyiPicMapper.inserXfPicUrl(entity);
    }
}
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/webInterface/controller/test.java
New file
@@ -0,0 +1,11 @@
package cn.gistack.by.webInterface.controller;
import cn.gistack.by.nettyUpload.config.NettyHttpConfig;
import cn.gistack.resource.feign.IOssClient;
public class test {
    private NettyHttpConfig nettyHttpConfig;
    private  IOssClient iOssClient;
}
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/resources/application-dev.yml
New file
@@ -0,0 +1,25 @@
#服务器端口
server:
  port: 8190
#数据源配置
spring:
  datasource:
    url: ${blade.datasource.dev.ztznwh.url}
    username: ${blade.datasource.dev.ztznwh.username}
    password: ${blade.datasource.dev.ztznwh.password}
#netty配置
netty:
  http:
    server-socket-ip: 127.0.0.1
    server-socket-port: 8003
    worker_group_threads: 32
    boss_group_threads: 0
    netty_so_backlog: 4096
    max_content_length: 10485760
    file_save_root_path: C:/Users/kelu/Desktop/111
    file_up_passwd: fireinthehole
    business_threads_queue_capacity: 10000
    business_threads_core_num: 200
    authorization: eyJraWQiOiJrMSIsImFsZyI6IlJTMjU2In0.eyJpc3MiOiJhZG1pbkBnaXN1bmkuY29tIiwiYXVkIjoidXVtcyIsImp0aSI6IjYwMGZiYmMyLWE1NDgtNGZmNC04ZGNhLTZkNTdkZjY1OTYxNyIsImlhdCI6MTcxNzcyNDA1MywibmJmIjoxNzE3NzIzNDUzLCJzdWIiOiJzdXBlciIsImV4cCI6MTcxNzc4NTQ5Mywia2V5IjoiMmQ5ZWY2MTNlYTkxNDc4MDhlOGZiYTMxYWNlOTE0NmEiLCJpZCI6IjEiLCJuYW1lIjoic3VwZXIiLCJuaWNrTmFtZSI6Iui2hee6p-euoeeQhuWRmCIsImFjY291bnQiOiJzdXBlciIsInR5cGUiOiIyIiwiY2xpZW50IjpudWxsLCJjbGllbnRfaWQiOiIiLCJ0b2tlblR5cGUiOiJVU0VSIn0.VzETse76m1rkRsMjst9kDr1oCnHrPq81pRs-34bjVXPDRiPT6ekVCm-63hLfoH4GAp25oTL9dWA1ax-t1KWlSzHUn82myEBokwCVWlkZZPVMzFMCgP_SNdFeYlvguVhige1nQ6B0wo5crGYKKsfllt0_bp98TFg3I3zF03WsORk7HlsZfsY7ROwYkXXkIgbdw5gIRYlZJ6W1MiMET9TOyAzWGJvEyTPewaW4XMoq-okZoAe_7gV2u_tylngqRCohxTSuA7xf59gK8OrstwTeId_qQp4remoEDdLJfYyzLXCX5xBKns8gw2i1MZfpq9rizDT-Qdz23VQDQdmeHWK7zQ
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/resources/application-prod.yml
New file
@@ -0,0 +1,25 @@
#服务器端口
server:
  port: 8190
#数据源配置
spring:
  datasource:
    url: ${blade.datasource.prod.ztznwh.url}
    username: ${blade.datasource.prod.ztznwh.username}
    password: ${blade.datasource.prod.ztznwh.password}
#netty配置
netty:
  http:
    server-socket-ip: 127.0.0.1
    server-socket-port: 8003
    worker_group_threads: 32
    boss_group_threads: 0
    netty_so_backlog: 4096
    max_content_length: 10485760
    file_save_root_path: C:/Users/kelu/Desktop/111
    file_up_passwd: fireinthehole
    business_threads_queue_capacity: 10000
    business_threads_core_num: 200
    authorization: eyJraWQiOiJrMSIsImFsZyI6IlJTMjU2In0.eyJpc3MiOiJhZG1pbkBnaXN1bmkuY29tIiwiYXVkIjoidXVtcyIsImp0aSI6IjYwMGZiYmMyLWE1NDgtNGZmNC04ZGNhLTZkNTdkZjY1OTYxNyIsImlhdCI6MTcxNzcyNDA1MywibmJmIjoxNzE3NzIzNDUzLCJzdWIiOiJzdXBlciIsImV4cCI6MTcxNzc4NTQ5Mywia2V5IjoiMmQ5ZWY2MTNlYTkxNDc4MDhlOGZiYTMxYWNlOTE0NmEiLCJpZCI6IjEiLCJuYW1lIjoic3VwZXIiLCJuaWNrTmFtZSI6Iui2hee6p-euoeeQhuWRmCIsImFjY291bnQiOiJzdXBlciIsInR5cGUiOiIyIiwiY2xpZW50IjpudWxsLCJjbGllbnRfaWQiOiIiLCJ0b2tlblR5cGUiOiJVU0VSIn0.VzETse76m1rkRsMjst9kDr1oCnHrPq81pRs-34bjVXPDRiPT6ekVCm-63hLfoH4GAp25oTL9dWA1ax-t1KWlSzHUn82myEBokwCVWlkZZPVMzFMCgP_SNdFeYlvguVhige1nQ6B0wo5crGYKKsfllt0_bp98TFg3I3zF03WsORk7HlsZfsY7ROwYkXXkIgbdw5gIRYlZJ6W1MiMET9TOyAzWGJvEyTPewaW4XMoq-okZoAe_7gV2u_tylngqRCohxTSuA7xf59gK8OrstwTeId_qQp4remoEDdLJfYyzLXCX5xBKns8gw2i1MZfpq9rizDT-Qdz23VQDQdmeHWK7zQ
skjcmanager/skjcmanager-service/skjcmanager-by/src/main/resources/application-test.yml
New file
@@ -0,0 +1,25 @@
#服务器端口
server:
  port: 8190
#数据源配置
spring:
  datasource:
    url: ${blade.datasource.test.ztznwh.url}
    username: ${blade.datasource.test.ztznwh.username}
    password: ${blade.datasource.test.ztznwh.password}
#netty配置
netty:
  http:
    server-socket-ip: 127.0.0.1
    server-socket-port: 8003
    worker_group_threads: 32
    boss_group_threads: 0
    netty_so_backlog: 4096
    max_content_length: 10485760
    file_save_root_path: C:/Users/kelu/Desktop/111
    file_up_passwd: fireinthehole
    business_threads_queue_capacity: 10000
    business_threads_core_num: 200
    authorization: eyJraWQiOiJrMSIsImFsZyI6IlJTMjU2In0.eyJpc3MiOiJhZG1pbkBnaXN1bmkuY29tIiwiYXVkIjoidXVtcyIsImp0aSI6IjYwMGZiYmMyLWE1NDgtNGZmNC04ZGNhLTZkNTdkZjY1OTYxNyIsImlhdCI6MTcxNzcyNDA1MywibmJmIjoxNzE3NzIzNDUzLCJzdWIiOiJzdXBlciIsImV4cCI6MTcxNzc4NTQ5Mywia2V5IjoiMmQ5ZWY2MTNlYTkxNDc4MDhlOGZiYTMxYWNlOTE0NmEiLCJpZCI6IjEiLCJuYW1lIjoic3VwZXIiLCJuaWNrTmFtZSI6Iui2hee6p-euoeeQhuWRmCIsImFjY291bnQiOiJzdXBlciIsInR5cGUiOiIyIiwiY2xpZW50IjpudWxsLCJjbGllbnRfaWQiOiIiLCJ0b2tlblR5cGUiOiJVU0VSIn0.VzETse76m1rkRsMjst9kDr1oCnHrPq81pRs-34bjVXPDRiPT6ekVCm-63hLfoH4GAp25oTL9dWA1ax-t1KWlSzHUn82myEBokwCVWlkZZPVMzFMCgP_SNdFeYlvguVhige1nQ6B0wo5crGYKKsfllt0_bp98TFg3I3zF03WsORk7HlsZfsY7ROwYkXXkIgbdw5gIRYlZJ6W1MiMET9TOyAzWGJvEyTPewaW4XMoq-okZoAe_7gV2u_tylngqRCohxTSuA7xf59gK8OrstwTeId_qQp4remoEDdLJfYyzLXCX5xBKns8gw2i1MZfpq9rizDT-Qdz23VQDQdmeHWK7zQ
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/mapper/SgProgressReportMapper.java
@@ -46,4 +46,6 @@
    List<Map<String, Object>> getRoleByIds(@Param("ids")List<Long> rids);
    List<Long> getSgEngineerRole();
    List<Map<String, Object>> getUserByIdsCounty(@Param("ids") List<Long> ids);
}
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/mapper/SgProgressReportMapper.xml
@@ -246,6 +246,16 @@
        </if>
    </select>
    <select id="getUserByIdsCounty" resultType="java.util.Map">
        select u.id ,u.real_name ,d.full_name as deptName from ywxt.blade_user u inner join ywxt.blade_dept d  on FIND_IN_SET(u.dept_id, d.id) > 0 where 1 = 1
        <if test="ids != null and ids.size>0">
            AND u.id in
            <foreach collection="ids" item="item" index="index" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>
    </select>
    <select id="selectProframId" resultType="java.lang.Long">
        select program_id from ywxt.sg_device where id = #{deviceId}
    </select>
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sg/service/impl/SgProgressReportServiceImpl.java
@@ -318,8 +318,11 @@
        sgProgressReportVO.setDeviceName("");}
        List<SgReportUserDO> list =  new LambdaQueryChainWrapper<>(sgReportUserMapper).eq(SgReportUserDO::getReportId,id).orderByAsc(SgReportUserDO::getApprovalOrder).list();
        List<Long> ids = list.stream().map(SgReportUserDO::getUserId).collect(Collectors.toList());
        List<Long> idsCounty = list.stream().filter(s->s.getRoleId().equals(1811657352658042882L)).map(SgReportUserDO::getUserId).collect(Collectors.toList());
        List<Long> rids = list.stream().map(SgReportUserDO::getRoleId).collect(Collectors.toList());
        List<Map<String,Object>> users = sgProgressReportMapper.getUserByIds(ids);
        List<Map<String,Object>> usersCounty = sgProgressReportMapper.getUserByIdsCounty(idsCounty);
        users.addAll(usersCounty);
        List<Map<String,Object>> roles = sgProgressReportMapper.getRoleByIds(rids);
        for (Map<String, Object> user : users) {