linzhijie
2021-04-12 2f737df6f8e482540a465445bdb003d98103db54
第二次无注释的源码
23个文件已修改
1个文件已删除
620 ■■■■■ 已修改文件
README.md 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ots/OtsApplication.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ots/project/exam/controller/EntTestMemberController.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ots/project/exam/controller/EnterpriseController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ots/project/exam/controller/TExamReportController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ots/project/exam/domain/EntTestMember.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ots/project/exam/mapper/TExamReportMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ots/project/exam/service/ITExamReportService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ots/project/exam/service/impl/CountCalculateServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ots/project/exam/service/impl/TExamReportServiceImpl.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-sand.yml 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mailConfig.properties 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mybatis/exam/EntTestMemberMapper.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mybatis/exam/TExamReportMapper.xml 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/static/i18n/messages_zh_CN.properties 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/static/ots.jpg 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/templates/exam/enterprise/add.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/templates/exam/testMember/testMember.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/templates/exam/test_package/test_package.html 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/templates/exam/userpaper/edit.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/templates/exam/userpaper/userPaper.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/templates/main.html 232 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
README.md
pom.xml
@@ -248,13 +248,7 @@
            <artifactId>springfox-swagger-ui</artifactId>
            <version>${swagger.version}</version>
        </dependency>
        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>
        <!-- 获取系统信息 -->
        <dependency>
            <groupId>com.github.oshi</groupId>
@@ -360,75 +354,12 @@
            <version>13.0</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.ots</groupId>
            <artifactId>tai-ots-framework</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
<!--    <build>-->
<!--        <finalName>${project.artifactId}</finalName>-->
<!--        <plugins>-->
<!--            <plugin>-->
<!--                <groupId>org.springframework.boot</groupId>-->
<!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
<!--                <configuration>-->
<!--                    <fork>true</fork> &lt;!&ndash; 如果没有该配置,devtools不会生效 &ndash;&gt;-->
<!--                </configuration>-->
<!--            </plugin>-->
<!--        </plugins>-->
<!--    </build>-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>utf-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.ots.OtsApplication</mainClass>
                    <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
                </configuration>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
    </dependencies>
</project>
src/main/java/com/ots/OtsApplication.java
@@ -1,28 +1,10 @@
package com.ots;
import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.jasypt.encryption.StringEncryptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableEncryptableProperties
public class OtsApplication implements CommandLineRunner {
    private static final Logger l = LoggerFactory.getLogger(OtsApplication.class);
    @Autowired
    private StringEncryptor stringEncryptor;
    @Autowired
    private ApplicationContext applicationContext;
public class OtsApplication {
    public static void main(String[] args) {
        
        SpringApplication.run(OtsApplication.class, args);
@@ -34,11 +16,5 @@
        builder.append("**     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^      **\n");
        builder.append("********************************************************************\n");
        System.out.println(builder.toString());
    }
    @Override
    public void run(String... args) throws Exception {
        Environment environment = applicationContext.getEnvironment();
        l.info(stringEncryptor.encrypt(environment.getProperty("password")));
    }
}
src/main/java/com/ots/project/exam/controller/EntTestMemberController.java
@@ -1,6 +1,7 @@
package com.ots.project.exam.controller;
import com.ots.common.constant.UserConstants;
import com.ots.common.enums.SenderType;
import com.ots.common.enums.TestMemberStatusEnum;
import com.ots.common.enums.TestPackageStatusEnum;
import com.ots.common.enums.UserTypeEnum;
import com.ots.common.utils.MessageUtils;
@@ -31,6 +32,7 @@
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import static com.ots.common.enums.TestMemberStatusEnum.*;
import static com.ots.common.enums.UserTypeEnum.SYS_USER;
@Controller
@@ -137,6 +139,20 @@
        if (!SYS_USER.getUserType().equals(sysUser.getUserType())) {
            entTestMember.setUserId(sysUser.getUserId());
        }
        List<String> recyclingStatus = Arrays.asList( TestMemberStatusEnum.completed.getCode(), timeOut.getCode());
        entTestMember.setStatusList(recyclingStatus);
        return getDataTable(entTestMemberService.selectEntTestMemberTopList(entTestMember));
    }
    @PostMapping("/listTopAnswering2")
    @ResponseBody
    public TableDataInfo listTopAnswering2(EntTestMember entTestMember) {
        startPage();
        User sysUser = ShiroUtils.getSysUser();
        if (!SYS_USER.getUserType().equals(sysUser.getUserType())) {
            entTestMember.setUserId(sysUser.getUserId());
        }
        List<String> recyclingStatus = Arrays.asList( answering.getCode());
        entTestMember.setStatusList(recyclingStatus);
        return getDataTable(entTestMemberService.selectEntTestMemberTopList(entTestMember));
    }
    @PostMapping("/queryList")
src/main/java/com/ots/project/exam/controller/EnterpriseController.java
@@ -128,6 +128,16 @@
    public AjaxResult editSave(@PathVariable("userId") Long userId, @PathVariable("addNum") Long addNum) {
        return toAjax(sysUserExtendService.updateTestNum(userId, addNum));
    }
    @PostMapping("/checkUser")
    @ResponseBody
    public AjaxResult checkUser() {
        User sysUser = ShiroUtils.getSysUser();
        int result = 0;
        if ("02".equals(sysUser.getUserType())) {
            result = 1;
        }
        return toAjax(result);
    }
    @RequiresPermissions("exam:enterprise:remove")
    @PostMapping("/remove")
    @ResponseBody
src/main/java/com/ots/project/exam/controller/TExamReportController.java
@@ -350,7 +350,8 @@
        
        setSysHeadToEnglish(tExamReportList, reportResultMap, reportType);
        
        writeFile(fileNameResult, reportResultMap);
        writeMutiFile(fileNameResult, reportResultMap);
        
        return AjaxResult.success(examUtilService.getLangOrLocalLangString("", tExamReportList.get(0).getProductName()) + "_DateReport.xlsx");
    }
