licailing 5 лет назад
Родитель
Сommit
05312186b1

+ 6 - 0
pom.xml

@@ -278,6 +278,12 @@
             <version>2.3.30</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.pdfbox</groupId>
+            <artifactId>pdfbox</artifactId>
+            <version>2.0.16</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 1 - 1
src/main/h5/src/views/expert/expertList.vue

@@ -26,7 +26,7 @@
         @click="handleEdit(item)"
       >
         <div class="left">
-          <div class="name">{{ item.organizer }}</div>
+          <div class="name">{{ item.name }}</div>
           <div class="status">
             <img src="../../assets/icon_status.svg" alt="" />
             <van-tag

+ 2 - 1
src/main/java/com/izouma/wenlvju/dto/RateDTO.java

@@ -89,7 +89,8 @@ public class RateDTO {
             if (StrUtil.isNotBlank(organization.getAddress())) {
                 address += organization.getAddress();
             }
-            rate.setAddress(address);
+//            rate.setAddress(address);
+            this.address = address;
         }
         if (ObjectUtil.isNotNull(rate.getGrade())) {
             this.grade = rate.getGrade().getDesc();

+ 41 - 1
src/main/java/com/izouma/wenlvju/service/RateService.java

@@ -1,6 +1,7 @@
 package com.izouma.wenlvju.service;
 
 import cn.hutool.core.collection.CollUtil;
+import com.github.kevinsawicki.http.HttpRequest;
 import com.izouma.wenlvju.config.DateConfig;
 import com.izouma.wenlvju.domain.Collaborate;
 import com.izouma.wenlvju.domain.GradingOrganization;
@@ -21,10 +22,11 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 
-import java.io.StringWriter;
+import java.io.*;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
 @Service
@@ -110,10 +112,48 @@ public class RateService {
             StringWriter writer = new StringWriter();
             Template template = configuration.getTemplate("RateTemplate.ftl", "utf-8");//以utf-8的编码读取ftl文件
             template.process(dataMap, writer);
+            System.out.println(writer.toString());
+
             return writer.toString();
         } catch (Exception e) {
             log.error("生成word错误", e);
             throw new BusinessException(e.getMessage());
         }
     }
+
+    public void upLoad(Rate rate) {
+        String uri = "http://192.168.50.238:8080/word2pdf";
+        // 表格
+        String export = this.export(rate);
+        InputStream is = new ByteArrayInputStream(export.getBytes());
+        String filename = "审核材料";
+        AtomicInteger num = new AtomicInteger(1);
+        HttpRequest.post(uri)
+                .accept("*/*")
+                .part("file", "审核材料.docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", is)
+                .receive(new File("/Users/qiufangchao/Desktop/" + filename + num + ".pdf"));
+
+        rate.getPrivacyPolicy().forEach(privacy -> {
+            num.getAndIncrement();
+            if (getSuffix(privacy).equals("doc") || getSuffix(privacy).equals("docx")) {
+                InputStream is1 = HttpRequest.get(privacy)
+                        .stream();
+                HttpRequest.post(uri)
+                        .accept("*/*")
+                        .part("file", "审核材料.docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", is1)
+                        .receive(new File("/Users/qiufangchao/Desktop/" + filename + num + ".pdf"));
+            } else if (getSuffix(privacy).equals("pdf")) {
+                HttpRequest.get(privacy)
+                        .receive(new File("/Users/qiufangchao/Desktop/" + filename + num + ".pdf"));
+            }
+        });
+    }
+
+    public String getSuffix(String url) {
+        int index = url.lastIndexOf(".");
+        if (index < 0) {
+            return "";
+        }
+        return url.substring(index);
+    }
 }

+ 254 - 0
src/main/vue/src/components/FileUpload2.vue