@@ -447,6 +448,22 @@
            writer.close();
        }
    }
    private void writeMutiFile(String fileNameResult, Map<String, List<List<Object>>> reportResultMap) {
        FileUtil.del(fileNameResult);
        ExcelWriter writer = null;
        for (Map.Entry<String, List<List<Object>>> entryReport : reportResultMap.entrySet()) {
            if (Objects.isNull(writer)) {
                writer = new ExcelWriter(fileNameResult,entryReport.getKey());
            }
            writer.setSheet(entryReport.getKey());
            StyleSet styleSet = writer.getStyleSet();
            styleSet.setBorder(BorderStyle.NONE, IndexedColors.OLIVE_GREEN);
            writer.write(entryReport.getValue(), true);
            writer.autoSizeColumnAll();
            writer.setSheet(entryReport.getKey());
        }
        writer.close();
    }
    private void setReportResultList(List<Object> demographyHeadSystem, List<List<Object>> reportResultList, Map<String, Object> textMap) {
        
        List<Object> reportValue = new ArrayList<>();
@@ -476,6 +493,10 @@
    private String getReportType(TExamReport tExamReport) {
        String reportType = ReportTypeEnum.RuiLin.getCode();
        TExamPaper tExamPaper = itExamPaperService.selectTExamPaperById(tExamReport.getProductId());
        tExamPaper.getName();
        if (tExamPaper.getName().indexOf("睿邻")>0 || tExamPaper.getName().indexOf("RuiLin")>0 ) {
            return reportType;
        }
        List<TReportTemplate> tReportTemplateList = itReportTemplateService.selectTReportTemplates(tExamPaper.getReportTemplateId());
        for (TReportTemplate tReportTemplate : tReportTemplateList) {
            if (Objects.isNull(tReportTemplate.getReportType())) {
src/main/java/com/ots/project/exam/domain/EntTestMember.java
@@ -45,6 +45,7 @@
    private Date emailTime;
    
    private String status;
    private List<String> statusList;
    private String firstName;
    private String lastName;
    private String userName;
src/main/java/com/ots/project/exam/mapper/TExamReportMapper.java
@@ -8,6 +8,7 @@
    TExamReport selectTExamReportById(Long id);
    
    List<TExamReport> selectTExamReportList(TExamReport tExamReport);
    List<TExamReport> selectTExamReportNoStatusList(TExamReport tExamReport);
    List<TExamReport> selectTExamHrEmailiReportList(TExamReport tExamReport);
    List<TExamReport> selectViewReportList(TExamReport tExamReport);
    List<TExamReport> selectHrResendTask(TExamReport tExamReport);
src/main/java/com/ots/project/exam/service/ITExamReportService.java
@@ -13,6 +13,7 @@
    TExamReport selectTExamReportById(Long id);
    
    List<TExamReport> selectTExamReportList(TExamReport tExamReport);
    List<TExamReport> selectTExamReportNoStatusList(TExamReport tExamReport);
    
    List<TExamReport> selectViewReportList(TExamReport tExamReport);
    
src/main/java/com/ots/project/exam/service/impl/CountCalculateServiceImpl.java
@@ -9,6 +9,8 @@
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.stream.Collectors;
import static com.ots.common.enums.TestMemberStatusEnum.answering;
import static com.ots.common.enums.TestMemberStatusEnum.timeOut;
@Component
public class CountCalculateServiceImpl implements CountCalculateService {
@@ -66,7 +68,7 @@
            if (Objects.nonNull(testMembers)) {
                total = Long.valueOf(testMembers.size());
                finishNum = testMembers.stream().filter(testMember -> TestMemberStatusEnum.completed.getCode().equals(testMember.getStatus())).mapToLong(x -> 1).sum();
                testIngNum = testMembers.stream().filter(testMember -> TestMemberStatusEnum.answering.getCode().equals(testMember.getStatus())).mapToLong(x -> 1).sum();
                testIngNum = testMembers.stream().filter(testMember -> answering.getCode().equals(testMember.getStatus())).mapToLong(x -> 1).sum();
                unTestNum = total - testIngNum - finishNum;
            }
            numberOfUsersByPackage.setTestNum(total);
@@ -84,7 +86,7 @@
        Map map = new HashMap();
        map.put("testIds", collect);
        
        List<String> recyclingStatus = Arrays.asList(TestMemberStatusEnum.unprocessed.getCode(), TestMemberStatusEnum.completed.getCode(), TestMemberStatusEnum.answering.getCode());
        List<String> recyclingStatus = Arrays.asList(TestMemberStatusEnum.unprocessed.getCode(), TestMemberStatusEnum.completed.getCode(), answering.getCode(), timeOut.getCode());
        map.put("status", recyclingStatus);
        return entTestMemberMapper.selectEntTestMemberListByMap(map);
    }
src/main/java/com/ots/project/exam/service/impl/TExamReportServiceImpl.java
@@ -1,5 +1,6 @@
package com.ots.project.exam.service.impl;
import cn.hutool.core.collection.CollUtil;
import lombok.extern.slf4j.Slf4j;
import com.ots.common.enums.LangTypeEnum;
import com.ots.common.enums.ReportTypeEnum;
import com.ots.common.enums.TemplateTypeEnum;
@@ -35,6 +36,7 @@
import com.ots.project.tool.exam.JsonUtil;
import com.ots.project.tool.report.CAQ.CAQReport;
import com.ots.project.tool.report.MAQ.MAQReport;
import com.ots.project.tool.report.MAQNEW.MAQReport_V2;
import com.ots.project.tool.report.ReportResultData;
import com.ots.project.tool.report.RuilinMAQ.RuilinMAQReport;
import com.ots.project.tool.report.SAQ.SAQReport;
@@ -60,6 +62,7 @@
import java.util.stream.Collectors;
@Service
@Slf4j
public class TExamReportServiceImpl implements ITExamReportService {
    @Autowired
    private TExamReportMapper tExamReportMapper;
@@ -89,6 +92,10 @@
    @Override
    public List<TExamReport> selectTExamReportList(TExamReport tExamReport) {
        return tExamReportMapper.selectTExamReportList(tExamReport);
    }
    @Override
    public List<TExamReport> selectTExamReportNoStatusList(TExamReport tExamReport) {
        return tExamReportMapper.selectTExamReportNoStatusList(tExamReport);
    }
    @Override
    public List<TExamReport> selectViewReportList(TExamReport tExamReport) {
@@ -249,6 +256,8 @@
            resultData = getSAQReportData(langType, ReportTypeEnum.codeOf(reportType), entry, tExamReport);
        } else if (Objects.equals(reportType, ReportTypeEnum.JAQ.getCode())) {
            resultData = getJAQReportData(entry.getValue());
        } else if(Objects.equals(reportType, ReportTypeEnum.MAQV2.getCode())){
            resultData = getMAQ_V2ReportData(langType, ReportTypeEnum.codeOf(reportType), entry, tExamReport);
        } else {
            resultData = getMAQReportData(langType, ReportTypeEnum.codeOf(reportType), entry, tExamReport);
        }
@@ -293,6 +302,7 @@
        dataMap.put("password", tExamReport.getTokenId());
        dataMap.put("reportId", tExamReport.getId().toString());
        dataMap.put("userName", tExamReport.getUserName());
        dataMap.put("memberName", tExamReport.getMemberName());
        dataMap.put("reportTemplateId", tExamReport.getReportTemplateId());
        dataMap.put("Begin Time", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, tExamReport.getCreateTime()));
        dataMap.put("End Time", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, tExamReport.getUpdateTime()));
@@ -300,6 +310,9 @@
        dataMap.put("Test Package", ExamUtil.getLangString(tExamReport.getLangType(), tExamReport.getTestName()));
        dataMap.put("Test", ExamUtil.getLangString(tExamReport.getLangType(), tExamReport.getProductName()));
        EntTestMember entTestMember = entTestMemberService.selectEntTestMemberById(tExamReport.getMemberId().longValue());
        if (Objects.isNull(entTestMember)) {
            return;
        }
        dataMap.put("reportGenerationDate", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, entTestMember.getEndTime()));
        List<ReportAPIResult> interfaceContentList = JsonUtil.parseArray(tExamReport.getInterfaceContent(), ReportAPIResult.class);
        
@@ -377,6 +390,19 @@
            }
        }
        return "";
    }
    public ReportResultData getMAQ_V2ReportData(String langType, ReportTypeEnum reportTypeEnum, Map.Entry<String, Map<String, String>> entry, TExamReport tExamReport) {
        MAQReport_V2 report = new MAQReport_V2();
        report.setQuestionnaireTaker(entry.getValue().get("memberName"));
        report.setQuestionnaireID(entry.getValue().get("password"));
        report.setReportGenerationDate(entry.getValue().get("reportGenerationDate"));
        report.setQuestionnaireEmail(entry.getValue().get("testEmail"));
        report.setUserName(entry.getValue().get("userName"));
        report.setQuestionnaireStartTime(entry.getValue().get("beginTime"));
        report.setQuestionnaireEndTime(entry.getValue().get("endTime"));
        tExamReport.setId(Long.valueOf(entry.getValue().get("reportId")));
        ReportResultData resultData = report.getTemplateParameters(entry.getValue(), reportTypeEnum, LangTypeEnum.codeOf(langType));
        return resultData;
    }
    public ReportResultData getMAQReportData(String langType, ReportTypeEnum reportTypeEnum, Map.Entry<String, Map<String, String>> entry, TExamReport tExamReport) {
        MAQReport report = new MAQReport();
@@ -500,6 +526,9 @@
        String[] waterDropPicture = key.split("_");
        
        String waterDropName =StringUtils.isNotEmpty(ExamUtil.getWaterDropPictureMap(waterDropPicture[0])) ? ExamUtil.getWaterDropPictureMap(waterDropPicture[0]) : ExamUtil.getWaterDropPictureMap(key);
        if(waterDropPicture[1].equals("V2")){
            waterDropName = ExamUtil.getWaterDropPictureMap("ResponseFidelityDiagnosis_V2");
        }
        if (StringUtils.isEmpty(waterDropName)) {
            return;
        }
@@ -512,9 +541,17 @@
        deleteStrList.add(EssConfig.getProfile() + "/" + key + "_" + id + "_" + floatValue.toString() + "_" + suffixDate + ".png");
        
        if (StringUtils.equals(key.split("_")[0], "ResponseFidelityDiagnosis")) {
            wordParam.setPicWidth(446);
            wordParam.setPicHeight(33);
        } else if (StringUtils.equals(key.split("_")[0], "RuilinTestResultValidityDiagnosisContext")) {
            if(StringUtils.equals(key.split("_")[1], "V2")){
                wordParam.setPicWidth(210);
                wordParam.setPicHeight(50);
            }else{
                wordParam.setPicWidth(446);
                wordParam.setPicHeight(33);
            }
        } else if (StringUtils.equals(key.split("_")[0], "ResponseFidelityDiagnosisV2")){
            wordParam.setPicWidth(210);
            wordParam.setPicHeight(33);
        }else if (StringUtils.equals(key.split("_")[0], "RuilinTestResultValidityDiagnosisContext")) {
            wordParam.setPicWidth(450);
            wordParam.setPicHeight(35);
            wordParam.setX(-13.75);
@@ -549,6 +586,7 @@
                fileNameResult.add(EssConfig.getProfile() + "/" + fileNameTemp);
            }
        } catch (Exception e) {
            log.error("发生异常:{}", e);
            return false;
        }
        return true;
src/main/resources/application-sand.yml
@@ -1,35 +1,56 @@
# 项目相关配置
ots:
    # 名称
    name: ots
    # 版本
    version: 1.0.5
    # 版权年份
    copyrightYear: 2020
    # 实例演示开关
    demoEnabled: false
    # 文件路径 示例( Windows配置D:/ots/uploadPath,Linux配置 /home/data/ots/uploadPath)
    profile: /home/data/ots/uploadPath
    # 图片的url,如:vue端读http://139.199.11.114/images地址
    imagePath: http://120.24.39.179:8090/profile/images
    # 获取ip地址开关
    addressEnabled: true
    # 报告模版地址
    reportTemplates: /home/data/ots/reportTemplates/
    # http profile
    httpProfilePath: http://120.24.39.179:8090/profile
# 数据源配置
spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        druid:
            # 主库数据源
            master:
                url: jdbc:mysql://120.24.39.179:3306/ots-sand?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                url: jdbc:mysql://127.0.0.1:3306/ots-sand?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                username: root
                password: TAI@2019#Zjun
            # 从库数据源
            slave:
                # 从数据源开关/默认关闭
                enabled: false
                url: 
                username: 
                password:
                password:
            # 初始连接数
            initialSize: 5
            # 最小连接池数量
            minIdle: 10
            # 最大连接池数量
            maxActive: 20
            # 配置获取连接等待超时的时间
            maxWait: 60000
            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
            timeBetweenEvictionRunsMillis: 60000
            # 配置一个连接在池中最小生存的时间,单位是毫秒
            minEvictableIdleTimeMillis: 300000
            # 配置一个连接在池中最大生存的时间,单位是毫秒
            maxEvictableIdleTimeMillis: 900000
            # 配置检测连接是否有效
            validationQuery: SELECT 1 FROM DUAL
            testWhileIdle: true
            testOnBorrow: false