@@ -0,0 +1,254 @@
+<template>
+    <el-upload
+        class="file-upload"
+        :action="uploadUrl"
+        :on-success="onSuccess"
+        :headers="headers"
+        :file-list="fileList"
+        :limit="filesLimit"
+        :on-exceed="onExceed"
+        :on-preview="onPreview"
+        ref="upload"
+    >
+        <el-button type="primary" size="mini" slot="trigger" v-if="!readonly" plain>
+            点击上传
+        </el-button>
+        <div class="file-list-item" slot="file" slot-scope="{ file }">
+            <div class="file-name">
+                <i class="status-icon el-icon-warning-outline danger" v-if="file.status === 'fail'"></i>
+                <i class="status-icon el-icon-circle-check success" v-else-if="file.status === 'success'"></i>
+                <i class="status-icon el-icon-loading" v-else></i>
+                {{ file.name }}
+                <i class="opt">
+                    <i
+                        class="opt-icon el-icon-search"
+                        v-if="file.status === 'success' && isImage(file)"
+                        @click="preview(file)"
+                    ></i>
+                    <i class="opt-icon el-icon-download" v-if="file.status === 'success'" @click="download(file)"></i>
+                    <i class="opt-icon el-icon-delete" @click="removeFile(file)" v-if="!readonly"></i>
+                </i>
+            </div>
+            <el-progress
+                v-if="file.status === 'uploading'"
+                :percentage="file.percentage"
+                :show-text="false"
+                :stroke-width="2"
+                class="upload-progress"
+            ></el-progress>
+        </div>
+        <el-image style="width:0;height:0;" :src="previewUrl" :preview-src-list="[previewUrl]" ref="preview">
+        </el-image>
+    </el-upload>
+</template>
+
+<script>
+import resolveUrl from 'resolve-url';
+import axios from 'axios';
+export default {
+    name: 'FileUpload',
+    props: {
+        single: {
+            type: Boolean,
+            default() {
+                return false;
+            }
+        },
+        readonly: {
+            type: Boolean,
+            default() {
+                return false;
+            }
+        },
+        limit: {
+            type: Number,
+            default() {
+                return 50000;
+            }
+        },
+        value: {},
+        format: {
+            type: String,
+            default: 'string'
+        }
+    },
+    data() {
+        return {
+            fileList: [],
+            emitting: false,
+            uploadUrl: '',
+            previewUrl: null
+        };
+    },
+    computed: {
+        headers() {
+            return {
+                Authorization: 'Bearer ' + localStorage.getItem('token')
+            };
+        },
+        filesLimit() {
+            if (this.single) {
+                return 1;
+            }
+            return this.limit;
+        },
+        disabled() {
+            return this.fileList.length >= this.limit;
+        }
+    },
+    created() {
+        this.uploadUrl = resolveUrl(this.$baseUrl, 'upload/file');
+        this.update(this.value);
+    },
+    methods: {
+        onSuccess(res, file, fileList) {
+            file.url = res;
+            this.fileList = fileList;
+            this.emit();
+        },
+        update(value) {
+            if (this.filesLimit === 1) {
+                if (this.format === 'json') {
+                    this.fileList = value ? [{ name: value.name, url: value.url }] : [];
+                } else {
+                    this.fileList = value ? [{ name: value.split('/').pop(), url: value }] : [];
+                }
+            } else {
+                if (!value) {
+                    this.fileList = [];
+                } else {
+                    this.fileList = value.map(i => {
+                        if (this.format === 'json') {
+                            return { name: i.name, url: i.url };
+                        } else {
+                            return { name: i.split('/').pop(), url: i };
+                        }
+                        // return { name: i.name, url: i.url };
+                    });
+                }
+            }
+        },
+        onExceed(files, fileList) {
+            console.log(files, fileList);
+            this.$message.error(`最多上传${this.filesLimit}个文件`);
+        },
+        onPreview(file) {
+            console.log(file);
+        },
+        removeFile(file) {
+            if (file.status === 'uploading') {
+                this.$refs.upload.abort(file);
+            } else if (file.status === 'success') {
+                let index = this.fileList.findIndex(i => i.url === file.url);
+                if (index > -1) {
+                    this.fileList.splice(index, 1);
+                }
+            }
+            this.emit();
+        },
+        download(file) {
+            window.open(file.url, '_blank');
+        },
+        preview(file) {
+            this.previewUrl = file.url;
+            this.$nextTick(() => {
+                this.$refs.preview.clickHandler();
+            });
+        },
+        isImage(file) {
+            return /\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(file.url);
+        },
+        emit() {
+            this.emitting = true;
+            if (this.filesLimit === 1) {
+                if (this.format === 'json') {
+                    this.$emit(
+                        'input',
+                        this.fileList[0]
+                            ? {
+                                  name: this.fileList[0].name,
+                                  url: this.fileList[0].url
+                              }
+                            : null
+                    );
+                } else {
+                    this.$emit('input', this.fileList[0] ? this.fileList[0].url : null);
+                }
+            } else {
+                if (this.format === 'json') {
+                    this.$emit(
+                        'input',
+                        this.fileList.map(i => {
+                            return {
+                                name: i.name,
+                                url: i.url
+                            };
+                        })
+                    );
+                } else {
+                    this.$emit(
+                        'input',
+                        this.fileList.map(i => i.url)
+                    );
+                }
+            }
+            this.$nextTick(() => {
+                this.emitting = false;
+            });
+        }
+    },
+    watch: {
+        value(value) {
+            if (this.emitting) return;
+            this.update(value);
+        }
+    }
+};
+</script>
+
+<style lang="less" scoped>
+.file-list-item {
+    line-height: 1.8;
+    margin-top: 5px;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    overflow: hidden;
+    cursor: pointer;
+    .file-name {
+        padding: 0 90px 0 20px;
+    }
+    .upload-progress {
+        margin-top: 2px;
+        position: absolute;
+        bottom: 0;
+        left: 20px;
+        right: 0;
+        width: auto;
+    }
+    .danger {
+        color: #f56c6c;
+    }
+    .success {
+        color: #67c23a;
+    }
+    .status-icon {
+        position: absolute;
+        left: 0;
+        top: 0;
+        line-height: inherit;
+    }
+    .opt {
+        position: absolute;
+        right: 0;
+        top: 0;
+        line-height: inherit;
+        .opt-icon {
+            margin-left: 15px;
+            transition: color 0.3s;
+            &:hover {
+                color: #409eff;
+            }
+        }
+    }
+}
+</style>

+ 1 - 0
src/main/vue/src/views/AssignExpert.vue

@@ -49,6 +49,7 @@
                                 :options="artTypes"
                                 :show-all-levels="false"
                                 placeholder="请选择专业"
+                                :disabled="readonly"
                             >
                             </el-cascader>
                         </el-form-item>

+ 18 - 2
src/main/vue/src/views/RateList.vue

@@ -11,6 +11,13 @@
                 class="filter-item"
                 >导出EXCEL
             </el-button>
+            <el-input
+                placeholder="输入承办单位名称"
+                v-model="search"
+                clearable
+                class="filter-item"
+                @change="getData"
+            ></el-input>
             <el-select
                 style="width: 220px"
                 v-model="status"
@@ -18,6 +25,7 @@
                 class="filter-item"
                 multiple
                 clearable
+                @change="getData"
             >
                 <el-option
                     v-for="item in statusOptions"
@@ -26,7 +34,15 @@
                     :value="item.value"
                 ></el-option>
             </el-select>
-            <el-select style="width: 220px" v-model="grade" placeholder="请选择的等级" class="filter-item" clearable>
+            <el-select
+                style="width: 220px"
+                v-model="grade"
+                placeholder="请选择的等级"
+                class="filter-item"
+                clearable
+                multiple
+                @change="getData"
+            >
                 <el-option
                     v-for="item in gradeOptions"
                     :key="item.value"
@@ -34,7 +50,7 @@
                     :value="item.value"
                 ></el-option>
             </el-select>
-            <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
+            <!-- <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button> -->
         </div>
         <el-table
             :data="tableData"

+ 1 - 1
src/main/vue/src/views/organization/Organization.vue

@@ -23,7 +23,7 @@ export default {
         ) {
             this.status = false;
         }
-        if (data == 'SUBMIT_GRADE' || data == 'COMPLETE') {
+        if (data == 'SUBMIT_GRADE' || data == 'COMPLETE' || data == 'SUBMIT_PAPER_MATERIALS') {
             this.grade = false;
         }
     },

+ 1 - 0
src/main/vue/src/views/organization/RateEdit.vue

@@ -235,6 +235,7 @@
                     </div>
                 </div>
             </div>
+            <el-divider direction="horizontal" content-position="left">初审记录</el-divider>
             <div class="info-content" v-for="(item, index) in rateAudits" :key="index">
                 <div class="info-item" style="margin-bottom: 10px">
                     <div class="name">操作时间</div>

+ 1 - 2
src/test/java/com/izouma/wenlvju/service/RateExpertAuditServiceTest.java