@@ -38,29 +59,30 @@
                enabled: true
            statViewServlet:
                enabled: true
                # 设置白名单,不填则允许所有访问
                allow:
                url-pattern: /druid/*
                # 控制台管理用户名和密码
                login-username: 
                login-password: 
            filter:
                stat:
                    enabled: true
                    # 慢SQL记录
                    log-slow-sql: true
                    slow-sql-millis: 1000
                    merge-sql: true
                wall:
                    config:
                        multi-statement-allow: true
# 邮件服务
mail:
# VUE端访问地址
vue:
    url: http://120.24.39.179/exam-stu/#/ots/{0}/login
# 远程泰国计算服务
ATSTai:
    host: 127.0.0.1
    port: 9123
jasypt:
    encryptor:
        password: 5ciqxnka5s02w9qu
        algorithm: PBEWithMD5AndDES
    port: 9123
src/main/resources/application.yml
@@ -1,78 +1,125 @@
# 环境配置
server:
  # 服务器的HTTP端口,默认为80
  port: 8090
  servlet:
    # 应用的访问路径
    context-path: /
  tomcat:
    # tomcat的URI编码
    uri-encoding: UTF-8
    # tomcat最大线程数,默认为200
    max-threads: 800
    # Tomcat启动初始化的线程数,默认值25
    min-spare-threads: 30
# 日志配置
logging:
  level:
    com.ots: debug
    org.springframework: warn
# 用户配置
user:
  password:
    # 密码错误{maxRetryCount}次锁定10分钟
    maxRetryCount: 5
# Spring配置
spring:
  # 模板引擎
  thymeleaf:
    mode: HTML
    encoding: utf-8
    # 禁用缓存
    cache: false
  # 资源信息
  messages:
    # 国际化资源文件路径
    basename: static/i18n/messages
  jackson:
    time-zone: GMT+8
    date-format: yyyy-MM-dd HH:mm:ss
  profiles: 
    active: sand
    active: dev
  # 文件上传
  servlet:
     multipart:
       # 单个文件大小
       max-file-size:  10MB
       # 设置总上传的文件大小
       max-request-size:  20MB
  # 服务模块
  devtools:
    restart:
      # 热部署开关
      enabled: true
# MyBatis
mybatis:
    # 搜索指定包别名
    typeAliasesPackage: com.ots.project
    # 配置mapper的扫描,找到所有的mapper.xml映射文件
    mapperLocations: classpath:mybatis/**/*Mapper.xml
    # 加载全局的配置文件
    configLocation: classpath:mybatis/mybatis-config.xml
# PageHelper分页插件
pagehelper: 
  helperDialect: mysql
  reasonable: true
  supportMethodsArguments: true
  params: count=countSql 
# Shiro
shiro:
  user:
    # 登录地址
    loginUrl: /login
    # 权限认证失败地址
    unauthorizedUrl: /unauth
    # 首页地址
    indexUrl: /index
    # 验证码开关
    captchaEnabled: true
    # 验证码类型 math 数组计算 char 字符
    captchaType: math
  cookie:
    domain:
    # 设置Cookie的域名 默认空,即当前访问的域名
    domain:
    # 设置cookie的有效访问路径
    path: /
    # 设置HttpOnly属性
    httpOnly: true
    # 设置Cookie的过期时间,天为单位
    maxAge: 30
  session:
    # Session超时时间(默认30分钟)
    expireTime: 30
    # 同步session到数据库的周期(默认1分钟)
    dbSyncPeriod: 1
    # 相隔多久检查一次session的有效性,默认就是10分钟
    validationInterval: 10
    # 同一个用户最大会话数,比如2的意思是同一个账号允许最多同时两个人登录(默认-1不限制)
    maxSession: -1
    # 踢出之前登录的/之后登录的用户,默认踢出之前登录的用户
    kickoutAfter: false