@@ -14,10 +14,9 @@ public class RateExpertAuditServiceTest extends ApplicationTests {
     private RateExpertAuditService rateExpertAuditService;
 
     @Test
-    public void test(){
+    public void test() {
         String str = "[{\"rateId\":\"162\",\"type\":\"examOrganization\",\"score\":2,\"img\":[\"https://ticket-exchange.oss-cn-hangzhou.aliyuncs.com/image/2021-04-21-18-08-22sHaeBMxp.png\",\"https://ticket-exchange.oss-cn-hangzhou.aliyuncs.com/image/2021-04-21-18-08-26FnGfZASi.png\"]},{\"rateId\":\"162\",\"type\":\"examSite\",\"score\":4,\"img\":[]},{\"rateId\":\"162\",\"type\":\"examRoom\",\"score\":2,\"img\":[]},{\"rateId\":\"162\",\"type\":\"environment\",\"score\":4,\"img\":[]},{\"rateId\":\"162\",\"type\":\"safety\",\"score\":4,\"img\":[]},{\"rateId\":\"162\",\"type\":\"promote\",\"score\":2,\"img\":[]},{\"rateId\":\"162\",\"type\":\"signUp\",\"score\":2,\"img\":[]},{\"rateId\":\"162\",\"type\":\"examPreparation\",\"score\":3,\"img\":[]},{\"rateId\":\"162\",\"type\":\"examService\",\"score\":5,\"img\":[]},{\"rateId\":\"162\",\"type\":\"examiner\",\"score\":5,\"img\":[]},{\"rateId\":\"162\",\"type\":\"specification\",\"score\":5,\"img\":[]},{\"rateId\":\"162\",\"type\":\"video\",\"score\":5,\"img\":[]},{\"rateId\":\"162\",\"type\":\"score\",\"score\":3,\"img\":[]},{\"rateId\":\"162\",\"type\":\"artTrain\",\"score\":4,\"img\":[]},{\"rateId\":\"162\",\"type\":\"artResult\",\"score\":5,\"img\":[]}]";
         List<RateExpertAudit> audits = JSONObject.parseArray(str, RateExpertAudit.class);
         rateExpertAuditService.batchSave(audits);
     }
-
 }

+ 23 - 0
src/test/java/com/izouma/wenlvju/service/RateServiceTest.java

@@ -0,0 +1,23 @@
+package com.izouma.wenlvju.service;
+
+
+import com.izouma.wenlvju.ApplicationTests;
+import com.izouma.wenlvju.domain.Rate;
+import com.izouma.wenlvju.exception.BusinessException;
+import com.izouma.wenlvju.repo.RateRepo;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+
+public class RateServiceTest extends ApplicationTests {
+    @Autowired
+    private RateService rateService;
+    @Autowired
+    private RateRepo    rateRepo;
+
+    @Test
+    public void test() {
+        Rate rate = rateRepo.findById(467L).orElseThrow(new BusinessException("无记录"));
+        rateService.upLoad(rate);
+    }
+}

+ 65 - 2
src/test/java/com/izouma/wenlvju/web/RateControllerTest.java

@@ -1,10 +1,18 @@
 package com.izouma.wenlvju.web;
 
 
+import com.github.kevinsawicki.http.HttpRequest;
 import com.izouma.wenlvju.ApplicationTests;
+import org.apache.commons.io.IOUtils;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
 import java.time.LocalDateTime;
 
 public class RateControllerTest extends ApplicationTests {
@@ -12,13 +20,68 @@ public class RateControllerTest extends ApplicationTests {
     private RateController rateController;
 
     @Test
-    public void test(){
+    public void test() {
         System.out.println(rateController.get1(162L));
     }
 
     @Test
-    public void test1(){
+    public void test1() {
         rateController.saveReviewTime(162L, LocalDateTime.now());
     }
 
+    @Test
+    public void test2() {
+//        String targetPath = "";
+//        // pdf合并工具类
+//        PDFMergerUtility mergePdf = new PDFMergerUtility();
+//        for (File f : files) {
+//            if (f.exists() && f.isFile()) {
+//                // 循环添加要合并的pdf
+//                mergePdf.addSource(f);
+//            }
+//        }
+//        // 设置合并生成pdf文件名称
+//        mergePdf.setDestinationFileName(targetPath);
+//        // 合并pdf
+//        mergePdf.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
+//        return new File(targetPath);
+
+    }
+
+    @Test
+    public void test3() {
+        String uri = "http://192.168.50.238:8080/word2pdf";
+        // String uri = "http://frp.drewslab.cn:2223/word2pdf";
+        // java输出文件
+//        String export = rateController.export(410L);
+//        InputStream is = new ByteArrayInputStream(export.getBytes());
+//        本地文件
+//        File file = new File("/Users/qiufangchao/Desktop/20210422.doc");
+//        System.out.println(file.exists());
+
+
+//        HttpURLConnection conn;
+//        InputStream is = null;
+//        try {
+//            URL url = new URL("https://ticket-exchange.oss-cn-hangzhou.aliyuncs.com/application/2021-04-22-09-31-18HXEusrCL.docx");
+//            conn = (HttpURLConnection)url.openConnection();
+//            conn.setRequestMethod("GET");
+//            conn.setConnectTimeout(20 * 1000);
+//            final ByteArrayOutputStream output = new ByteArrayOutputStream();
+//            IOUtils.copy(conn.getInputStream(),output);
+//            is =  new ByteArrayInputStream(output.toByteArray());
+//            is = conn.getInputStream();
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+
+        InputStream is = HttpRequest.get("https://ticket-exchange.oss-cn-hangzhou.aliyuncs.com/application/2021-04-22-09-31-18HXEusrCL.docx")
+                .stream();
+
+        HttpRequest.post("http://192.168.50.238:8080/word2pdf")
+                .accept("*/*")
+                .part("file", "审核材料.docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", is)
+                .receive(new File("/Users/qiufangchao/Desktop/审核材料1.pdf"));
+    }
+
 }