xss:
# 防止XSS攻击
xss:
  # 过滤开关
  enabled: true
  # 排除链接(多个用逗号分隔)
  excludes: /system/notice/*
  # 匹配链接
  urlPatterns: /system/*,/monitor/*,/tool/*
gen:
# 代码生成
gen:
  # 作者
  author: ots
  # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
  packageName: com.ots.project
  # 自动去除表前缀,默认是true
  autoRemovePre: true
  # 表前缀(类名不会包含表前缀)
  tablePrefix: sys_
src/main/resources/mailConfig.properties
@@ -3,13 +3,13 @@
#\u7AEF\u53E3\u53F7
mailPort=25
#\u90AE\u7BB1\u8D26\u53F7
mailUsername=xxxxx
mailUsername=
#\u90AE\u7BB1\u6388\u6743\u7801
mailPassword=xxxxxx
mailPassword=
#\u65F6\u95F4\u5EF6\u8FDF
mailTimeout=25000
#\u53D1\u9001\u4EBA
mailFrom=xxxxx
mailFrom=
#\u53D1\u4EF6\u4EBA
personal=\u9ED1\u767D\u8272\u8C03
#\u4E3B\u9898
src/main/resources/mybatis/exam/EntTestMemberMapper.xml
@@ -69,7 +69,11 @@
            <if test="memberEmail != null  and memberEmail != ''"> and m.member_email like concat('%',   #{memberEmail}, '%')</if>
            <if test="memberPhone != null  and memberPhone != ''"> and m.member_phone like concat('%',   #{memberPhone}, '%')</if>
            <if test="testId != null "> and m.test_id = #{testId}</if>
            <if test="status != null  and status != ''"> and m.status = #{status}</if>
            <if test="statusList != null "> and m.status in
                <foreach item="status" collection="statusList" open="(" separator="," close=")">
                    #{status}
                </foreach>
            </if>
            <if test="userId != null  and userId != ''"> and u.user_id = #{userId}</if>
        </where>
    </select>
src/main/resources/mybatis/exam/TExamReportMapper.xml
@@ -72,6 +72,34 @@
        left join sys_user_extend e on e.user_id = u.user_id
    </sql>
    <sql id = "selectTExamReportListVoForReport">
        select m.member_dept,p.status,t.id, t.product_id, t.product_name, t.content, t.token_id, t.create_time, t.update_time, t.states,
        t.last_content,t.choice,t.do_time, t.question_count, t.member_id,t.user_id,t.parent_id,t.downloadTimes,t.verifyStatus,t.test_id,
        t.finish,m.member_name,p.test_name,u.user_name,t.question_order, t.question_report, t.question_template_id, t.interface_content,
        t.lang_type, t.report_address, p.report_template_id, t.send_hr_status, t.send_tester_status, m.member_email, p.test_email,
        t.member_name, p.auto_send_report, e.hr_email, e.mail_content, t.option_order, t.remain_part_time,
         t.report_address_new,t.hrReportEmail,t.hrTitle,t.hrSendTime,t.hrUpdateTime,t.retriesTime
         from t_exam_report t
        left join sys_user u on u.user_id = t.user_id
        right join ent_test_member m on m.member_id = t.member_id and m.status = '1'
        left join ent_test_package p on p.id = t.test_id
        left join sys_user_extend e on e.user_id = u.user_id
    </sql>
    <sql id = "selectTExamReportListNoStatusVo">
        select m.member_dept,p.status,t.id, t.product_id, t.product_name, t.content, t.token_id, t.create_time, t.update_time, t.states,
        t.last_content,t.choice,t.do_time, t.question_count, t.member_id,t.user_id,t.parent_id,t.downloadTimes,t.verifyStatus,t.test_id,
        t.finish,m.member_name,p.test_name,u.user_name,t.question_order, t.question_report, t.question_template_id, t.interface_content,
        t.lang_type, t.report_address, p.report_template_id, t.send_hr_status, t.send_tester_status, m.member_email, p.test_email,
        t.member_name, p.auto_send_report, e.hr_email, e.mail_content, t.option_order, t.remain_part_time,
         t.report_address_new,t.hrReportEmail,t.hrTitle,t.hrSendTime,t.hrUpdateTime,t.retriesTime
         from t_exam_report t
        left join sys_user u on u.user_id = t.user_id
        right join ent_test_member m on m.member_id = t.member_id
        left join ent_test_package p on p.id = t.test_id
        left join sys_user_extend e on e.user_id = u.user_id
    </sql>
    <select id="selectTExamReportList" parameterType="TExamReport" resultMap="TExamReportResult">
        <include refid="selectTExamReportListVo"/>
        <where>  
@@ -104,6 +132,38 @@
        </where>
    </select>
    <select id="selectTExamReportNoStatusList" parameterType="TExamReport" resultMap="TExamReportResult">
        <include refid="selectTExamReportListVo"/>
        <where>
            <if test="id != null "> and t.id = #{id}</if>
            <if test="productId != null "> and t.product_id = #{productId}</if>
            <if test="tokenId != null  and tokenId != ''"> and t.token_id = #{tokenId}</if>
            <if test="downloadTimes != null "> and t.downloadTimes = #{downloadTimes}</if>
            <if test="verifyStatus != null "> and t.verifyStatus = #{verifyStatus}</if>
            <if test="memberId != null  and memberId != ''"> and t.member_id = #{memberId}</if>
            <if test="productName != null  and productName != ''"> and t.product_name like concat('%', #{productName}, '%')</if>
            <if test="userName != null  and userName != ''"> and u.user_name like concat('%', #{userName}, '%')</if>
            <if test="testName != null  and testName != ''"> and u.test_name like concat('%', #{testName}, '%')</if>
            <if test="memberName != null  and memberName != ''"> and m.member_name like concat('%', #{memberName}, '%')</if>
            <if test="testId != null  and testId != ''"> and t.test_id = #{testId}</if>
            <if test="status != null  and status != ''"> and p.status = #{status}</if>
            <if test="finish != null  and finish != ''"> and t.finish = #{finish}</if>
            <if test="sendTesterStatus != null"> and t.send_tester_status = #{sendTesterStatus}</if>
            <if test="hrReportEmail != null"> and t.hrReportEmail = #{hrReportEmail}</if>
            <if test="sendHrStatus != null"> and t.send_hr_status = #{sendHrStatus}</if>
            <if test="sendHrStatusList != null"> and t.send_hr_status in
                <foreach collection="sendHrStatusList" item="sendStatus" open="(" separator="," close=")">
                    #{sendStatus}
                </foreach>
            </if>
            <if test="userIds != null"> and t.user_id in
                <foreach collection="userIds" item="userId" open="(" separator="," close=")">
                    #{userId}
                </foreach>
            </if>
        </where>
    </select>
    <select id="selectTExamHrEmailiReportList" parameterType="TExamReport" resultMap="TExamReportResult">
        select id, product_id, product_name, content, token_id, create_time, update_time, states,last_content,choice,do_time, question_count, member_id,user_id,parent_id,downloadTimes,verifyStatus,test_id,finish, question_order, question_report, question_template_id, interface_content, lang_type, report_address, report_template_id, send_hr_status, send_tester_status, member_name, option_order, remain_part_time from t_exam_report
        <where>
src/main/resources/static/i18n/messages_zh_CN.properties
@@ -308,7 +308,7 @@
jsp.exam.report.userCode=\u7528\u6237\u7F16\u7801
jsp.exam.report.downloadPermissions=\u4E0B\u8F7D\u6743\u9650
jsp.exam.report.answerStatus=\u7B54\u9898\u72B6\u6001
jsp.exam.report.exportEvaluationUserAnswerRecords=\u5BFC\u51FA\u8BC4\u6D4B\u7528\u6237\u7B54\u9898\u8BB0\u5F55
jsp.exam.report.exportEvaluationUserAnswerRecords=\u5BFC\u51FA\u6D4B\u8BD5\u6570\u636E
jsp.exam.report.exportBaseReport=\u91CD\u65B0\u751F\u6210(\u57FA\u7840)\u62A5\u544A\u5E76\u5BFC\u51FA
jsp.exam.report.exportVerboseReport=\u91CD\u65B0\u751F\u6210(\u8BE6\u7EC6)\u62A5\u544A\u5E76\u5BFC\u51FA
jsp.exam.report.requestToDownloadTheSecondTestReport=\u7533\u8BF7\u4E0B\u8F7D\u7B2C\u4E8C\u4EFD\u6D4B\u8BD5\u62A5\u544A
@@ -924,7 +924,7 @@
dict.ic14113=\u5730\u5740\u65E0\u6548
dict.ic14114=\u5DF2\u7ECF\u6253\u5F00
confirm.the.need.for.recycling=\u786E\u8BA4\u9700\u8981\u56DE\u6536
confirm.the.need.for.recycling.apend=\u5417? \u6D4B\u8BD5\u5305\u4E2D\u672A\u767B\u5F55\u8FC7\u7684\u4EBA\u5458\u5C06\u5931\u6548\uFF01=\u5417? \u6D4B\u8BD5\u5305\u4E2D\u672A\u767B\u5F55\u8FC7\u7684\u4EBA\u5458\u5C06\u5931\u6548\uFF01
confirm.the.need.for.recycling.apend=\u5417? \u6D4B\u8BD5\u5305\u4E2D\u672A\u767B\u5F55\u8FC7\u7684\u4EBA\u5458\u5C06\u5931\u6548\uFF01
in.special.cases=\u7279\u6B8A\u60C5\u51B5\u4E0B\uFF0C\u8BBE\u7F6E\u4E3A\u201C\u81EA\u5B9A\u6570\u636E\u6743\u9650\u201D
task.message.202008001=\u786E\u8BA4\u8981\u7ACB\u5373\u6267\u884C\u4E00\u6B21\u4EFB\u52A1\u5417\uFF1F
task.message.202008002=\u786E\u8BA4\u8981\u505C\u7528\u4EFB\u52A1\u5417\uFF1F
@@ -952,7 +952,7 @@
test.user.name.dict2=\u6309\u90AE\u7BB1\u641C\u7D22\u6D4B\u8BD5\u7528\u6237
test.user.name.dict3=\u6309\u624B\u673A\u53F7\u7801\u641C\u7D22\u6D4B\u8BD5\u7528\u6237
test.user.name.dict4=\u6309\u5BC6\u7801\u641C\u7D22\u6D4B\u8BD5\u7528\u6237
jsp.main.other.001=\u6700\u8FD1\u5B8C\u6210\u6D4B\u8BD5\u8BB0\u5F55
jsp.main.other.001=\u6700\u8FD1\u5B8C\u6210\u7684\u6D4B\u8BD5\u8BB0\u5F55
jsp.main.other.002=\u672A\u5B8C\u6210\u7684\u6D4B\u8BD5\u8BB0\u5F55\uFF08\u6B63\u5728\u7B54\u9898\u6216\u8005\u6682\u65F6\u653E\u5F03\u7B54\u9898\uFF09
jsp.main.other.003=\u6700\u8FD1\u521B\u5EFA\u7684\u6D4B\u8BD5\u5305
jsp.main.other.004=\u6700\u540E\u72B6\u6001\u65F6\u95F4
src/main/resources/static/ots.jpg

src/main/resources/templates/exam/enterprise/add.html
@@ -168,7 +168,7 @@
                <div class="form-group">
                    <label class="col-sm-4 control-label">[[#{jsp.exam.enterprise.availabletesters}]]:</label>
                    <div class="col-sm-8">
                        <input name="testNum" class="form-control" type="number">
                        <input name="testNum" class="form-control" type="number" required>
                    </div>
                </div>
            </div>
src/main/resources/templates/exam/testMember/testMember.html
@@ -23,7 +23,7 @@
                            <input type="text" id="testIdSh" name="testIdSh" readonly th:value="${packageTestName}">
                        </li>
                        <li>
                            <p>[[#{basis.name}]]</p>
                            <p>[[#{jsp.testPackage.name}]]</p>
                            <input type="text" name="memberName"/>
                        </li>
                        <!--<li>
src/main/resources/templates/exam/test_package/test_package.html
@@ -15,7 +15,7 @@
                            <input type="text" name="userName"/>
                        </li>
                        <li>
                            <p>[[#{basis.name}]]:</p>
                            <p>[[#{jsp.exam.report.TestPackage}]]:</p>
                            <input type="text" name="testName"/>
                        </li>
                        <li>
@@ -94,7 +94,7 @@
               class="btn" onclick="javascript:recover()" shiro:hasPermission="exam:test_package:recover">
                <i class="fa fa-address-book"></i> [[#{jsp.exam.test_package.006}]]
            </a>
            <a style="background-color: #7b76b7;border-color: #7b76b7;color: #FFFFFF"
            <a style="background-color:#b459d4;color:#ffffff"
                class="btn" onclick="javascript:testReport()" shiro:hasPermission="exam:test_package:testreport">
                <i class="fa fa-download"></i> [[#{jsp.exam.test_package.007}]]
            </a>
src/main/resources/templates/exam/userpaper/edit.html
@@ -49,7 +49,7 @@
        <div class="form-group">
            <label class="col-sm-1 control-label"></label>
            <div class="col-sm-2">
                <a class="btn btn-success" onclick="insertRow()">
                <a class="btn btn-success" onclick="insertRow()" >
                    <i class="fa fa-plus"></i> [[#{jsp.product.package.authorization}]]
                </a>
            </div>
src/main/resources/templates/exam/userpaper/userPaper.html
@@ -120,7 +120,7 @@
                    align: 'center',
                    formatter: function (value, row, index) {
                        var actions = [];
                        actions.push('<a class="btn btn-success btn-xs href="javascript:void(0)" onclick="$.operate.edit(\'' + row.userId + '\')"><i class="fa fa-edit"></i>'+[[#{jsp.product.package.authorization}]]+'</a> ');
                        actions.push('<a style="background-color: #a87242;border-color: #a87242;color: #FFFFFF" class="btn btn-success btn-xs href="javascript:void(0)" onclick="$.operate.edit(\'' + row.userId + '\')"><i class="fa fa-edit"></i>'+[[#{jsp.product.package.authorization}]]+'</a> ');
                        return actions.join('');
                    }
                }]
src/main/resources/templates/main.html
@@ -10,11 +10,11 @@
            <form id="post-form1">
                <div class="select-list">
                    <ul>
                        <li>
                        <li id="hideA">
                            <p>[[#{jsp.exam.enterprise.companyname}]]:</p><input type="text" name="userName"
                                                                                 id="userName" value=""/>
                        </li>
                        <li><a class="btn btn-primary btn-rounded btn-sm" onclick="openUserList()"><i
                        <li id="hideB"><a class="btn btn-primary btn-rounded btn-sm" onclick="openUserList()"><i
                                class="fa fa-search"></i>&nbsp;[[#{menu.exam.enterprise.view1}]]</a></li>
                        <li>
                            <input type="text" name="queryValue" id="queryValue" value=""/>
@@ -29,14 +29,6 @@
                </div>
            </form>
        </div>
<!--        <div class="col-sm-12 select-table" id="enterpriseInfo">-->
<!--            <p class="select-title" align="center">企业信息</p>-->
<!--            <table id="bootstrap-table1" data-mobile-responsive="true"></table>-->
<!--        </div>-->
<!--        <div class="col-sm-12 select-table" id="memberInfo">-->
<!--            <p class="select-title" align="center">用户信息</p>-->
<!--            <table id="bootstrap-table2" data-mobile-responsive="true"></table>-->
<!--        </div>-->
        <div class="col-sm-12 select-table">
            <p class="select-title" align="center">[[#{jsp.main.other.001}]]</p>
            <table id="bootstrap-table-form1" data-mobile-responsive="true"></table>
@@ -67,72 +59,18 @@
    var statusDatas = [[${@dict.getType('test_status')}]];
    var userId = [[${user.userId}]];
    // $(function () {
    //     var options = {
    //         id: "bootstrap-table1",
    //         url: ctx + "exam/extend/list2?userType=02",
    //         showSearch: false,
    //         showRefresh: false,
    //         showToggle: false,
    //         showColumns: false,
    //         createUrl: ctx + "exam/enterprise/add",
    //         updateUrl: ctx + "exam/enterprise/edit/{id}",
    //         removeUrl: ctx + "exam/enterprise/remove",
    //         exportUrl: ctx + "exam/enterprise/export",
    //         modalName: [[#{jsp.exam.demographyParam.businessuser}]],
    //         // showRefresh: true,
    //         queryParams: queryParams,
    //         pageSize: 10,
    //         pageList: [10, 50, 100],
    //         columns: [
    //             {
    //                 field: 'userId',
    //                 title: 'ID'
    //             },
    //             {
    //                 field: 'loginName',
    //                 title: [[#{jsp.exam.distributor.loginname}]]
    //             },
    //             {
    //                 field: 'userName',
    //                 title: [[#{jsp.exam.enterprise.companyname}]]
    //             },
    //             {
    //                 field: 'businessManager',
    //                 title: [[#{jsp.exam.distributor.businessmanager}]]
    //             },
    //             {
    //                 field: 'testNum',
    //                 title: [[#{jsp.exam.enterprise.usetimes}]],
    //                 formatter: function (value, row, index) {
    //                     return '<a href="javascript:void(0)" onclick="modifyUsageCount(\'' + row.id + '\')">' + value + '</a>';
    //                 }
    //             },
    //             {
    //                 field: 'effectTime',
    //                 title: [[#{jsp.exam.enterprise.effectivetime}]]
    //             },
    //             {
    //                 field: 'invalidTime',
    //                 title: [[#{jsp.exam.distributor.termcooperation}]]
    //             },
    //             {
    //                 field: 'legalPerson',
    //                 title: [[#{jsp.exam.enterprise.corporate}]]
    //             },
    //             {
    //                 title: [[#{basis.operate}]],
    //                 align: 'center',
    //                 formatter: function (value, row, index) {
    //                     var actions = [];
    //                     actions.push('<a class="btn btn-danger btn-xs " href="javascript:void(0)" onclick="freelogin(\'' + row.userId + '\')"><i class="fa fa-eye"></i>' + [[#{basis.freelogin}]] + '</a>');
    //                     return actions.join('');
    //                 }
    //             }
    //         ]
    //     };
    //     $.table.init(options);
    // });
    $(function(){ //代码部分
        $.ajax({
            type: "post",
            url: ctx + "exam/enterprise/checkUser",
            success: function (data) {
                if(data.code=='0') {
                    $("#hideA").css('display','none');
                    $("#hideB").css('display','none');
                }
            }
        });
    })
    function freelogin(id) {
        $.ajax({
@@ -170,146 +108,6 @@
        }
        $("#" + tableId).bootstrapTable('refresh', params);
    }
    // function searchDefine2() {
    //     var tableId = 'bootstrap-table2';
    //     var params = {
    //         queryValue: $("#queryValue").val(),
    //         queryType: $("#queryType").val(),
    //         limit: 10,
    //     }
    //     $("#" + tableId).bootstrapTable('refresh', params);
    // }
    //
    // $(function () {
    //     var options = {
    //         id: "bootstrap-table2",
    //         url: ctx + "exam/testMember" + "/list",
    //         showSearch: false,
    //         showRefresh: false,
    //         showToggle: false,
    //         showColumns: false,
    //         createUrl: ctx + "exam/testMember" + "/add/" + $("#testId").val(),
    //         updateUrl: ctx + "exam/testMember" + "/edit/{id}",
    //         removeUrl: ctx + "exam/testMember" + "/remove",
    //         exportUrl: ctx + "exam/testMember" + "/export",
    //         exportUrlLinkTest: ctx + "exam/testMember" + "/exportLinkTest",
    //         importUrl: ctx + "exam/testMember" + "/importData/" + $("#testId").val(),
    //         importTemplateUrl: ctx + "exam/testMember" + "/importTemplate",
    //         modalName: [[#{jsp.exam.test_package.032}]],
    //         pageSize: 10,
    //         pageList: [10, 50, 100],
    //         queryParams: queryParams2,
    //         // queryParams: function (params) {
    //         //     var temp = {
    //         //         queryValue:$("#queryValue").val(),
    //         //         queryType: $("#queryType").val(),
    //         //     }
    //         //     return temp;
    //         // },
    //         columns: [
    //             {
    //                 field: 'memberId',
    //                 title: [[#{jsp.exam.test_package.033}]],
    //                 visible: false
    //             },
    //             {
    //                 field: 'memberName',
    //                 title: [[#{jsp.exam.report.008}]]
    //             },
    //             {
    //                 field: 'memberDept',
    //                 title: [[#{jsp.system.dept.002}]],
    //                 sortable: true
    //
    //             },
    //             {
    //                 field: 'memberEmail',
    //                 title: [[#{jsp.system.user.profile.005}]]
    //             },
    //             {
    //                 field: 'memberPhone',
    //                 title: [[#{jsp.system.user.profile.003}]]
    //             },
    //             {
    //                 field: 'testId',
    //                 title: [[#{jsp.exam.report.014}]],
    //                 visible: false
    //             },
    //             {
    //                 field: 'startTime',
    //                 title: [[#{jsp.exam.test_package.startTime}]]
    //             },
    //             {
    //                 field: 'endTime',
    //                 title: [[#{jsp.exam.test_package.endTime}]]
    //             },
    //             {
    //                 field: 'smsStatus',
    //                 title: [[#{jsp.exam.test_package.035}]],
    //                 formatter: function (value, row, index) {
    //                     return $.table.selectDictLabel(sms_type, value);
    //                 }
    //             },
    //             {
    //                 field: 'smsTime',
    //                 title: [[#{jsp.exam.test_package.036}]]
    //             },
    //             {
    //                 field: 'emailStatus',
    //                 title: [[#{jsp.exam.test_package.037}]],
    //                 formatter: function (value, row, index) {
    //                     return $.table.selectDictLabel(email_status, value);
    //                 }
    //             },
    //             {
    //                 field: 'emailTime',
    //                 title: [[#{jsp.exam.test_package.038}]]
    //             },
    //             {
    //                 field: 'status',
    //                 title: [[#{basis.state}]],
    //                 formatter: function (value, row, index) {
    //                     return $.table.selectDictLabel(test_member_status, value);
    //                 }
    //             },
    //             {
    //                 field: 'remark',
    //                 title: [[#{basis.remark}]]
    //             },
    //             {
    //                 field: 'token',
    //                 title: [[#{jsp.exam.test_package.testtoken}]],
    //                 visible: false
    //             },
    //             {
    //                 field: 'hrEmailStatus',
    //                 title: [[#{hr.mailbox.status}]],
    //                 formatter: function (value, row, index) {
    //                     if (value == 1) {
    //                         return [[#{dict.ic138}]];
    //                     } else if (value == 2) {
    //                         return [[#{dict.ic140}]];
    //                     } else {
    //                         return "-";
    //                     }
    //                 },
    //                 visible: false
    //             },
    //             {
    //                 title: [[#{basis.operate}]],
    //                 align: 'center',
    //                 formatter: function (value, row, index) {
    //                     var actions = [];
    //                     actions.push('<a class="btn btn-success btn-xs " href="javascript:void(0)" onclick="openTestDetail(\'' + row.token + '\')"><i class="fa fa-edit"></i>[[#{jsp.exam.test_package.testinfo}]]</a> ');
    //                     actions.push('<a class="btn btn-warning btn-xs " href="javascript:void(0)" onclick="openMemberReport(' + row.memberId + "," + row.testId + ')"><i class="fa fa-edit"></i>[[#{view.report}]]</a> ');
    //                     return actions.join('');
    //                 }
    //             }
    //         ]
    //     };
    //     $.table.init(options);
    // });
    // 查看测试进度
    function openTestDetail(token) {
@@ -422,7 +220,7 @@
    $(function () {
        var options = {
            id: "bootstrap-table-form2",
            url: "/exam/testMember/listTopAnswering",
            url: "/exam/testMember/listTopAnswering2",
            showSearch: false,
            showRefresh: false,
            showToggle: false,