riku
2022-06-09 9867f6d5c5bccfe52b878c344c536905dd6b309e
1. 接口文档自动输出
已修改30个文件
已添加14个文件
2470 ■■■■■ 文件已修改
pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/SupervisionApplication.kt 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/common/api2word/JavaConfig.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/common/api2word/model/ModelAttr.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/common/api2word/model/Request.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/common/api2word/model/Response.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/common/api2word/model/Table.java 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/common/api2word/utils/JsonUtils.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/common/api2word/utils/MenuUtils.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/common/api2word/utils/ModelAttrUtils.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/common/api2word/utils/RequestUtils.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/common/api2word/utils/ResponseUtils.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/common/score/AutoScore.kt 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/common/score/Info.kt 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/common/score/item/ScoreItem_11.kt 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/common/score/item/ScoreItem_5.kt 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/common/score/item/ScoreItem_6.kt 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/common/score/item/ScoreItem_7.kt 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/common/score/item/ScoreItem_8.kt 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/config/Swagger2Configuration.kt 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/lightshare/service/Impl/OpenApiWordServiceImpl.java 887 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/lightshare/service/OpenApiWordService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/CommitmentController.kt 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/ComplaintController.kt 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/ConsultationController.kt 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/DeviceController.kt 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/EvaluationController.kt 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/EvaluationruleController.kt 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/EvaluationsubruleController.kt 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/HazardousWasteController.kt 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/ItemevaluationController.kt 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/LawController.kt 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/LedgerController.kt 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/MediafileController.kt 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/MeetingInfoController.kt 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/NotificationController.kt 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/OpenApiWordController.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/ProblemController.kt 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/UserinfoController.kt 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/VersionController.kt 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/templates/word.html 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/kotlin/cn/flightfeather/supervision/common/score/AutoScoreTest.kt 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -289,6 +289,12 @@
            <version>3.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-staticdocs</artifactId>
            <version>2.6.1</version>
        </dependency>
    </dependencies>
    <build>
src/main/kotlin/cn/flightfeather/supervision/SupervisionApplication.kt
@@ -21,7 +21,7 @@
    @Bean
    fun runner() = ApplicationRunner {
        webSocketServer.start()
        taskController.run()
//        taskController.run()
    }
}
src/main/kotlin/cn/flightfeather/supervision/common/api2word/JavaConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
package cn.flightfeather.supervision.common.api2word;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import javax.net.ssl.SSLContext;
import java.nio.charset.StandardCharsets;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
/**
 * Created by XiuYin.Cui on 2018/6/21.
 */
@Configuration
public class JavaConfig {
    @Bean
    public RestTemplate restTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
        TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;
        SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom()
                .loadTrustMaterial(null, acceptingTrustStrategy)
                .build();
        SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);
        CloseableHttpClient httpClient = HttpClients.custom()
                .setSSLSocketFactory(csf)
                .build();
        HttpComponentsClientHttpRequestFactory requestFactory =
                new HttpComponentsClientHttpRequestFactory();
        requestFactory.setHttpClient(httpClient);
        //60s
        requestFactory.setConnectTimeout(60 * 1000);
        requestFactory.setReadTimeout(60 * 1000);
        RestTemplate restTemplate = new RestTemplate(requestFactory);
        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
        return restTemplate;
    }
}
src/main/kotlin/cn/flightfeather/supervision/common/api2word/model/ModelAttr.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,107 @@
package cn.flightfeather.supervision.common.api2word.model;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
 * è¿”回属性
 *
 * @author kevin
 */
public class ModelAttr implements Serializable {
    public String getClassName() {
        return className;
    }
    public void setClassName(String className) {
        this.className = className;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public Boolean getRequire() {
        return require;
    }
    public void setRequire(Boolean require) {
        this.require = require;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public List<ModelAttr> getProperties() {
        return properties;
    }
    public void setProperties(List<ModelAttr> properties) {
        this.properties = properties;
    }
    public boolean isCompleted() {
        return isCompleted;
    }
    public void setCompleted(boolean isCompleted) {
        this.isCompleted = isCompleted;
    }
    public static long getSerialversionuid() {
        return serialVersionUID;
    }
    private static final long serialVersionUID = -4074067438450613643L;
    /**
     * ç±»å
     */
    private String className = StringUtils.EMPTY;
    /**
     * å±žæ€§å
     */
    private String name = StringUtils.EMPTY;
    /**
     * ç±»åž‹
     */
    private String type = StringUtils.EMPTY;
    /**
     * æ˜¯å¦å¿…å¡«
     */
    private Boolean require = false;
    /**
     * å±žæ€§æè¿°
     */
    private String description;
    /**
     * åµŒå¥—属性列表
     */
    private List<ModelAttr> properties = new ArrayList<>();
    /**
     * æ˜¯å¦åŠ è½½å®Œæˆï¼Œé¿å…å¾ªçŽ¯å¼•ç”¨
     */
    private boolean isCompleted = false;
}
src/main/kotlin/cn/flightfeather/supervision/common/api2word/model/Request.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
package cn.flightfeather.supervision.common.api2word.model;
import java.io.Serializable;
/**
 * Created by XiuYin.Cui on 2018/1/11.
 */
public class Request implements Serializable{
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public String getParamType() {
        return paramType;
    }
    public void setParamType(String paramType) {
        this.paramType = paramType;
    }
    public Boolean getRequire() {
        return require;
    }
    public void setRequire(Boolean require) {
        this.require = require;
    }
    public String getRemark() {
        return remark;
    }
    public void setRemark(String remark) {
        this.remark = remark;
    }
    public ModelAttr getModelAttr() {
        return modelAttr;
    }
    public void setModelAttr(ModelAttr modelAttr) {
        this.modelAttr = modelAttr;
    }
    /**
     * å‚数名
     */
    private String name;
    /**
     * æ•°æ®ç±»åž‹
     */
    private String type;
    /**
     * å‚数类型
     */
    private String paramType;
    /**
     * æ˜¯å¦å¿…å¡«
     */
    private Boolean require;
    /**
     * è¯´æ˜Ž
     */
    private String remark;
    /**
     * å¤æ‚对象引用
     */
    private ModelAttr modelAttr;
}
src/main/kotlin/cn/flightfeather/supervision/common/api2word/model/Response.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package cn.flightfeather.supervision.common.api2word.model;
import java.io.Serializable;
/**
 * Created by XiuYin.Cui on 2018/1/11.
 */
public class Response implements Serializable{
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getRemark() {
        return remark;
    }
    public void setRemark(String remark) {
        this.remark = remark;
    }
    /**
     * è¿”回参数
     */
    private String description;
    /**
     * å‚数名
     */
    private String name;
    /**
     * å¤‡æ³¨
     */
    private String remark;
}
src/main/kotlin/cn/flightfeather/supervision/common/api2word/model/Table.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,168 @@
package cn.flightfeather.supervision.common.api2word.model;
import cn.flightfeather.supervision.common.api2word.model.ModelAttr;
import cn.flightfeather.supervision.common.api2word.model.Request;
import cn.flightfeather.supervision.common.api2word.model.Response;
import java.util.List;
/**
 * Created by XiuYin.Cui on 2018/1/11.
 */
public class Table {
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getTag() {
        return tag;
    }
    public void setTag(String tag) {
        this.tag = tag;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public String getRequestForm() {
        return requestForm;
    }
    public void setRequestForm(String requestForm) {
        this.requestForm = requestForm;
    }
    public String getResponseForm() {
        return responseForm;
    }
    public void setResponseForm(String responseForm) {
        this.responseForm = responseForm;
    }
    public String getRequestType() {
        return requestType;
    }
    public void setRequestType(String requestType) {
        this.requestType = requestType;
    }
    public List<Request> getRequestList() {
        return requestList;
    }
    public void setRequestList(List<Request> requestList) {
        this.requestList = requestList;
    }
    public List<Response> getResponseList() {
        return responseList;
    }
    public void setResponseList(List<Response> responseList) {
        this.responseList = responseList;
    }
    public String getRequestParam() {
        return requestParam;
    }
    public void setRequestParam(String requestParam) {
        this.requestParam = requestParam;
    }
    public String getResponseParam() {
        return responseParam;
    }
    public void setResponseParam(String responseParam) {
        this.responseParam = responseParam;
    }
    public ModelAttr getModelAttr() {
        return modelAttr;
    }
    public void setModelAttr(ModelAttr modelAttr) {
        this.modelAttr = modelAttr;
    }
    /**
     * å¤§æ ‡é¢˜
     */
    private String title;
    /**
     * å°æ ‡é¢˜
     */
    private String tag;
    /**
     * url
     */
    private String url;
    /**
     * æè¿°
     */
    private String description;
    /**
     * è¯·æ±‚参数格式
     */
    private String requestForm;
    /**
     * å“åº”参数格式
     */
    private String responseForm;
    /**
     * è¯·æ±‚方式
     */
    private String requestType;
    /**
     * è¯·æ±‚体
     */
    private List<Request> requestList;
    /**
     * è¿”回体
     */
    private List<Response> responseList;
    /**
     * è¯·æ±‚参数
     */
    private String requestParam;
    /**
     * è¿”回参数
     */
    private String responseParam;
    /**
     * è¿”回属性列表
     */
    private ModelAttr modelAttr = new ModelAttr();
}
src/main/kotlin/cn/flightfeather/supervision/common/api2word/utils/JsonUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package cn.flightfeather.supervision.common.api2word.utils;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.io.IOException;
import java.util.List;
/**
 * @author cuixiuyin
 * @Date: 2018/11/05
 */
public class JsonUtils {
    private static ObjectMapper objectMapper = new ObjectMapper();
    static {
        objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
        objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
        objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
    }
    public static <T> T readValue(String jsonStr, Class<T> clazz) throws IOException {
        return objectMapper.readValue(jsonStr, clazz);
    }
    public static <T> List<T> readListValue(String jsonStr, Class<T> clazz) throws IOException {
        JavaType javaType = objectMapper.getTypeFactory().constructParametricType(List.class, clazz);
        return objectMapper.readValue(jsonStr, javaType);
    }
    public static ArrayNode readArray(String jsonStr) throws IOException {
        JsonNode node = objectMapper.readTree(jsonStr);
        if (node.isArray()) {
            return (ArrayNode) node;
        }
        return null;
    }
    public static JsonNode readNode(String jsonStr) throws IOException {
        return objectMapper.readTree(jsonStr);
    }
    public static String writeJsonStr(Object obj) throws JsonProcessingException {
        return objectMapper.writeValueAsString(obj);
    }
    public static ObjectNode createObjectNode() {
        return objectMapper.createObjectNode();
    }
    public static ArrayNode createArrayNode() {
        return objectMapper.createArrayNode();
    }
}
src/main/kotlin/cn/flightfeather/supervision/common/api2word/utils/MenuUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package cn.flightfeather.supervision.common.api2word.utils;
/**
 * @author : cuixiuyin
 * @date : 2019/8/31
 */
public class MenuUtils {
    public static Integer count = 0;
    public static String menuStr = "null";
    public static boolean isMenu(String tags) {
        if (menuStr.equals(tags)) {
            count++;
        } else {
            menuStr = tags;
            count = 0;
        }
        if (count == 0) {
            return true;
        } else {
            return false;
        }
    }
}
src/main/kotlin/cn/flightfeather/supervision/common/api2word/utils/ModelAttrUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,71 @@
package cn.flightfeather.supervision.common.api2word.utils;
import cn.flightfeather.supervision.common.api2word.model.ModelAttr;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
 * @author ivenhan
 * @Date: 2020/10/15
 */
public class ModelAttrUtils {
    // å°è£…schema - properties下某个具体property对象
    public static ModelAttr propertyModelAttr(Map<String, Map<String, Object>> property) {
        ModelAttr modeAttr = new ModelAttr();
        Map<String, Object> modeProperties = (Map<String, Object>) property.get("properties");
        ArrayList modeRequired = (ArrayList) property.get("required");
        List<ModelAttr> attrList = new ArrayList<>();
        if (modeProperties != null) {
            Iterator<Entry<String, Object>> mIt = modeProperties.entrySet().iterator();
            //解析属性
            while (mIt.hasNext()) {
                Entry<String, Object> mEntry = mIt.next();
                Map<String, Object> attrInfoMap = (Map<String, Object>) mEntry.getValue();
                ModelAttr child = new ModelAttr();
                child.setName(mEntry.getKey());
                child.setType((String) attrInfoMap.get("type"));
                if (attrInfoMap.get("format") != null) {
                    child.setType(child.getType() + "(" + attrInfoMap.get("format") + ")");
                }
                child.setType(StringUtils.defaultIfBlank(child.getType(), "object"));
                Object ref = attrInfoMap.get("$ref");
                Object items = attrInfoMap.get("items");
                if (items != null && ((Map) items).get("$ref") == null) {
                    ModelAttr refModel = propertyModelAttr((Map<String, Map<String, Object>>)items);
                    if (refModel != null) {
                        child.setProperties(refModel.getProperties());
                    }
                    child.setType(child.getType());
                }
                child.setDescription((String) attrInfoMap.get("description"));
                child.setRequire(false);
                if (modeRequired != null && modeRequired.contains(mEntry.getKey())) {
                    child.setRequire(true);
                }
                attrList.add(child);
            }
        }
        Object title = property.get("title");
        Object description = property.get("description");
        modeAttr.setClassName(title == null ? "" : title.toString());
        modeAttr.setDescription(description == null ? "" : description.toString());
        modeAttr.setProperties(attrList);
        return modeAttr;
    }
}
src/main/kotlin/cn/flightfeather/supervision/common/api2word/utils/RequestUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package cn.flightfeather.supervision.common.api2word.utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import java.util.Map;
/**
 * @author : ivenhan
 * @date : 2020/10/16
 */
public class RequestUtils {
    public static void validateRequestKey(Map<String, Map> content) throws JsonProcessingException {
        Map<String, Map> applicationJSON = content.get("application/json");
        if (applicationJSON == null) {
            throw new JsonProcessingException("content字段 ç¼ºå°‘ application/json å­—段") {};
        }
        Map<String, Map> schema = applicationJSON.get("schema");
        if (schema == null) {
            throw new JsonProcessingException("content字段 application/json ç¼ºå°‘ schema å­—段") {};
        }
        if (schema.get("type") == null) {
            throw new JsonProcessingException("content字段 application/json å­—段 schema å­—段 ç¼ºå°‘ type字段") {};
        }
    }
}
src/main/kotlin/cn/flightfeather/supervision/common/api2word/utils/ResponseUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package cn.flightfeather.supervision.common.api2word.utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
 * @author : ivenhan
 * @date : 2020/10/16
 */
public class ResponseUtils {
    public static void validateResponseKey(Map<String, Map> content) throws JsonProcessingException {
        Map<String, Map> applicationJSON = content.get("application/json");
        if (applicationJSON == null) {
            throw new JsonProcessingException("content å­—段缺少 application/json å­—段") {};
        }
        Map<String, Map> schema = applicationJSON.get("schema");
        if (schema == null) {
            throw new JsonProcessingException("content å­—段 application/json å­—段 ç¼ºå°‘ schema å­—段") {};
        }
        if (schema.get("type") == null) {
            throw new JsonProcessingException("content å­—段 application/json å­—段 schema å­—段 ç¼ºå°‘ type字段") {};
        }
        Map items = schema.get("items");
        Map properties = schema.get("properties");
        if (items == null && properties == null) {
            throw new JsonProcessingException("content å­—段 application/json å­—段 schema å­—段 ç¼ºå°‘  properties æˆ–者 items å­—段") {};
        }
        Set<Entry<String, Map>> contentValues = content.entrySet();
        int size = contentValues.size();
        if ((applicationJSON.get("examples") != null && size > 2) || (applicationJSON.get("examples") == null && size > 1) ) {
            throw new JsonProcessingException("content å­—段存在除 application/json æˆ–者 examples å­—段之外的其他字段") {};
        }
    }
}
src/main/kotlin/cn/flightfeather/supervision/common/score/AutoScore.kt
@@ -105,6 +105,7 @@
                // FIXME: 2021/4/28 åœºæ™¯ç±»åž‹ 
//                    æ±½ä¿®ç±»åž‹
                .andEqualTo("extension2", SCENE_TYPE.value.toString())
                .andEqualTo("isenable", true)
//            é¤é¥®ç±»åž‹
//                .andEqualTo("extension2", SCENE_TYPE.value.toString())
//            orderBy("workno")
@@ -166,7 +167,8 @@
                it.realname,
                SCENE_TYPE,
                year,
                month
                month,
                now
            )
            var score = 0
src/main/kotlin/cn/flightfeather/supervision/common/score/Info.kt
@@ -1,6 +1,7 @@
package cn.flightfeather.supervision.common.score
import cn.flightfeather.supervision.domain.enumeration.SceneType
import java.time.LocalDate
class Info(
        val userId: String?,
@@ -8,5 +9,6 @@
        val userName: String?,
        var sceneType: SceneType,
        var year: Int,
        val month: Int
        val month: Int,
        val now:LocalDate
)
src/main/kotlin/cn/flightfeather/supervision/common/score/item/ScoreItem_11.kt
@@ -60,7 +60,7 @@
            true
        } else {
            val latestTime = LocalDateTime.ofInstant(c[0].cmCreateTime.toInstant(), ZoneId.systemDefault())
            val now = LocalDateTime.of(info.year, eMonth + 1, 1, 0, 0, 0)
            val now = LocalDateTime.of(info.year, eMonth, 1, 0, 0, 0).plusMonths(1)
            now.minusYears(1).isAfter(latestTime)
        }
    }
src/main/kotlin/cn/flightfeather/supervision/common/score/item/ScoreItem_5.kt
@@ -7,6 +7,7 @@
import org.springframework.stereotype.Component
import tk.mybatis.mapper.entity.Example
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.ZoneId
import java.util.*
import javax.annotation.PostConstruct
@@ -33,7 +34,8 @@
    override fun calScore(): Pair<Int, Int> {
        val startTime = LocalDate.of(info.year, sMonth, 1).atStartOfDay(ZoneId.systemDefault())
        val lastTime = LocalDate.of(info.year, eMonth + 1, 1).atStartOfDay(ZoneId.systemDefault())
        val lastTime = LocalDate.of(info.year, eMonth, 1).plusMonths(1).atStartOfDay(ZoneId.systemDefault())
        LocalDateTime.now()
        val s = Date.from(startTime.toInstant())
        val e = Date.from(lastTime.toInstant())
src/main/kotlin/cn/flightfeather/supervision/common/score/item/ScoreItem_6.kt
@@ -6,6 +6,8 @@
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Component
import tk.mybatis.mapper.entity.Example
import java.time.LocalDate
import java.time.ZoneId
import javax.annotation.PostConstruct
@Component
@@ -32,6 +34,8 @@
    override var maxScore: Int = 10
    override fun calScore(): Pair<Int, Int> {
        val startTime = LocalDate.of(info.year, sMonth, 1).atStartOfDay(ZoneId.systemDefault())
        val lastTime = LocalDate.of(info.year, eMonth, 1).plusMonths(1).atStartOfDay(ZoneId.systemDefault())
        // FIXME: 2021/4/26 æ¶‰æ‰§æ³•意见、责令整改或行政处罚,扣除全部分数
        val r5 = scoreItem5.execute(info)
        if (r5.first != 0) {
@@ -40,6 +44,8 @@
        val complaints = complaintMapper.selectByExample(Example(Complaint::class.java).apply {
            createCriteria().andEqualTo("cpSceneid", info.userId)
                .andGreaterThanOrEqualTo("cpTime", startTime)
                .andLessThan("cpTime", lastTime)
        })
        
        return if (condition1(complaints)) {
src/main/kotlin/cn/flightfeather/supervision/common/score/item/ScoreItem_7.kt
@@ -40,7 +40,7 @@
        }
        val startTime = LocalDate.of(info.year, sMonth, 1).atStartOfDay(ZoneId.systemDefault())
        val lastTime = LocalDate.of(info.year, eMonth + 1, 1).atStartOfDay(ZoneId.systemDefault())
        val lastTime = LocalDate.of(info.year, eMonth, 1).plusMonths(1).atStartOfDay(ZoneId.systemDefault())
        val s = Date.from(startTime.toInstant())
        val e = Date.from(lastTime.toInstant())
src/main/kotlin/cn/flightfeather/supervision/common/score/item/ScoreItem_8.kt
@@ -36,7 +36,7 @@
    override fun calScore(): Pair<Int, Int> {
        val startTime = LocalDate.of(info.year, sMonth, 1).atStartOfDay(ZoneId.systemDefault())
        val lastTime = LocalDate.of(info.year, eMonth + 1, 1).atStartOfDay(ZoneId.systemDefault())
        val lastTime = LocalDate.of(info.year, eMonth, 1).plusMonths(1).atStartOfDay(ZoneId.systemDefault())
        val s = Date.from(startTime.toInstant())
        val e = Date.from(lastTime.toInstant())
src/main/kotlin/cn/flightfeather/supervision/config/Swagger2Configuration.kt
@@ -3,9 +3,14 @@
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.http.HttpMethod
import springfox.documentation.builders.ApiInfoBuilder
import springfox.documentation.builders.PathSelectors
import springfox.documentation.builders.RequestHandlerSelectors
import springfox.documentation.oas.annotations.EnableOpenApi
import springfox.documentation.schema.ModelReference
import springfox.documentation.service.Header
import springfox.documentation.service.Response
import springfox.documentation.spi.DocumentationType
import springfox.documentation.spring.web.plugins.Docket
import springfox.documentation.swagger2.annotations.EnableSwagger2
@@ -15,7 +20,7 @@
 * Date: 2020/8/28
 */
@Configuration
@EnableSwagger2
@EnableOpenApi
class Swagger2Configuration {
    companion object {
@@ -29,7 +34,7 @@
    @Bean
    fun createRestApi(): Docket =
            Docket(DocumentationType.SWAGGER_2)
        Docket(DocumentationType.OAS_30)
                    .enable(swagger2Enable)
                    .apiInfo(apiInfo())
                    .select()
src/main/kotlin/cn/flightfeather/supervision/lightshare/service/Impl/OpenApiWordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,887 @@
package cn.flightfeather.supervision.lightshare.service.Impl;
import cn.flightfeather.supervision.common.api2word.model.Table;
import cn.flightfeather.supervision.common.api2word.model.ModelAttr;
import cn.flightfeather.supervision.common.api2word.model.Request;
import cn.flightfeather.supervision.common.api2word.model.Response;
import cn.flightfeather.supervision.common.api2word.utils.JsonUtils;
import cn.flightfeather.supervision.common.api2word.utils.RequestUtils;
import cn.flightfeather.supervision.common.api2word.utils.ResponseUtils;
import cn.flightfeather.supervision.lightshare.service.OpenApiWordService;
import com.fasterxml.jackson.core.JsonProcessingException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.*;
import java.util.Map.Entry;
import java.util.stream.Collectors;
/**
 * @Author XiuYin.Cui
 * @Date 2018/1/12
 **/
@SuppressWarnings({"unchecked", "rawtypes"})
@Service
public class OpenApiWordServiceImpl implements OpenApiWordService {
    @Autowired
    private RestTemplate restTemplate;
    @Override
    public Map<String, Object> tableList(String swaggerUrl) {
        Map<String, Object> resultMap = new HashMap<>();
        try {
            String jsonStr = restTemplate.getForObject(swaggerUrl, String.class);
            resultMap = tableListFromString(jsonStr);
            // log.debug(JsonUtils.writeJsonStr(resultMap));
        } catch (Exception e) {
        }
        return resultMap;
    }
    @Override
    public Map<String, Object> tableListFromString(String jsonStr) throws IOException {
        Map<String, Object> resultMap = new HashMap<>();
        List<Table> result = new ArrayList<>();
        try {
            Map<String, Object> map = getResultFromString(result, jsonStr);
            Map<String, List<Table>> tableMap = result.stream().parallel().collect(Collectors.groupingBy(Table::getTitle));
            resultMap.put("tableMap", new TreeMap<>(tableMap));
            resultMap.put("info", map.get("info"));
            // log.debug(JsonUtils.writeJsonStr(resultMap));
        } catch (Exception e) {
            throw e;
        }
        return resultMap;
    }
    @Override
    public Map<String, Object> tableList(MultipartFile jsonFile) throws IOException {
        Map<String, Object> resultMap = new HashMap<>();
        try {
            String jsonStr = new String(jsonFile.getBytes());
            resultMap = tableListFromString(jsonStr);
            // log.debug(JsonUtils.writeJsonStr(resultMap));
        } catch (Exception e) {
            throw e;
        }
        return resultMap;
    }
    private Map<String, Object> getResultFromString(List<Table> result, String jsonStr) throws IOException {
        // convert JSON string to Map
        Map<String, Object> map = JsonUtils.readValue(jsonStr, HashMap.class);
        //解析model
        Map<String, ModelAttr> definitinMap = parseComponents(map);
        //解析paths
        Map<String, Map<String, Object>> paths = (Map<String, Map<String, Object>>) map.get("paths");
        //获取全局请求参数格式作为默认请求参数格式
        List<String> defaultConsumes = (List) map.get("consumes");
        //获取全局响应参数格式作为默认响应参数格式
        List<String> defaultProduces = (List) map.get("produces");
        if (paths != null) {
            Iterator<Entry<String, Map<String, Object>>> it = paths.entrySet().iterator();
            while (it.hasNext()) {
                Entry<String, Map<String, Object>> path = it.next();
                // 0. èŽ·å–è¯¥è·¯ç”±ä¸‹æ‰€æœ‰è¯·æ±‚æ–¹å¼çš„å…¬å…±å‚æ•°
                Map<String, Object> methods = (Map<String, Object>) path.getValue();
                List<LinkedHashMap> commonParameters = (ArrayList) methods.get("parameters");
                Iterator<Entry<String, Object>> it2 = path.getValue().entrySet().iterator();
                // 1.请求路径
                String url = path.getKey();
                String requestType = null;
                while (it2.hasNext()) {
                    try {
                        Entry<String, Object> request = it2.next();
                        // 2.请求方式,类似为 get,post,delete,put è¿™æ ·
                        requestType = request.getKey();
                        if ("parameters".equals(requestType)) {
                            continue;
                        }
                        Map<String, Object> content = (Map<String, Object>) request.getValue();
                        // 4. å¤§æ ‡é¢˜ï¼ˆç±»è¯´æ˜Žï¼‰
                        String title = String.valueOf(((List) content.get("tags")).get(0));
                        // 5.小标题 ï¼ˆæ–¹æ³•说明)
                        String tag = String.valueOf(content.get("summary"));
                        // 6.接口描述
                        Object descObj = content.get("description");
                        String description = descObj == null ? tag : descObj.toString();
                        // 7. è¯·æ±‚体
                        List<LinkedHashMap> parameters = (ArrayList) content.get("parameters");
                        if (!CollectionUtils.isEmpty(parameters)) {
                            if (commonParameters != null) {
                                parameters.addAll(commonParameters);
                            }
                        } else {
                            if (commonParameters != null) {
                                parameters = commonParameters;
                            }
                        }
                        // 8.返回体
                        Map<String, Object> responses = (LinkedHashMap) content.get("responses");
                        // 9.请求参数格式,类似于 multipart/form-data
                        List<String> requestParamsFormates = getRequestParamsFormate(content);
                        String requestForm = StringUtils.join(requestParamsFormates, ",");
                        // å–出来状态是200时的返回值
                        Map<String, Object> obj = (Map<String, Object>) responses.get("200");
                        Map<String, Object> requestBody = (Map<String, Object>) content.get("requestBody");
                        // 10.返回参数格式,类似于 application/json
                        List<String> responseParamsFormates = getResponseParamsFormate(obj);
                        String responseForm = StringUtils.join(responseParamsFormates, ",");
                        //封装Table
                        Table table = new Table();
                        table.setTitle(title);
                        table.setUrl(url);
                        table.setTag(tag);
                        table.setDescription(description);
                        table.setRequestForm(requestForm);
                        table.setResponseForm(responseForm);
                        table.setRequestType(requestType);
                        table.setRequestList(processRequestList(parameters, requestBody, definitinMap));
                        table.setResponseList(processResponseCodeList(responses, definitinMap));
                        if (obj != null && obj.get("content") != null) {
                            table.setModelAttr(processResponseModelAttrs(obj, definitinMap));
                        }
                        //示例
                        table.setRequestParam(processRequestParam(table.getRequestList()));
                        table.setResponseParam(processResponseParam1(obj, definitinMap));
                        result.add(table);
                    } catch (Exception e) {
                        e.printStackTrace();
//                        StringWriter sw = new StringWriter();
//                        PrintWriter pw = new PrintWriter(sw);
//                        e.printStackTrace(pw);
//                        throw new JsonProcessingException(url + "接口格式不正确: " + requestType + "请求 " + e.getMessage()) {};
                    }
                }
            }
        }
        return map;
    }
    /**
     * è¯·æ±‚参数格式, ç±»ä¼¼äºŽ multipart/form-data
     */
    private List<String> getRequestParamsFormate(Map<String, Object> obj) {
        Map<String, Object> requestBody = (LinkedHashMap) obj.get("requestBody");
        List<String> requestTypes = new ArrayList();
        if (requestBody != null) {
            Map<String, Map> content = (LinkedHashMap) requestBody.get("content");
            Set keys = content.keySet();
            return new ArrayList<String>(keys);
        }
        return requestTypes;
    }
    /**
     * è¿”回参数格式,类似于 application/json
     * @throws Exception
     */
    private List<String> getResponseParamsFormate(Map<String, Object> responseObj) {
        Map<String, Map> content = (LinkedHashMap) responseObj.get("content");
        List<String> responseTypes = new ArrayList();
        if (content != null) {
            Set keys = content.keySet();
            return new ArrayList<String>(keys);
        }
        return responseTypes;
    }
    /**
     * å¤„理请求参数列表
     *
     * @param parameters
     * @param definitinMap
     * @return
     * @throws JsonProcessingException
     */
    private List<Request> processRequestList(List<LinkedHashMap> parameters, Map<String, Object> requestBody, Map<String, ModelAttr> definitinMap) {
        List<Request> requestList = new ArrayList<>();
        if (!CollectionUtils.isEmpty(parameters)) {
            for (Map<String, Object> param : parameters) {
                Object in = param.get("in");
                Request request = new Request();
                request.setName(String.valueOf(param.get("name")));
                Map<String, String> schema1 = (Map) param.get("schema");
                request.setType(schema1 == null ? " " : schema1.get("type").toString());
                // request.setType(param.get("type") == null ? "object" : param.get("type").toString());
                if (param.get("format") != null) {
                    request.setType(request.getType() + "(" + param.get("format") + ")");
                }
                request.setParamType(String.valueOf(in));
                // è€ƒè™‘对象参数类型
                if (in != null && "body".equals(in)) {
                    Map<String, Object> schema = (Map) param.get("schema");
                    Object ref = schema.get("$ref");
                    // æ•°ç»„情况另外处理
                    if (schema.get("type") != null && "array".equals(schema.get("type"))) {
                        ref = ((Map) schema.get("items")).get("$ref");
                        request.setType("array");
                    }
                    if (ref != null) {
                        request.setType(request.getType() + ":" + ref.toString().replaceAll("#/definitions/", ""));
                        request.setModelAttr(definitinMap.get(ref));
                    }
                }
                // æ˜¯å¦å¿…å¡«
                request.setRequire(false);
                if (param.get("required") != null) {
                    request.setRequire((Boolean) param.get("required"));
                }
                // å‚数说明
                request.setRemark(String.valueOf(param.get("description")));
                requestList.add(request);
            }
        }
        if (requestBody != null) {
            Map<String, Map> content = (LinkedHashMap) requestBody.get("content");
//            try {
//                RequestUtils.validateRequestKey(content);
//            } catch(Exception e) {
//                throw new JsonProcessingException("requestybody å­—段 " + e.getMessage()) {};
//            }
            Iterator<Entry<String, Map>> applications = content.entrySet().iterator();
            while (applications.hasNext()) {
                Entry<String, Map> application = applications.next();
                if (application.getValue() != null) {
                    Request request = new Request();
                    Map<String, Object> schema = (Map<String, Object>) application.getValue().get("schema");
                    request.setName(" ");
                    request.setType(schema == null ? " " : (schema.get("type") == null ? " " : schema.get("type").toString()));
                    request.setParamType("body");
                    Object ref = schema.get("$ref");
                    if (schema.get("type") != null && "array".equals(schema.get("type"))) {
                        ref = ((Map) schema.get("items")).get("$ref");
                        request.setType("array");
                    }
                    if (ref != null) {
                        // request.setType(request.getType() + ":" + ref.toString().replaceAll("#/definitions/", ""));
                        request.setType("object");
                        request.setModelAttr(definitinMap.get(ref));
                    }
                    if (schema.get("properties") != null) {
                        ArrayList<String> requiredArr = new ArrayList<String>();
                        if (schema.get("required") != null) {
                            requiredArr = (ArrayList<String>) schema.get("required");
                        }
                        request.setModelAttr(getRequestSchemaModelAttr(schema, requiredArr));
                    }
                    // æ˜¯å¦å¿…å¡«
                    request.setRequire(true);
                    // å‚数说明
                    requestList.add(request);
                }
            }
        }
        return requestList;
    }
    /**
     * å¤„理返回码列表
     *
     * @param responses å…¨éƒ¨çŠ¶æ€ç è¿”å›žå¯¹è±¡
     * @return
     */
    private List<Response> processResponseCodeList(Map<String, Object> responses, Map<String, ModelAttr> definitinMap )  {
        List<Response> responseList = new ArrayList<>();
        Iterator<Entry<String, Object>> resIt = responses.entrySet().iterator();
        while (resIt.hasNext()) {
            Entry<String, Object> entry = resIt.next();
            Response response = new Response();
            // çŠ¶æ€ç  200 201 401 403 404 è¿™æ ·
            response.setName(entry.getKey());
            LinkedHashMap<String, Object> statusCodeInfo = (LinkedHashMap) entry.getValue();
            response.setDescription(String.valueOf(statusCodeInfo.get("description")));
            Map<String, Map> content = (Map) statusCodeInfo.get("content");
            if (content != null) {
//                try {
//                    ResponseUtils.validateResponseKey(content);
//                } catch(Exception e) {
//                    throw new JsonProcessingException("response字段 " + entry.getKey() + "字段 " + e.getMessage()) {};
//                }
                // responses内容application多个遍历处理
                Iterator<Entry<String, Map>> applications = content.entrySet().iterator();
                while (applications.hasNext()) {
                    Entry<String, Map> application = applications.next();
                    if (application.getValue() != null) {
                        Object schema = application.getValue().get("schema");
                        if (schema != null) {
                            Object originalRef = ((LinkedHashMap) schema).get("originalRef");
                            response.setRemark(originalRef == null ? "" : originalRef.toString());
                        }
                        responseList.add(response);
                    }
                }
            } else {
                String ref = String.valueOf(statusCodeInfo.get("$ref"));
                if (ref != "null" && ref != "") {
                    ModelAttr modelAttr = definitinMap.get(ref);
                    response.setDescription(modelAttr.getDescription());
                }
                responseList.add(response);
            }
        }
        return responseList;
    }
    /**
     * å¤„理返回属性列表
     *
     * @param responseObj
     * @param definitinMap
     * @return
     */
    private ModelAttr processResponseModelAttrs(Map<String, Object> responseObj, Map<String, ModelAttr> definitinMap) {
        Map<String, Map> content = (Map) responseObj.get("content");
        //其他类型
        ModelAttr modelAttr = new ModelAttr();
        Iterator<Entry<String, Map>> applications = content.entrySet().iterator();
        while (applications.hasNext()) {
            Entry<String, Map> application = applications.next();
            if (application.getValue() != null) {
                Map<String, Object> schema = (Map<String, Object>) application.getValue().get("schema");
                String type = (String) schema.get("type");
                String ref = null;
                //数组
                if ("array".equals(type)) {
                    Map<String, Object> items = (Map<String, Object>) schema.get("items");
                    if (items != null && items.get("$ref") != null) {
                        ref = (String) items.get("$ref");
                    }
                }
                //对象
                if (schema.get("$ref") != null) {
                    ref = (String) schema.get("$ref");
                }
                //其他类型
                modelAttr.setType(StringUtils.defaultIfBlank(type, StringUtils.EMPTY));
                if (StringUtils.isNotBlank(ref) && definitinMap.get(ref) != null) {
                    modelAttr = definitinMap.get(ref);
                }
                // æœªä½¿ç”¨ref方式 ä½¿ç”¨properties方式
                if (schema.get("properties") != null) {
                    modelAttr = getSchemaModelAttr(schema);
                }
            }
        }
        return modelAttr;
    }
    /**
     * è§£æžcomponents
     *
     * @param map
     * @return
     */
    private Map<String, ModelAttr> parseComponents(Map<String, Object> map) {
        Map<String, Object> definitions = (Map<String, Object>) map.get("components");
        Map<String, ModelAttr> definitinMap = new HashMap<>(256);
        if (definitions != null) {
            Iterator<String> modelNameIt = definitions.keySet().iterator();
            /**
             "components": {
             "requestBodies": {},
             "schemas": {}
             }
             */
            while (modelNameIt.hasNext()) {
                String modeName = modelNameIt.next();
                /**
                 "schemas": {
                 "cat":{},
                 "dog":{},
                 }
                 */
                Map<String, Map<String, Object>> modeContent = (Map<String, Map<String, Object>>) definitions.get(modeName);
                if (modeContent != null) {
                    Iterator<String> modeContentIt = modeContent.keySet().iterator();
                    while (modeContentIt.hasNext()) {
                        String componentsGrandChildName = modeContentIt.next();
                        getAndPutModelAttr(modeContent, definitinMap, modeName, componentsGrandChildName);
                    }
                }
            }
        }
        return definitinMap;
    }
    /**
     * é€’归生成ModelAttr
     * å¯¹$ref类型设置具体属性
     */
    private ModelAttr getAndPutModelAttr(Map<String, Map<String, Object>> swaggerMap, Map<String, ModelAttr> resMap, String parentName, String modeName) {
        ModelAttr modeAttr;
        if ((modeAttr = resMap.get("#/components/" + parentName + "/" + modeName)) == null) {
            modeAttr = new ModelAttr();
            resMap.put("#/components/" + parentName + "/" + modeName, modeAttr);
        } else if (resMap.get("#/components/" + parentName + "/" + modeName) != null) {
            return resMap.get("#/components/" + parentName + "/" + modeName);
        }
        Map<String, Object> modeProperties = (Map<String, Object>) swaggerMap.get(modeName).get("properties");
        List<ModelAttr> attrList = new ArrayList<>();
        // èŽ·å–required字段,遍历properties添加是否必填属性
        ArrayList modeRequired = (ArrayList) swaggerMap.get(modeName).get("required");
        if (modeProperties != null) {
            Iterator<Entry<String, Object>> mIt = modeProperties.entrySet().iterator();
            //解析属性
            while (mIt.hasNext()) {
                Entry<String, Object> mEntry = mIt.next();
                Map<String, Object> attrInfoMap = (Map<String, Object>) mEntry.getValue();
                ModelAttr child = new ModelAttr();
                child.setName(mEntry.getKey());
                child.setType((String) attrInfoMap.get("type"));
                if (attrInfoMap.get("format") != null) {
                    child.setType(child.getType() + "(" + attrInfoMap.get("format") + ")");
                }
                child.setType(StringUtils.defaultIfBlank(child.getType(), "object"));
                Object ref = attrInfoMap.get("$ref");
                Object items = attrInfoMap.get("items");
                if (ref != null || (items != null && (ref = ((Map) items).get("$ref")) != null)) {
                    String refName = ref.toString();
                    //截取 #/components/ åŽé¢çš„
                    String clsName = refName.substring(21);
                    ModelAttr refModel = getAndPutModelAttr(swaggerMap, resMap, parentName, clsName);
                    if (refModel != null) {
                        child.setProperties(refModel.getProperties());
                    }
                    child.setType(child.getType() + ":" + clsName);
                }
                child.setDescription((String) attrInfoMap.get("description"));
                child.setRequire(false);
                if (modeRequired != null && modeRequired.contains(mEntry.getKey())) {
                    child.setRequire(true);
                }
                attrList.add(child);
            }
        }
        Object title = swaggerMap.get(modeName).get("title");
        Object description = swaggerMap.get(modeName).get("description");
        modeAttr.setClassName(title == null ? "" : title.toString());
        modeAttr.setDescription(description == null ? "" : description.toString());
        modeAttr.setProperties(attrList);
        return modeAttr;
    }
    /**
     * é€’归生成ModelAttr
     * å¤„理schema对象
     * å¤„理requestBody直接返回属性值情况
     */
    private ModelAttr getRequestSchemaModelAttr(Map<String, Object> schemaMap, ArrayList requiredArr) {
        ModelAttr modeAttr = new ModelAttr();
        Map<String, Object> modeProperties = (Map<String, Object>) schemaMap.get("properties");
        if ("array".equals(schemaMap.get("type"))) {
            Map items = (Map<String, Object>) schemaMap.get("items");
            if (items != null) {
                modeProperties = (Map<String, Object>) items.get("properties");
            }
        }
        if (modeProperties == null) {
            return null;
        }
        Iterator<Entry<String, Object>> mIt = modeProperties.entrySet().iterator();
        List<ModelAttr> attrList = new ArrayList<>();
        //解析属性
        while (mIt.hasNext()) {
            Entry<String, Object> mEntry = mIt.next();
            Map<String, Object> attrInfoMap = (Map<String, Object>) mEntry.getValue();
            ModelAttr child = new ModelAttr();
            child.setName(mEntry.getKey());
            child.setType((String) attrInfoMap.get("type"));
            if (attrInfoMap.get("format") != null) {
                child.setType(child.getType() + "(" + attrInfoMap.get("format") + ")");
            }
            child.setType(StringUtils.defaultIfBlank(child.getType(), "object"));
            Object properties = attrInfoMap.get("properties");
            Object ref = attrInfoMap.get("$ref");
            Object items = attrInfoMap.get("items");
            if (properties != null || (items != null)) {
                ArrayList<String> childRequiredArr = new ArrayList<String>();
                if (attrInfoMap.get("required") != null) {
                    childRequiredArr = (ArrayList<String>) attrInfoMap.get("required");
                }
                ModelAttr refModel = getRequestSchemaModelAttr(attrInfoMap, childRequiredArr);
                if (refModel != null) {
                    child.setProperties(refModel.getProperties());
                }
                child.setType((String) attrInfoMap.get("type"));
            }
            child.setRequire(true);
            if (!requiredArr.contains(mEntry.getKey())) {
                child.setRequire(false);
            }
            child.setDescription((String) attrInfoMap.get("description"));
            attrList.add(child);
        }
        modeAttr.setClassName("");
        modeAttr.setDescription("");
        modeAttr.setProperties(attrList);
        return modeAttr;
    }
    /**
     * é€’归生成ModelAttr
     * å¤„理schema对象
     * å¤„理responseData直接返回属性值情况
     */
    private ModelAttr getSchemaModelAttr(Map<String, Object> schemaMap) {
        ModelAttr modeAttr = new ModelAttr();
        Map<String, Object> modeProperties = (Map<String, Object>) schemaMap.get("properties");
        if ("array".equals(schemaMap.get("type"))) {
            Map items = (Map<String, Object>) schemaMap.get("items");
            if (items != null) {
                modeProperties = (Map<String, Object>) items.get("properties");
            }
        }
        if (modeProperties == null) {
            return null;
        }
        Iterator<Entry<String, Object>> mIt = modeProperties.entrySet().iterator();
        List<ModelAttr> attrList = new ArrayList<>();
        //解析属性
        while (mIt.hasNext()) {
            Entry<String, Object> mEntry = mIt.next();
            Map<String, Object> attrInfoMap = (Map<String, Object>) mEntry.getValue();
            ModelAttr child = new ModelAttr();
            child.setName(mEntry.getKey());
            child.setType((String) attrInfoMap.get("type"));
            if (attrInfoMap.get("format") != null) {
                child.setType(child.getType() + "(" + attrInfoMap.get("format") + ")");
            }
            child.setType(StringUtils.defaultIfBlank(child.getType(), "object"));
            Object properties = attrInfoMap.get("properties");
            Object ref = attrInfoMap.get("$ref");
            Object items = attrInfoMap.get("items");
            if (properties != null || (items != null)) {
                ModelAttr refModel = getSchemaModelAttr(attrInfoMap);
                if (refModel != null) {
                    child.setProperties(refModel.getProperties());
                }
                child.setType((String) attrInfoMap.get("type"));
            }
            child.setDescription((String) attrInfoMap.get("description"));
            attrList.add(child);
        }
        modeAttr.setClassName("");
        modeAttr.setDescription("");
        modeAttr.setProperties(attrList);
        return modeAttr;
    }
    /**
     * å¤„理返回值
     *
     * @param responseObj
     * @return
     */
    private String processResponseParam(Map<String, Object> responseObj, Map<String, ModelAttr> definitinMap) throws JsonProcessingException {
        Map<String, Map> content = (Map) responseObj.get("content");
        if (content != null) {
            Iterator<Entry<String, Map>> applications = content.entrySet().iterator();
            while (applications.hasNext()) {
                Entry<String, Map> application = applications.next();
                if (application.getValue() != null) {
                    Map<String, Object> applicationContent = (Map<String, Object>) application.getValue();
                    if (applicationContent != null) {
                        Map<String, Object> schema = (Map<String, Object>) applicationContent.get("schema");
                        String type = (String) schema.get("type");
                        String ref = null;
                        // æ•°ç»„
                        if ("array".equals(type)) {
                            Map<String, Object> items = (Map<String, Object>) schema.get("items");
                            if (items != null && items.get("$ref") != null) {
                                ref = (String) items.get("$ref");
                            }
                        }
                        // å¯¹è±¡ref
                        if (schema.get("$ref") != null) {
                            ref = (String) schema.get("$ref");
                        }
                        if (StringUtils.isNotEmpty(ref)) {
                            ModelAttr modelAttr = definitinMap.get(ref);
                            if (modelAttr != null && !CollectionUtils.isEmpty(modelAttr.getProperties())) {
                                Map<String, Object> responseMap = new HashMap<>(8);
                                for (ModelAttr subModelAttr : modelAttr.getProperties()) {
                                    responseMap.put(subModelAttr.getName(), getValue(subModelAttr.getType(), subModelAttr));
                                }
                                return JsonUtils.writeJsonStr(responseMap);
                            }
                        }
                        if (schema.get("properties") != null) {
                            ModelAttr modelAttr = getSchemaModelAttr(schema);
                            if (modelAttr != null) {
                                Map<String, Object> responseMap = new HashMap<>(8);
                                for (ModelAttr subModelAttr : modelAttr.getProperties()) {
                                    responseMap.put(subModelAttr.getName(), getValue(subModelAttr.getType(), subModelAttr));
                                }
                                return JsonUtils.writeJsonStr(responseMap);
                            }
                        }
                    }
                }
            }
        }
        return StringUtils.EMPTY;
    }
    private String processResponseParam1(Map<String, Object> responseObj, Map<String, ModelAttr> definitinMap) {
        Map<String, Map> content = (Map) responseObj.get("content");
        // if (responseObj != null && content.get("application/json") != null) {
        if (content != null) {
            Iterator<Entry<String, Map>> applications = content.entrySet().iterator();
            while (applications.hasNext()) {
                Entry<String, Map> application = applications.next();
                if (application.getValue() != null) {
                    Map<String, Map<String, Map>> applicationContent = (Map<String, Map<String, Map>>) application.getValue();
                    if (applicationContent != null) {
                        Map<String, Map> examples = (Map<String, Map>) applicationContent.get("examples");
                        if (examples != null) {
                            Map<String, Object> responseData = examples.get("response");
                            if (responseData != null) {
                                Object value = responseData.get("value");
                                try {
                                    return JsonUtils.writeJsonStr(value);
                                } catch (JsonProcessingException e) {
                                    e.printStackTrace();
                                }
                            }
                        } else {
                            return "";
                        }
                    }
                }
            }
        }
        return StringUtils.EMPTY;
    }
    /**
     * å°è£…请求体
     *
     * @param list
     * @return
     */
    private String processRequestParam(List<Request> list) {
        Map<String, Object> headerMap = new LinkedHashMap<>();
        Map<String, Object> queryMap = new LinkedHashMap<>();
        Map<String, Object> jsonMap = new LinkedHashMap<>();
        if (list != null && list.size() > 0) {
            for (Request request : list) {
                String name = request.getName();
                String paramType = request.getParamType();
                Object value = getValue(request.getType(), request.getModelAttr());
                switch (paramType) {
                    case "header":
                        headerMap.put(name, value);
                        break;
                    case "query":
                        queryMap.put(name, value);
                        break;
                    case "path":
                        queryMap.put(name, value);
                        break;
                    case "body":
                        //TODO æ ¹æ®content-type序列化成不同格式,目前只用了json
                        jsonMap.put(name, value);
                        break;
                    default:
                        break;
                }
            }
        }
        String res = "";
        if (!queryMap.isEmpty()) {
            res += getUrlParamsByMap(queryMap);
        }
        if (!headerMap.isEmpty()) {
            res += " " + getHeaderByMap(headerMap);
        }
        if (!jsonMap.isEmpty()) {
            if (jsonMap.size() == 1) {
                for (Entry<String, Object> entry : jsonMap.entrySet()) {
                    try {
                        res += " '" + JsonUtils.writeJsonStr(entry.getValue()) + "'";
                    } catch (JsonProcessingException e) {
                        e.printStackTrace();
                    }
                }
            } else {
                try {
                    res += " '" + JsonUtils.writeJsonStr(jsonMap) + "'";
                } catch (JsonProcessingException e) {
                    e.printStackTrace();
                }
            }
        }
        return res;
    }
    /**
     * ä¾‹å­ä¸­ï¼Œå­—段的默认值
     *
     * @param type      ç±»åž‹
     * @param modelAttr å¼•用的类型
     * @return
     */
    private Object getValue(String type, ModelAttr modelAttr) {
        int pos;
        if ((pos = type.indexOf(":")) != -1) {
            type = type.substring(0, pos);
        }
        switch (type) {
            case "string":
                return "string";
            case "string(date-time)":
                return "2020/01/01 00:00:00";
            case "integer":
            case "integer(int64)":
            case "integer(int32)":
                return 0;
            case "number":
                return 0.0;
            case "boolean":
                return true;
            case "file":
                return "(binary)";
            case "array":
                List list = new ArrayList();
                Map<String, Object> map = new LinkedHashMap<>();
                if (modelAttr != null && !CollectionUtils.isEmpty(modelAttr.getProperties())) {
                    for (ModelAttr subModelAttr : modelAttr.getProperties()) {
                        map.put(subModelAttr.getName(), getValue(subModelAttr.getType(), subModelAttr));
                    }
                }
                list.add(map);
                return list;
            case "object":
                map = new LinkedHashMap<>();
                if (modelAttr != null && !CollectionUtils.isEmpty(modelAttr.getProperties())) {
                    for (ModelAttr subModelAttr : modelAttr.getProperties()) {
                        map.put(subModelAttr.getName(), getValue(subModelAttr.getType(), subModelAttr));
                    }
                }
                return map;
            default:
                return null;
        }
    }
    /**
     * å°†map转换成url
     */
    public static String getUrlParamsByMap(Map<String, Object> map) {
        if (map == null || map.isEmpty()) {
            return "";
        }
        StringBuffer sb = new StringBuffer();
        for (Entry<String, Object> entry : map.entrySet()) {
            sb.append(entry.getKey() + "=" + entry.getValue());
            sb.append("&");
        }
        String s = sb.toString();
        if (s.endsWith("&")) {
            s = StringUtils.substringBeforeLast(s, "&");
        }
        return s;
    }
    /**
     * å°†map转换成header
     */
    public static String getHeaderByMap(Map<String, Object> map) {
        if (map == null || map.isEmpty()) {
            return "";
        }
        StringBuffer sb = new StringBuffer();
        for (Entry<String, Object> entry : map.entrySet()) {
            sb.append("--header '");
            sb.append(entry.getKey() + ":" + entry.getValue());
            sb.append("'");
        }
        return sb.toString();
    }
}
src/main/kotlin/cn/flightfeather/supervision/lightshare/service/OpenApiWordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package cn.flightfeather.supervision.lightshare.service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.Map;
/**
 * Created by XiuYin.Cui on 2018/1/12.
 */
public interface OpenApiWordService {
    Map<String,Object> tableList(String swaggerUrl);
    Map<String, Object> tableListFromString(String jsonStr) throws IOException;
    Map<String, Object> tableList(MultipartFile jsonFile) throws IOException;
}
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/CommitmentController.kt
@@ -3,6 +3,8 @@
import cn.flightfeather.supervision.lightshare.service.CommitmentService
import io.swagger.annotations.Api
import io.swagger.annotations.ApiOperation
import io.swagger.annotations.ApiParam
import io.swagger.annotations.ApiResponse
import org.springframework.web.bind.annotation.*
import org.springframework.web.multipart.MultipartFile
import javax.servlet.http.HttpServletResponse
@@ -19,16 +21,17 @@
    @ApiOperation(value = "获取用户承诺书")
    @GetMapping("/letter")
    fun getLetterOfCommitment(
            @RequestParam("userId") userId: String,
            @RequestParam("page") page: Int,
            @RequestParam("per_page") perPage: Int,
        @ApiParam(value = "用户id") @RequestParam("userId") userId: String,
        @ApiParam(value = "页码") @RequestParam("page") page: Int,
        @ApiParam(value = "单页数据量") @RequestParam("per_page") perPage: Int,
            response: HttpServletResponse
    ) = commitmentService.getLetterOfCommitment(userId, page, perPage, response)
    @ApiOperation(value = "上传承诺书")
    @PostMapping("/letter/upload")
    fun uploadLetterOfCommitment(
            @RequestParam userId: String,
            @RequestParam("params") commitmentVoList: String,
            @RequestPart("images") files: Array<MultipartFile>
        @ApiParam(value = "用户id") @RequestParam userId: String,
        @ApiParam(value = "承诺书信息json") @RequestParam("params") commitmentVoList: String,
        @ApiParam(value = "承诺书图片") @RequestPart("images") files: Array<MultipartFile>
    ) = commitmentService.uploadLetterOfCommitment(userId, commitmentVoList, files)
}
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/ComplaintController.kt
@@ -3,6 +3,8 @@
import cn.flightfeather.supervision.lightshare.service.ComplaintService
import cn.flightfeather.supervision.lightshare.service.ProblemService
import io.swagger.annotations.Api
import io.swagger.annotations.ApiOperation
import io.swagger.annotations.ApiParam
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
@@ -13,13 +15,15 @@
@RequestMapping("/complaint")
class ComplaintController(val complaintService: ComplaintService) {
    @ApiOperation(value = "获取信访投诉信息")
    @GetMapping("")
    fun getComplaints(
            @RequestParam("userId") userId: String
        @ApiParam(value = "用户id") @RequestParam("userId") userId: String
    ) = complaintService.getComplaints(userId)
    @ApiOperation(value = "获取行政处罚信息")
    @GetMapping("/punishment")
    fun getPunishment(
            @RequestParam("userId") userId: String
        @ApiParam(value = "用户id") @RequestParam("userId") userId: String
    ) = complaintService.getPunishment(userId)
}
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/ConsultationController.kt
@@ -3,6 +3,8 @@
import cn.flightfeather.supervision.domain.entity.OnLineQuestion
import cn.flightfeather.supervision.lightshare.service.OnLineQuestionService
import io.swagger.annotations.Api
import io.swagger.annotations.ApiOperation
import io.swagger.annotations.ApiParam
import org.springframework.web.bind.annotation.*
@Api(tags = ["在线咨询API接口"])
@@ -10,9 +12,10 @@
@RequestMapping("/consultation")
class ConsultationController(val onLineQuestionService: OnLineQuestionService) {
    @ApiOperation(value = "提出咨询问题")
    @PostMapping("/add/{userId}")
    fun add(
            @PathVariable userId: String,
            @RequestBody questions: List<OnLineQuestion>
        @ApiParam(value = "用户id") @PathVariable userId: String,
        @ApiParam(value = "咨询问题") @RequestBody questions: List<OnLineQuestion>
    ) = onLineQuestionService.addQuestions(userId, questions)
}
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/DeviceController.kt
@@ -15,13 +15,13 @@
    @ApiOperation(value = "获取净化设备信息")
    @GetMapping("/purify/info")
    fun getPurifyDeviceInfo(
            @RequestParam("userId") userId: String
        @ApiParam(value = "用户id") @RequestParam("userId") userId: String
    ) = deviceService.getPurifyDeviceInfo(userId)
    @ApiOperation(value = "获取监测设备信息")
    @GetMapping("/monitor/info")
    fun getMonitorDeviceInfo(
            @RequestParam("userId") userId: String
        @ApiParam(value = "用户id") @RequestParam("userId") userId: String
    ) = deviceService.getMonitorDeviceInfo(userId)
    @ApiOperation(value = "获取用户监测设备的分钟数据", notes = "目前默认返回最新的15条数据,按时间升序排列")
@@ -36,6 +36,7 @@
            @ApiParam(value = "用户id") @RequestParam("userId") userId: String
    ) = deviceService.getLatestHourValue(userId)
    @ApiOperation(value = "获取月度均值数据")
    @PostMapping("/avg/mon/value")
    fun getMonAvgData(
            @ApiParam(value = "用户id") @RequestParam("userId") userId: String,
@@ -48,7 +49,7 @@
            @ApiParam(value = "用户id") @RequestParam("userId") userId: String,
            @ApiParam(value = "开始时间", example = "yyyy-MM-dd HH:mm") @RequestParam("startTime") startTime: String,
            @ApiParam(value = "结束时间", example = "yyyy-MM-dd HH:mm") @RequestParam("endTime") endTime: String,
            @ApiParam(value = "采样周期, 0:分钟均值;1:小时均值;(目前只支持分钟均值)", allowableValues = "0") @RequestParam("period") period: Byte
        @ApiParam(value = "采样周期", example = "0:分钟均值;1:小时均值;(目前只支持分钟均值)") @RequestParam("period") period: Byte
    ) = deviceService.getHistoryValue(userId, startTime, endTime, period)
    @ApiOperation(value = "获取每个监测设备的最新分钟数据", notes = "")
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/EvaluationController.kt
@@ -4,6 +4,8 @@
import cn.flightfeather.supervision.lightshare.service.EvaluationService
import cn.flightfeather.supervision.lightshare.vo.AssessmentSearchCondition
import io.swagger.annotations.Api
import io.swagger.annotations.ApiOperation
import io.swagger.annotations.ApiParam
import org.springframework.web.bind.annotation.*
import javax.servlet.http.HttpServletResponse
@@ -11,51 +13,62 @@
@RestController
@RequestMapping("/evaluation")
class EvaluationController(val evaluationService: EvaluationService) {
    @ApiOperation(value = "获取所有评估总分")
    @GetMapping
    fun getAll() = evaluationService.findAll()
    @ApiOperation(value = "上传一条评估总分记录")
    @PutMapping
    fun add(@RequestBody evaluation: Evaluation) = evaluationService.save(evaluation)
    fun add(
        @ApiParam(value = "评估数据") @RequestBody evaluation: Evaluation
    ) = evaluationService.save(evaluation)
    @ApiOperation(value = "更新一条评估总分记录")
    @PostMapping
    fun update(@RequestBody evaluation: Evaluation) = evaluationService.update(evaluation)
    fun update(@ApiParam(value = "评估数据") @RequestBody evaluation: Evaluation) = evaluationService.update(evaluation)
    @ApiOperation(value = "查找一条评估总分记录")
    @GetMapping("/{id}")
    fun getById(@PathVariable id: String) = evaluationService.findOne(id)
    fun getById(@ApiParam(value = "评估信息主键id") @PathVariable id: String) = evaluationService.findOne(id)
    @ApiOperation(value = "删除一条评估总分记录")
    @DeleteMapping("/{id}")
    fun delete(@PathVariable id: String) = evaluationService.delete(id)
    fun delete(@ApiParam(value = "评估信息主键id") @PathVariable id: String) = evaluationService.delete(id)
    @ApiOperation(value = "根据条件查询评估总分")
    @GetMapping("/totalPoint/{userId}")
    fun getT(
            @PathVariable("userId") userId: String,
            @RequestParam("evaluatorType") evaluatorType: Int,
            @RequestParam("startTime") startTime: String,
            @RequestParam("endTime") endTime: String,
            @RequestParam("sceneTypeId", required = false) sceneTypeId: Int?,
            @RequestParam("erGuid", required = false) erGuid: String?,
            @RequestParam("eId", required = false) eId: String?
        @ApiParam(value = "用户id") @PathVariable("userId") userId: String,
        @ApiParam(value = "评估类型") @RequestParam("evaluatorType") evaluatorType: Int,
        @ApiParam(value = "开始时间") @RequestParam("startTime") startTime: String,
        @ApiParam(value = "结束时间") @RequestParam("endTime") endTime: String,
        @ApiParam(value = "场景类型id") @RequestParam("sceneTypeId", required = false) sceneTypeId: Int?,
        @ApiParam(value = "子任务id") @RequestParam("erGuid", required = false) erGuid: String?,
        @ApiParam(value = "评估信息主键id") @RequestParam("eId", required = false) eId: String?
    ) = evaluationService.getTotalPoints(userId, evaluatorType, startTime, endTime, sceneTypeId, erGuid, eId)
    @ApiOperation(value = "获取用户评估总分")
    @GetMapping("/historyPoint/{userId}")
    fun getHistoryPoint(
            @PathVariable("userId") userId: String,
            @RequestParam(value = "page") page: Int,
            @RequestParam(value = "per_page") perPage: Int,
        @ApiParam(value = "用户id") @PathVariable("userId") userId: String,
        @ApiParam(value = "页码") @RequestParam(value = "page") page: Int,
        @ApiParam(value = "单页数据量") @RequestParam(value = "per_page") perPage: Int,
            response: HttpServletResponse
    ) = evaluationService.getHistoryPoint(userId, page, perPage, response)
    @ApiOperation(value = "获取信用评估结果")
    @GetMapping("/creditInfo")
    fun getCreditInfo(
            @RequestParam("userId") userId: String
        @ApiParam(value = "用户id") @RequestParam("userId") userId: String
    ) = evaluationService.getCreditInfo(userId)
    @ApiOperation(value = "获取某个用户的信用评估结果")
    @PostMapping("/search/{userId}")
    fun getAssessments(
            @PathVariable("userId") userId: String,
            @RequestBody condition: AssessmentSearchCondition,
            @RequestParam(value = "page") page: Int,
            @RequestParam(value = "per_page") perPage: Int,
        @ApiParam(value = "用户id") @PathVariable("userId") userId: String,
        @ApiParam(value = "查询条件") @RequestBody condition: AssessmentSearchCondition,
        @ApiParam(value = "页码") @RequestParam(value = "page") page: Int,
        @ApiParam(value = "单页数据量") @RequestParam(value = "per_page") perPage: Int,
            response: HttpServletResponse
    ) = evaluationService.getAssessments(userId, condition, page, perPage, response)
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/EvaluationruleController.kt
@@ -3,33 +3,42 @@
import cn.flightfeather.supervision.domain.entity.Evaluationrule
import cn.flightfeather.supervision.lightshare.service.EvaluationruleService
import io.swagger.annotations.Api
import io.swagger.annotations.ApiOperation
import io.swagger.annotations.ApiParam
import org.springframework.web.bind.annotation.*
import springfox.documentation.annotations.ApiIgnore
@Api(tags = ["评分总规则API接口"])
@RestController
@RequestMapping("/evaluationrule")
class EvaluationruleController (val evaluationruleService: EvaluationruleService){
    @ApiOperation(value = "获取评分规则表")
    @GetMapping("/rule")
    fun getRules(
            @RequestParam(value = "erGuid", required = false) erGuid: String?,
            @RequestParam(value = "sceneTypeId", required = true) sceneTypeId: Int,
            @ApiParam(value = "评分表类型", allowableValues = "null/0: æ‰‹åŠ¨è¯„åˆ†ï¼›1:自动评分") @RequestParam(value = "erType", required = false) erType: Int?)
        @ApiParam(value = "规则主键id") @RequestParam(value = "erGuid", required = false) erGuid: String?,
        @ApiParam(value = "场景类型id") @RequestParam(value = "sceneTypeId", required = true) sceneTypeId: Int,
        @ApiParam(value = "评分表类型", allowableValues = "null, 0, 1") @RequestParam(value = "erType", required = false) erType: Int?)
            = evaluationruleService.getRule(erGuid, sceneTypeId, erType)
    @ApiOperation(value = "获取所有评分规则表")
    @GetMapping
    fun getAll() = evaluationruleService.findAll()
    @ApiOperation(value = "上传评分规则表")
    @PutMapping
    fun add(@RequestBody evaluationrule: Evaluationrule) = evaluationruleService.save(evaluationrule)
    fun add(@ApiParam(value = "评分规则") @RequestBody evaluationrule: Evaluationrule) = evaluationruleService.save(evaluationrule)
    @ApiOperation(value = "更新评分规则表")
    @PostMapping
    fun update(@RequestBody evaluationrule: Evaluationrule) = evaluationruleService.update(evaluationrule)
    fun update(@ApiParam(value = "评分规则") @RequestBody evaluationrule: Evaluationrule) = evaluationruleService.update(evaluationrule)
    @ApiOperation(value = "查找评分规则表")
    @GetMapping("/{id}")
    fun getById(@PathVariable id:String) = evaluationruleService.findOne(id)
    fun getById(@ApiParam(value = "评分规则表id") @PathVariable id:String) = evaluationruleService.findOne(id)
    @ApiIgnore
    @ApiOperation(value = "删除评分规则表")
    @DeleteMapping("/{id}")
    fun delete (@PathVariable id: String) = evaluationruleService.delete(id)
}
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/EvaluationsubruleController.kt
@@ -3,24 +3,33 @@
import cn.flightfeather.supervision.domain.entity.Evaluationsubrule
import cn.flightfeather.supervision.lightshare.service.EvaluationsubruleService
import io.swagger.annotations.Api
import io.swagger.annotations.ApiOperation
import io.swagger.annotations.ApiParam
import org.springframework.web.bind.annotation.*
import springfox.documentation.annotations.ApiIgnore
@Api(tags = ["评分子规则API接口"])
@RestController
@RequestMapping("/evaluationsubrule")
class EvaluationsubruleController (val evaluationsubruleService: EvaluationsubruleService) {
    @ApiOperation(value = "获取所有评分规则子项表")
    @GetMapping
    fun getAll() = evaluationsubruleService.findAll()
    @ApiOperation(value = "上传评分规则子项表")
    @PutMapping
    fun add(@RequestBody evaluationsubrule: Evaluationsubrule) = evaluationsubruleService.save(evaluationsubrule)
    fun add(@ApiParam(value = "评分规则子项表") @RequestBody evaluationsubrule: Evaluationsubrule) = evaluationsubruleService.save(evaluationsubrule)
    @ApiOperation(value = "更新评分规则子项表")
    @PostMapping
    fun update(@RequestBody evaluationsubrule: Evaluationsubrule) = evaluationsubruleService.update(evaluationsubrule)
    fun update(@ApiParam(value = "评分规则子项表") @RequestBody evaluationsubrule: Evaluationsubrule) = evaluationsubruleService.update(evaluationsubrule)
    @ApiOperation(value = "查找评分规则子项表")
    @GetMapping("/{ruleId}")
    fun getById(@PathVariable ruleId:String) = evaluationsubruleService.findByRuleId(ruleId)
    fun getById(@ApiParam(value = "评分规则子项表id") @PathVariable ruleId:String) = evaluationsubruleService.findByRuleId(ruleId)
    @ApiIgnore
    @ApiOperation(value = "删除评分规则子项表")
    @DeleteMapping("/{id}")
    fun delete (@PathVariable id: String) = evaluationsubruleService.delete(id)
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/HazardousWasteController.kt
@@ -3,6 +3,7 @@
import cn.flightfeather.supervision.lightshare.service.HazardousWasteService
import io.swagger.annotations.Api
import io.swagger.annotations.ApiOperation
import io.swagger.annotations.ApiParam
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
@@ -15,12 +16,12 @@
    @ApiOperation(value = "获取用户所属企业的危废备案信息")
    @GetMapping("/file")
    fun getFile(@RequestParam("userId") userId: String) = hazardousWasteService.getFile(userId)
    fun getFile(@ApiParam(value = "用户id") @RequestParam("userId") userId: String) = hazardousWasteService.getFile(userId)
    @ApiOperation(value = "获取用户所属企业的危废处置记录")
    @GetMapping("/record")
    fun getRecord(
            @RequestParam("userId") userId: String,
            @RequestParam(value = "year", required = false) year: String?
        @ApiParam(value = "用户id") @RequestParam("userId") userId: String,
        @ApiParam(value = "年份") @RequestParam(value = "year", required = false) year: String?
    ) = hazardousWasteService.getRecord(userId, year)
}
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/ItemevaluationController.kt
@@ -3,36 +3,49 @@
import cn.flightfeather.supervision.domain.entity.Itemevaluation
import cn.flightfeather.supervision.lightshare.service.ItemevaluationService
import io.swagger.annotations.Api
import io.swagger.annotations.ApiOperation
import io.swagger.annotations.ApiParam
import org.springframework.web.bind.annotation.*
import springfox.documentation.annotations.ApiIgnore
@Api(tags = ["评分子项得分API接口"])
@RestController
@RequestMapping("/itemevaluation")
class ItemevaluationController (val itemevaluationService: ItemevaluationService){
    @ApiOperation(value = "获取所有评分子项得分记录")
    @GetMapping
    fun getAll() = itemevaluationService.findAll()
    @ApiOperation(value = "根据子任务id获取评分子项得分记录")
    @GetMapping("/subtask/{id}")
    fun getBySubtaskId(@PathVariable id:String) = itemevaluationService.findBySubTaskID(id)
    fun getBySubtaskId(@ApiParam(value = "子任务id") @PathVariable id:String) = itemevaluationService.findBySubTaskID(id)
    @ApiOperation(value = "上传一个评分子项得分记录")
    @PutMapping
    fun add(@RequestBody itemevaluation: Itemevaluation) = itemevaluationService.save(itemevaluation)
    fun add(@ApiParam(value = "评分子项得分记录") @RequestBody itemevaluation: Itemevaluation) = itemevaluationService.save(itemevaluation)
    @ApiOperation(value = "上传一组评分子项得分记录")
    @PutMapping("/addlist")
    fun addList(@RequestBody itemevaluationlist: List<Itemevaluation>) = itemevaluationService.savelist(itemevaluationlist)
    fun addList(@ApiParam(value = "评分子项得分记录数组") @RequestBody itemevaluationlist: List<Itemevaluation>) = itemevaluationService.savelist(itemevaluationlist)
    @ApiOperation(value = "更新一条评分子项得分记录")
    @PostMapping
    fun update(@RequestBody itemevaluation: Itemevaluation) = itemevaluationService.update(itemevaluation)
    fun update(@ApiParam(value = "评分子项得分记录") @RequestBody itemevaluation: Itemevaluation) = itemevaluationService.update(itemevaluation)
    @ApiOperation(value = "更新一组评分子项得分记录")
    @PostMapping("/uplist")
    fun updatelist(@RequestBody itemevaluationlist: List<Itemevaluation>) = itemevaluationService.updatelist(itemevaluationlist)
    fun updatelist(@ApiParam(value = "评分子项得分记录数组") @RequestBody itemevaluationlist: List<Itemevaluation>) = itemevaluationService.updatelist(itemevaluationlist)
    @ApiOperation(value = "查找评分子项得分记录")
    @GetMapping("/{id}")
    fun getById(@PathVariable id:String) = itemevaluationService.findOne(id)
    fun getById(@ApiParam(value = "评分子项得分记录id") @PathVariable id:String) = itemevaluationService.findOne(id)
    @ApiIgnore
    @ApiOperation(value = "删除评分子项得分记录")
    @DeleteMapping("/{id}")
    fun delete (@PathVariable id: String) = itemevaluationService.delete(id)
    fun delete (@ApiParam(value = "评分子项得分记录id") @PathVariable id: String) = itemevaluationService.delete(id)
    @ApiOperation(value = "根据总分id获取对应评分子项得分记录")
    @GetMapping("/pointId/{evaluationId}")
    fun getItemEvaluationList(@PathVariable evaluationId: String) = itemevaluationService.getItemEvaluationList(evaluationId)
    fun getItemEvaluationList(@ApiParam(value = "总分记录id") @PathVariable evaluationId: String) = itemevaluationService.getItemEvaluationList(evaluationId)
}
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/LawController.kt
@@ -3,6 +3,8 @@
import cn.flightfeather.supervision.lightshare.service.LawService
import cn.flightfeather.supervision.lightshare.vo.LawsRegulationsCondition
import io.swagger.annotations.Api
import io.swagger.annotations.ApiOperation
import io.swagger.annotations.ApiParam
import org.springframework.web.bind.annotation.*
import javax.servlet.http.HttpServletResponse
@@ -11,30 +13,34 @@
@RequestMapping("/laws")
class LawController(val lawService: LawService) {
    @ApiOperation(value = "获取所有法律法规")
    @GetMapping
    fun getLaws(
            @RequestParam(value = "page") page: Int,
            @RequestParam(value = "per_page") perPage: Int,
        @ApiParam(value = "页码") @RequestParam(value = "page") page: Int,
        @ApiParam(value = "单页数据量") @RequestParam(value = "per_page") perPage: Int,
            response: HttpServletResponse
    ) = lawService.getLaws(page, perPage, response)
    @ApiOperation(value = "根据id查找法律法规")
    @GetMapping("/text")
    fun getLawText(
            @RequestParam(value = "id") lawId: String
        @ApiParam(value = "法律法规记录id") @RequestParam(value = "id") lawId: String
    ) = lawService.getLawText(lawId)
    @ApiOperation(value = "查找法律法规")
    @PostMapping("/condition/{userId}")
    fun getLawsRegulations(
            @PathVariable userId: String,
            @RequestBody condition: LawsRegulationsCondition,
            @RequestParam(value = "page") page: Int,
            @RequestParam(value = "per_page") perPage: Int,
        @ApiParam(value = "用户的id") @PathVariable userId: String,
        @ApiParam(value = "查找条件") @RequestBody condition: LawsRegulationsCondition,
        @ApiParam(value = "页码") @RequestParam(value = "page") page: Int,
        @ApiParam(value = "单页数据量") @RequestParam(value = "per_page") perPage: Int,
            response: HttpServletResponse
    ) = lawService.getLawsRegulations(condition, page, perPage, response)
    @ApiOperation(value = "根据行业类型查找相关法律法规")
    @PostMapping("/eachType/{userId}")
    fun getLawsRegulationsWithEachType(
            @PathVariable userId: String,
            @RequestBody condition: LawsRegulationsCondition
        @ApiParam(value = "用户id") @PathVariable userId: String,
        @ApiParam(value = "查找条件") @RequestBody condition: LawsRegulationsCondition
    ) = lawService.getLawsRegulationsWithEachType(condition)
}
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/LedgerController.kt
@@ -9,6 +9,7 @@
import org.springframework.web.bind.annotation.*
import org.springframework.web.multipart.MultipartFile
import org.synchronoss.cloud.nio.multipart.Multipart
import springfox.documentation.annotations.ApiIgnore
import javax.servlet.http.HttpServletResponse
@Api(tags = ["台账API接口"])
@@ -16,9 +17,10 @@
@RequestMapping("/ledger")
class LedgerController(val ledgerService: LedgerService) {
    @ApiOperation(value = "获取台账类型")
    @GetMapping("/type")
    fun getLedgerType(
            @RequestParam(value = "sceneType") sceneType: Int
        @ApiParam("场景类型id") @RequestParam(value = "sceneType") sceneType: Int
    ) = ledgerService.getLedgerType(sceneType)
    @ApiOperation(value = "获取用户某个时间点下应该提交的所有台账及对应的提交状态、审核状态等信息")
@@ -29,15 +31,16 @@
            @ApiParam(value = "时间", example = "yyyy-MM-dd") @RequestParam(value = "time")time: String
    ) = ledgerService.getUserLedgerSummary(userId, sceneType, time)
    @ApiOperation(value = "获取台账详情")
    @GetMapping("/{userId}/detail")
    fun getLedgerDetail(
            @PathVariable userId: String,
            @RequestParam(value = "ledgerSubTypeId", required = false) ledgerSubTypeId: Int?,
            @RequestParam(value = "sceneType") sceneType: Int,
            @RequestParam(value = "startTime") startTime: String,
            @RequestParam(value = "endTime") endTime: String,
            @RequestParam(value = "page", required = false) page: Int?,
            @RequestParam(value = "per_page") perPage: Int,
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("台账类型id") @RequestParam(value = "ledgerSubTypeId", required = false) ledgerSubTypeId: Int?,
        @ApiParam("场景类型id") @RequestParam(value = "sceneType") sceneType: Int,
        @ApiParam("上传开始时间") @RequestParam(value = "startTime") startTime: String,
        @ApiParam("上传结束时间") @RequestParam(value = "endTime") endTime: String,
        @ApiParam("页码") @RequestParam(value = "page", required = false) page: Int?,
        @ApiParam("单页数据量") @RequestParam(value = "per_page") perPage: Int,
            response: HttpServletResponse
    ) = ledgerService.getLedgerDetail(userId, ledgerSubTypeId, sceneType, startTime, endTime, page, perPage, response)
@@ -50,22 +53,26 @@
            @ApiParam(value = "时间", example = "yyyy-MM-dd") @RequestParam(value = "time") time: String
    ) = ledgerService.getLedgerDetail2(userId, ledgerSubTypeId, sceneType, time)
    @ApiOperation(value = "上传台账信息")
    @PostMapping("/{userId}/upload")
    fun uploadLedger(
            @PathVariable userId: String,
            @RequestParam("params") ledgerVoList: String,
            @RequestPart("images") files:Array<MultipartFile>
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("台账信息json") @RequestParam("params") ledgerVoList: String,
        @ApiParam("台账图片") @RequestPart("images") files:Array<MultipartFile>
    ) = ledgerService.uploadLedger(userId, ledgerVoList, files)
    @ApiOperation(value = "获取某个台账显示图标url")
    @GetMapping("/{userId}/img")
    fun getLedgerImg(
            @PathVariable userId: String,
            @RequestParam("ledgerType") ledgerType: Int
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("台账类型id") @RequestParam("ledgerType") ledgerType: Int
    ) = ledgerService.getLedgerImg(userId, ledgerType)
    @ApiIgnore("该接口未使用,考虑后续删除")
    @ApiOperation(value = "获取多个台账图标信息")
    @GetMapping("/{userId}/imgs")
    fun getLedgerImgs(
            @PathVariable userId: String,
            @RequestParam("ledgerTypes") ledgerTypes: List<Int>
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("台账类型id数组") @RequestParam("ledgerTypes") ledgerTypes: List<Int>
    ) = ledgerService.getLedgerImgs(userId, ledgerTypes)
}
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/MediafileController.kt
@@ -2,32 +2,58 @@
import cn.flightfeather.supervision.domain.entity.Mediafile
import cn.flightfeather.supervision.lightshare.service.MediafileService
import io.swagger.annotations.Api
import io.swagger.annotations.ApiOperation
import io.swagger.annotations.ApiParam
import org.springframework.web.bind.annotation.*
import org.springframework.web.multipart.MultipartFile
import springfox.documentation.annotations.ApiIgnore
@Api(tags = ["多媒体文件API接口"])
@RestController
@RequestMapping("/mediafile")
class MediafileController (val mediafileService: MediafileService){
    @ApiOperation(value = "获取所有多媒体文件信息")
    @GetMapping
    fun getAll() = mediafileService.findAll()
    @ApiOperation(value = "上传一个多媒体文件信息")
    @PutMapping
    fun add(@RequestBody mediafile: Mediafile) = mediafileService.save(mediafile)
    fun add(
        @ApiParam("多媒体文件信息") @RequestBody mediafile: Mediafile)
    = mediafileService.save(mediafile)
    @ApiOperation(value = "更新一个多媒体文件信息")
    @PostMapping
    fun update(@RequestBody mediafile: Mediafile) = mediafileService.update(mediafile)
    fun update(
        @ApiParam("多媒体文件信息") @RequestBody mediafile: Mediafile)
    = mediafileService.update(mediafile)
    @ApiOperation(value = "查找一个多媒体文件信息")
    @GetMapping("/{id}")
    fun getById(@PathVariable id:String) = mediafileService.findOne(id)
    fun getById(
        @ApiParam("多媒体文件信息id") @PathVariable id:String)
    = mediafileService.findOne(id)
    @ApiIgnore("飞羽监管后台移植的api,考虑后续删除")
    @ApiOperation(value = "根据子任务id及业务类型ID查询")
    @GetMapping("/{id}/{btid}")
    fun getBySubtaskId(@PathVariable id:String,@PathVariable btid:String) = mediafileService.findBysubtaskbtid(id,btid)
    fun getBySubtaskId(
        @ApiParam("子任务id") @PathVariable id:String,
        @ApiParam("业务类型ID") @PathVariable btid:String)
    = mediafileService.findBysubtaskbtid(id,btid)
    @ApiIgnore
    @ApiOperation(value = "删除一个多媒体文件信息")
    @DeleteMapping("/{id}")
    fun delete (@PathVariable id: String) = mediafileService.delete(id)
    fun delete (
        @ApiParam("多媒体文件信息id") @PathVariable id: String)
    = mediafileService.delete(id)
    @ApiOperation(value = "上传多媒体文件信息")
    @PostMapping("/add")
    fun addProblem(@RequestParam("mediafileVoList") mediafileVoList: String, @RequestPart("Photos") files: Array<MultipartFile>) {
        mediafileService.addMedifile(mediafileVoList,files)
    }
    fun addProblem(
        @ApiParam("多媒体文件信息json") @RequestParam("mediafileVoList") mediafileVoList: String,
        @ApiParam("多媒体文件") @RequestPart("Photos") files: Array<MultipartFile>
    ) = mediafileService.addMedifile(mediafileVoList, files)
}
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/MeetingInfoController.kt
@@ -8,6 +8,8 @@
import cn.flightfeather.supervision.lightshare.vo.UserStatusVo
import cn.flightfeather.supervision.websocket.Processor
import io.swagger.annotations.Api
import io.swagger.annotations.ApiOperation
import io.swagger.annotations.ApiParam
import org.springframework.web.bind.annotation.*
import org.springframework.web.multipart.MultipartFile
import javax.servlet.http.HttpServletResponse
@@ -18,169 +20,191 @@
class MeetingInfoController(val meetingInfoService: MeetingInfoService) {
    /*****************************会议********************************************/
    @ApiOperation(value = "获取用户的会议信息")
    @GetMapping("/info/{userId}")
    fun getMeetingInfo(
            @PathVariable userId: String,
            @RequestParam(value = "status") status: Int,
            @RequestParam(value = "page") page: Int,
            @RequestParam(value = "per_page") perPage: Int,
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam(value = "查询类型", allowableValues = "1,2,3,4,5") @RequestParam(value = "status") status: Int,
        @ApiParam("页码") @RequestParam(value = "page") page: Int,
        @ApiParam("单页数据量") @RequestParam(value = "per_page") perPage: Int,
            response: HttpServletResponse
    ) = meetingInfoService.getMeetingInfo(userId, status, page, perPage, response)
    @ApiOperation(value = "根据id查找会议信息")
    @GetMapping("/info/meetingId/{userId}")
    fun getMeetingInfoById(
            @PathVariable userId: String,
            @RequestParam(value = "meetingId") meetingId: String
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("会议id") @RequestParam(value = "meetingId") meetingId: String
    ) = meetingInfoService.getMeetingInfoById(userId, meetingId)
    @ApiOperation(value = "上传会议信息")
    @PostMapping("/info/{userId}")
    fun addMeetingInfo(
            @PathVariable userId: String,
            @RequestBody meetingInfo: MeetingInfo
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("会议信息") @RequestBody meetingInfo: MeetingInfo
    ) = meetingInfoService.addMeetingInfo(userId, meetingInfo)
    @ApiOperation(value = "更新会议信息")
    @PutMapping("/info/{userId}")
    fun updateMeeting(
            @PathVariable userId: String,
            @RequestBody meetingInfo: MeetingInfo
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("会议信息") @RequestBody meetingInfo: MeetingInfo
    ) = meetingInfoService.updateMeetingInfo(userId, meetingInfo)
    @ApiOperation(value = "删除会议")
    @PostMapping("/delete/{userId}")
    fun deleteMeeting(
            @PathVariable userId: String,
            @RequestParam(value = "meetingId") meetingId: String
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("会议id") @RequestParam(value = "meetingId") meetingId: String
    ) = meetingInfoService.deleteMeetingInfo(userId, meetingId)
    @ApiOperation(value = "获取用户会议签到状态")
    @GetMapping("/registerStatus/{userId}")
    fun getMeetingRegisterStatus(
            @PathVariable userId: String,
            @RequestParam("meetingId") meetingId: String,
            @RequestParam("roomId") roomId: String?
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("会议id") @RequestParam("meetingId") meetingId: String,
        @ApiParam(value = "会议室id", required = false) @RequestParam("roomId") roomId: String?
    ) = meetingInfoService.getMeetingRegisterStatus(userId, meetingId, roomId)
    @ApiOperation(value = "获取会议签到记录")
    @GetMapping("/registerRecord/{userId}")
    fun getMeetingRegisterRecord(
            @PathVariable userId: String,
            @RequestParam("meetingId") meetingId: String,
            @RequestParam("roomId") roomId: String?
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("会议id") @RequestParam("meetingId") meetingId: String,
        @ApiParam(value = "会议室id", required = false) @RequestParam("roomId") roomId: String?
    ) = meetingInfoService.getMeetingRegisterRecord(userId, meetingId, roomId)
    @ApiOperation(value = "会议签到")
    @PostMapping("/register/{userId}")
    fun meetingRegister(
            @PathVariable userId: String,
            @RequestParam("meetingId") meetingId: String,
            @RequestParam("roomId") roomId: String?
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("会议id") @RequestParam("meetingId") meetingId: String,
        @ApiParam(value = "会议室id", required = false) @RequestParam("roomId") roomId: String?
    ) = meetingInfoService.meetingRegister(userId, meetingId, roomId)
    @ApiOperation(value = "获取会议的会议室")
    @GetMapping("/room/{userId}")
    fun getMeetingRoom(
            @PathVariable userId: String,
            @RequestParam("meetingId") meetingId: String
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("会议id") @RequestParam("meetingId") meetingId: String
    ) = meetingInfoService.getMeetingRoom(userId, meetingId)
    /*****************************参会人员********************************************/
    @ApiOperation(value = "添加会议参会人员")
    @PostMapping("/participant/{userId}")
    fun addParticipant(
            @PathVariable userId: String,
            @RequestBody participantList: List<Participant>
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("参会人员列表") @RequestBody participantList: List<Participant>
    ) = meetingInfoService.addParticipant(userId, participantList)
    @ApiOperation(value = "删除会议参会人员")
    @PostMapping("/participant/{userId}/delete")
    fun deleteParticipant(
            @PathVariable userId: String,
            @RequestParam(value = "meetingId") meetingId: String,
            @RequestBody participantList: List<Participant>
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("会议id") @RequestParam(value = "meetingId") meetingId: String,
        @ApiParam("待删除参会人员列表") @RequestBody participantList: List<Participant>
    ) = meetingInfoService.deleteParticipant(userId, meetingId, participantList)
    @ApiOperation(value = "获取会议的参会人员")
    @GetMapping("/participant/{userId}")
    fun getParticipant(
            @PathVariable userId: String,
            @RequestParam("meetingId") meetingId: String,
            @RequestParam("roomId") roomId: String?,
            @RequestParam("participantType") participantType: Int
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("会议id") @RequestParam("meetingId") meetingId: String,
        @ApiParam("会议室id") @RequestParam("roomId") roomId: String?,
        @ApiParam(value = "参会人员类型", name = "0:主持人,1:会议嘉宾,2:企业代表,3:一般与会人,99:其他,-1:全部", allowableValues = "0,1,2,3,99,-1") @RequestParam("participantType") participantType: Int
    ) = meetingInfoService.getParticipant(userId, meetingId, roomId, participantType)
    @ApiOperation(value = "获取会议在线人员")
    @GetMapping("/participant/{userId}/onlineCount")
    fun getOnlineUsers(
            @PathVariable userId: String,
            @RequestParam("meetingId") meetingId: String,
            @RequestParam("roomId") roomId: String
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("会议id") @RequestParam("meetingId") meetingId: String,
        @ApiParam("会议室id") @RequestParam("roomId") roomId: String
    ) = meetingInfoService.getOnlineUsers(userId, meetingId, roomId)
    @ApiOperation(value = "设置用户的禁言状态")
    @PostMapping("/participant/{userId}/setMute")
    fun setMuteStatus(
            @PathVariable userId: String,
            @RequestParam("meetingId") meetingId: String,
            @RequestParam("roomId") roomId: String,
            @RequestBody userStatusList: List<UserStatusVo>
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("会议id") @RequestParam("meetingId") meetingId: String,
        @ApiParam("会议室id") @RequestParam("roomId") roomId: String,
        @ApiParam("用户状态") @RequestBody userStatusList: List<UserStatusVo>
    ) = meetingInfoService.setMuteStatus(userId, meetingId, roomId, userStatusList)
    /*****************************会议文件********************************************/
    @ApiOperation(value = "上传会议文件")
    @PostMapping("/uploadFile/{userId}")
    fun uploadFiles(
            @PathVariable userId: String,
            @RequestParam("meetingId") meetingId: String,
            @RequestParam("roomId") roomId: String,
            @RequestParam("documentType") documentType: Int,
            @RequestParam("params") msgVo: String,
            @RequestPart("files") files: Array<MultipartFile>
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("会议id") @RequestParam("meetingId") meetingId: String,
        @ApiParam("会议室id") @RequestParam("roomId") roomId: String,
        @ApiParam("文件类型") @RequestParam("documentType") documentType: Int,
        @ApiParam("文件信息") @RequestParam("params") msgVo: String,
        @ApiParam("文件") @RequestPart("files") files: Array<MultipartFile>
    ) = meetingInfoService.uploadFile(userId, meetingId, roomId, msgVo, files, documentType)
    @ApiOperation(value = "获取会议室文件")
    @GetMapping("/material/{userId}")
    fun getMeetingMaterials(
            @PathVariable userId: String,
            @RequestParam("meetingId") meetingId: String,
            @RequestParam("mediaType") mediaType: Int,
            @RequestParam(value = "page") page: Int,
            @RequestParam(value = "per_page") perPage: Int,
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("会议id") @RequestParam("meetingId") meetingId: String,
        @ApiParam("会议室id") @RequestParam("mediaType") mediaType: Int,
        @ApiParam("页码") @RequestParam(value = "page") page: Int,
        @ApiParam("单页数据量") @RequestParam(value = "per_page") perPage: Int,
            response: HttpServletResponse
    ) = meetingInfoService.getMeetingMaterials(userId, meetingId, mediaType, page, perPage, response)
    @ApiOperation(value = "更新会议文件签收状态")
    @PostMapping("/material/sign/{userId}")
    fun updateSignState(
            @PathVariable userId: String,
            @RequestBody signStateList: List<MeetingMaterialVo>
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("会议文件签收状态") @RequestBody signStateList: List<MeetingMaterialVo>
    ) = meetingInfoService.updateSignState(userId, signStateList)
    @ApiOperation(value = "获取会议文件数量")
    @GetMapping("/count/material/{userId}")
    fun getMaterialCount(
            @PathVariable userId: String,
            @RequestParam("meetingId") meetingId: String,
            @RequestParam("mediaType") mediaType: Int,
            @RequestParam("meetingFileType") meetingFileType: Int
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("会议id") @RequestParam("meetingId") meetingId: String,
        @ApiParam("多媒体文件类型") @RequestParam("mediaType") mediaType: Int,
        @ApiParam("会议文件类型") @RequestParam("meetingFileType") meetingFileType: Int
    ) = meetingInfoService.getMaterialCount(userId, meetingId, mediaType, meetingFileType)
    @ApiOperation(value = "删除会议文件")
    @PostMapping("/material/delete/{userId}")
    fun deleteFiles(
            @PathVariable userId: String,
            @RequestParam("meetingId") meetingId: String,
            @RequestBody fileList: List<MeetingMaterialVo>
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("会议id") @RequestParam("meetingId") meetingId: String,
        @ApiParam("待删除会议文件") @RequestBody fileList: List<MeetingMaterialVo>
    ) = meetingInfoService.deleteFiles(userId, meetingId, fileList)
    @ApiOperation(value = "获取会议所有文件签收状态")
    @GetMapping("/count/all/material/{userId}")
    fun getAllMaterialSignStatus(
            @PathVariable userId: String,
            @RequestParam("meetingId") meetingId: String
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("会议id") @RequestParam("meetingId") meetingId: String
    ) = meetingInfoService.getAllMaterialSignStatus(userId, meetingId)
    /*****************************会议聊天记录********************************************/
    @ApiOperation(value = "获取会议聊天记录")
    @GetMapping("/comment/{userId}")
    fun getMeetingRecords(
            @PathVariable userId: String,
            @RequestParam("meetingId") meetingId: String,
            @RequestParam("roomId") roomId: String,
            @RequestParam(value = "page") page: Int,
            @RequestParam(value = "per_page") perPage: Int,
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("会议id") @RequestParam("meetingId") meetingId: String,
        @ApiParam("会议室id") @RequestParam("roomId") roomId: String,
        @ApiParam("页码") @RequestParam(value = "page") page: Int,
        @ApiParam("单页数据量") @RequestParam(value = "per_page") perPage: Int,
            response: HttpServletResponse
    ) = meetingInfoService.getMeetingRecords(userId, meetingId, roomId, page, perPage, response)
    /*****************************会议推送通知********************************************/
    @ApiOperation(value = "推送会议通知")
    @PostMapping("/push/{userId}")
    fun pushMeetingInfo(
            @PathVariable userId: String,
            @RequestParam("meetingId") meetingId: String,
            @RequestParam("roomId") roomId: String?,
            @RequestParam("title") title: String,
            @RequestParam("body") body: String
        @ApiParam("用户id") @PathVariable userId: String,
        @ApiParam("会议id") @RequestParam("meetingId") meetingId: String,
        @ApiParam("会议室id") @RequestParam("roomId") roomId: String?,
        @ApiParam("通知标题") @RequestParam("title") title: String,
        @ApiParam("通知内容") @RequestParam("body") body: String
    ) = meetingInfoService.pushMeetingInfo(userId, meetingId, roomId, title, body)
}
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/NotificationController.kt
@@ -5,6 +5,7 @@
import cn.flightfeather.supervision.lightshare.vo.NotificationVo
import io.swagger.annotations.Api
import io.swagger.annotations.ApiOperation
import io.swagger.annotations.ApiParam
import org.springframework.web.bind.annotation.*
import javax.servlet.http.HttpServletResponse
@@ -16,35 +17,35 @@
    @ApiOperation(value = "获取用户未读通知")
    @GetMapping
    fun getNotificationUnRead(
            @RequestParam(value = "userId") userId: String,
            @RequestParam(value = "page") page: Int,
            @RequestParam(value = "per_page") perPage: Int,
        @ApiParam("用户id") @RequestParam(value = "userId") userId: String,
        @ApiParam("页码") @RequestParam(value = "page") page: Int,
        @ApiParam("单页数据量") @RequestParam(value = "per_page") perPage: Int,
            response: HttpServletResponse
    ) = notificationService.getNotificationUnRead(userId, page, perPage, response)
    @ApiOperation(value = "更新通知读取状态")
    @PostMapping("/{userId}/readState")
    fun updateReadState(
            @PathVariable("userId") userId: String,
            @RequestBody readStates: List<NoticeReadStateVo>
        @ApiParam("用户id") @PathVariable("userId") userId: String,
        @ApiParam("通知读取状态") @RequestBody readStates: List<NoticeReadStateVo>
    ) = notificationService.updateReadState(userId, readStates)
    @ApiOperation(value = "获取通知长文本内容")
    @GetMapping("/text")
    fun getNotificationText(
            @RequestParam(value = "id") notificationId: String
        @ApiParam("通知id") @RequestParam(value = "id") notificationId: String
    ) = notificationService.getNotificationText(notificationId)
    @ApiOperation(value = "获取总未读通知数量")
    @GetMapping("/{userId}/unread")
    fun getUnReadNoticeNum(
            @PathVariable("userId") userId: String
        @ApiParam("用户id") @PathVariable("userId") userId: String
    ) = notificationService.getUnReadNoticeNum(userId)
    @ApiOperation(value = "发布通知")
    @PostMapping("{userId}/release")
    fun releaseNotice(
            @PathVariable("userId") userId: String,
            @RequestBody notice: NotificationVo
        @ApiParam("用户id") @PathVariable("userId") userId: String,
        @ApiParam("通知") @RequestBody notice: NotificationVo
    ) = notificationService.releaseNotice(userId, notice)
}
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/OpenApiWordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
package cn.flightfeather.supervision.lightshare.web;
import cn.flightfeather.supervision.lightshare.service.OpenApiWordService;
import io.swagger.annotations.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.SpringTemplateEngine;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Map;
@Controller
@Api(tags = "OpenAPI")
public class OpenApiWordController {
    @Value("${swagger.url}")
    private String swaggerUrl;
    @Autowired
    private OpenApiWordService openApiWordService;
    @Autowired
    private SpringTemplateEngine springTemplateEngine;
    private String fileName;
    /**
     * å°† swagger json文件转换成 word文档并下载
     *
     * @param model
     * @param jsonFile éœ€è¦è½¬æ¢æˆ word æ–‡æ¡£çš„swagger json文件
     * @param response
     * @return
     * @throws Exception
     */
    @ApiOperation(value = "将 swagger json文件转换成 word文档并下载", notes = "")
    @ApiResponses(value = {@ApiResponse(code = 200, message = "请求成功。")})
    @RequestMapping(value = "/OpenApiFileToWord", method = {RequestMethod.POST})
    public void getWord(Model model, @ApiParam("swagger json file") @Valid @RequestPart("jsonFile") MultipartFile jsonFile, HttpServletResponse response) throws Exception {
        generateModelData(model, jsonFile);
        writeContentToResponse(model, response);
    }
    private void generateModelData(Model model, MultipartFile jsonFile) throws IOException {
        Map<String, Object> result = openApiWordService.tableList(jsonFile);
        fileName = jsonFile.getOriginalFilename();
        if (fileName != null) {
            fileName = fileName.replaceAll(".json", "");
        } else {
            fileName = "toWord";
        }
        model.addAttribute("url", "http://");
        model.addAttribute("download", 0);
        model.addAllAttributes(result);
    }
    private void generateModelData(Model model, String url, Integer download) {
        url = StringUtils.defaultIfBlank(url, swaggerUrl);
        Map<String, Object> result = openApiWordService.tableList(url);
        model.addAttribute("url", url);
        model.addAttribute("download", download);
        model.addAllAttributes(result);
    }
    private void writeContentToResponse(Model model, HttpServletResponse response) {
        Context context = new Context();
        context.setVariables(model.asMap());
        String content = springTemplateEngine.process("word", context);
        response.setContentType("application/octet-stream;charset=utf-8");
        response.setCharacterEncoding("utf-8");
        try (BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream())) {
            response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".doc", "utf-8"));
            byte[] bytes = content.getBytes();
            bos.write(bytes, 0, bytes.length);
            bos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/ProblemController.kt
@@ -3,6 +3,7 @@
import cn.flightfeather.supervision.lightshare.service.ProblemService
import io.swagger.annotations.Api
import io.swagger.annotations.ApiOperation
import io.swagger.annotations.ApiParam
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
@@ -16,8 +17,8 @@
    @ApiOperation(value = "根据年月获取用户的问题")
    @GetMapping("/list")
    fun getProblemsByPeriod(
            @RequestParam("userId") userId: String,
            @RequestParam("year") year: Int,
            @RequestParam("month") month: Int
        @ApiParam("用户id") @RequestParam("userId") userId: String,
        @ApiParam("年份") @RequestParam("year") year: Int,
        @ApiParam("月份") @RequestParam("month") month: Int
    ) = problemService.getProblemsByPeriod(userId, year, month)
}
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/UserinfoController.kt
@@ -18,59 +18,74 @@
//    @GetMapping("")
//    fun getAll() = userinfoService.findAll()
    @ApiOperation(value = "根据用户id获取用户信息")
    @GetMapping("/{id}")
    fun getById(@PathVariable id: String) = userinfoService.findOne(id)
    fun getById(
        @ApiParam("用户id") @PathVariable id: String
    ) = userinfoService.findOne(id)
    @ApiOperation(value = "上传用户信息")
    @PutMapping("")
    fun add(@RequestBody userinfo: Userinfo) = userinfoService.save(userinfo)
    fun add(
        @ApiParam("用户信息") @RequestBody userinfo: Userinfo
    ) = userinfoService.save(userinfo)
    @ApiOperation(value = "更新用户信息")
    @PostMapping("")
    fun update(@RequestBody userinfo: Userinfo) = userinfoService.update(userinfo)
    fun update(
        @ApiParam("用户信息") @RequestBody userinfo: Userinfo
    ) = userinfoService.update(userinfo)
//    @DeleteMapping("/{id}")
//    fun delete(@PathVariable id: String) = userinfoService.delete(id)
    @ApiOperation(value = "登录")
    @PostMapping("/login")
    fun login(@RequestBody loginRequestVo: LoginRequestVo) = userinfoService.login(loginRequestVo)
    fun login(
        @ApiParam("登录信息") @RequestBody loginRequestVo: LoginRequestVo
    ) = userinfoService.login(loginRequestVo)
    @ApiOperation(value = "注册")
    @PostMapping("/register")
    fun register(@RequestBody loginRequestVo: LoginRequestVo) = userinfoService.register(loginRequestVo)
    fun register(
        @ApiParam("注册信息") @RequestBody loginRequestVo: LoginRequestVo
    ) = userinfoService.register(loginRequestVo)
    @ApiOperation(value = "获取用户通讯录")
    @GetMapping("/addressBook")
    fun getAddressBook(@RequestParam("userId") userId: String) = userinfoService.getAddressBook(userId)
    fun getAddressBook(
        @ApiParam("用户id") @RequestParam("userId") userId: String
    ) = userinfoService.getAddressBook(userId)
    @ApiOperation(value = "上传用户头像")
    @PostMapping("/accountPic/upLoad")
    fun upLoadUserAccountPic(
            @RequestParam("userId") userId: String,
            @RequestPart("images") files: Array<MultipartFile>
        @ApiParam("用户id") @RequestParam("userId") userId: String,
        @ApiParam("图片") @RequestPart("images") files: Array<MultipartFile>
    ) = userinfoService.upLoadAccountPic(userId, files)
    @ApiOperation(value = "修改密码")
    @PostMapping("/password/change/{userId}")
    fun changePassword(
            @RequestParam("userId") userId: String,
            @RequestParam("oldPassword") oldPassword: String,
            @RequestParam("newPassword") newPassword: String
        @ApiParam("用户id") @RequestParam("userId") userId: String,
        @ApiParam("旧密码") @RequestParam("oldPassword") oldPassword: String,
        @ApiParam("新密码") @RequestParam("newPassword") newPassword: String
    ) = userinfoService.changePassword(userId, oldPassword, newPassword)
    @ApiOperation(value = "根据查询者,找到同区县的用户")
    @PostMapping("/searchUser/{userId}")
    fun searchUser(
            @PathVariable("userId") userId: String,
            @RequestBody condition: UserSearchCondition,
            @RequestParam(value = "page") page: Int,
            @RequestParam(value = "per_page") perPage: Int,
        @ApiParam("用户id") @PathVariable("userId") userId: String,
        @ApiParam("查询条件") @RequestBody condition: UserSearchCondition,
        @ApiParam("页码") @RequestParam(value = "page") page: Int,
        @ApiParam("单页数据量") @RequestParam(value = "per_page") perPage: Int,
            response: HttpServletResponse
    ) = userinfoService.searchUser(userId, condition, page, perPage, response)
    @ApiOperation(value = "获取用户基本信息")
    @GetMapping("/baseInfo")
    fun getBaseInfo(
            @RequestParam("userId") userId: String
        @ApiParam("用户id") @RequestParam("userId") userId: String
    ) = userinfoService.getBaseInfo(userId)
    @ApiOperation(value = "根据给定条件,搜索用户")
@@ -79,7 +94,7 @@
        @ApiParam("区县", example = "徐汇区") @RequestParam("district", required = false) district: String,
        @ApiParam("场景类型", example = "1", allowableValues = "0,1,2,3,4,5,6,7") @RequestParam("sceneType", required = false) sceneType: Int,
        @ApiParam("用户类型", example = "0", allowableValues = "0,1,2,3") @RequestParam("userType", required = false) userType: Int,
        @RequestParam(value = "page") page: Int,
        @RequestParam(value = "per_page") perPage: Int,
        @ApiParam("页码") @RequestParam(value = "page") page: Int,
        @ApiParam("单页数据量") @RequestParam(value = "per_page") perPage: Int,
    ) = userinfoService.search(district, sceneType, userType, page, perPage)
}
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/VersionController.kt
@@ -3,30 +3,38 @@
import cn.flightfeather.supervision.domain.entity.Version
import cn.flightfeather.supervision.lightshare.service.VersionService
import io.swagger.annotations.Api
import io.swagger.annotations.ApiOperation
import io.swagger.annotations.ApiParam
import org.springframework.web.bind.annotation.*
import org.springframework.web.multipart.MultipartFile
import springfox.documentation.annotations.ApiIgnore
@Api(tags = ["系统相关API接口"])
@RestController
@RequestMapping("/version")
class VersionController(val versionService: VersionService) {
    @ApiIgnore
    @PutMapping("")
    fun add(@RequestBody version: Version) = versionService.save(version)
    @ApiIgnore
    @PostMapping("")
    fun update(@RequestBody version: Version) = versionService.update(version)
    @ApiIgnore
    @DeleteMapping("/{id}")
    fun delete(@PathVariable id: String) = versionService.delete(id)
    @ApiOperation(value = "获取最新app版本信息")
    @GetMapping("/latest")
    fun getLatestVersion() = versionService.getLatestVersion()
    @ApiOperation(value = "上传错误日志")
    @PostMapping("/crashInfo/upLoad")
    fun upLoadCrashInfo(
            @RequestParam("userId") userId: String,
            @RequestPart("files") files: Array<MultipartFile>
        @ApiParam("用户id") @RequestParam("userId") userId: String,
        @ApiParam("错误日志") @RequestPart("files") files: Array<MultipartFile>
    ) = versionService.upLoadCrashInfo(userId, files)
}
src/main/resources/application-dev.yml
@@ -3,5 +3,3 @@
    swagger:
      v2:
        enabled: true
src/main/resources/application.yml
@@ -77,4 +77,7 @@
  documentation:
    swagger:
      v2:
        enabled: false
        enabled: true
# Swagger json url address
# etc. https://petstore.swagger.io/
swagger.url: http://localhost:8080/v3/swagger.json
src/main/resources/templates/word.html
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,212 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta http-equiv="Content-Type" content="application/msword; charset=utf-8"/>
    <title>toWord</title>
    <style type="text/css">
        .bg {
            font-size: 14.5px;
            font-weight: bold;
            color: #000;
            background-color: #D7D7D7;
        }
        table {
            border-width: 1px;
            border-style: solid;
            border-color: black;
            table-layout: fixed;
        }
        tr {
            height: 32px;
            font-size: 12px;
        }
        td {
            padding-left: 10px;
            border-width: 1px;
            border-style: solid;
            border-color: black;
            height: 32px;
            overflow: hidden;
            word-break: break-all;
            word-wrap: break-word;
            font-size: 14.5px;
        }
        .bg td {
            font-size: 14.5px;
        }
        tr td {
            font-size: 14.5px;
        }
        .specialHeight {
            height: 40px;
        }
        .first_title {
            height: 60px;
            line-height: 60px;
            margin: 0;
            font-weight: bold;
            font-size: 21px;
        }
        .second_title {
            height: 40px;
            line-height: 40px;
            margin: 0;
            font-size: 18.5px;
        }
        .doc_title {
            font-size: 42.5px;
            text-align: center;
        }
        .download_btn {
            float: right;
        }
        body {
            font-family: æ€æºé»‘体 Normal;
        }
    </style>
</head>
<body>
<div style="width:800px; margin: 0 auto">
    <div>
        <p class="doc_title" th:text="${info.title +'('+ info.version +')'}"></p>
        <a class="download_btn" th:if="${download == 1}" th:href="${'/downloadWord?url='+ url}">下载文档</a>
        <br>
    </div>
    <div th:each="tableMap:${tableMap}" style="margin-bottom:20px;">
        <!--这个是类的说明-->
        <h4 class="first_title" th:text="${tableMap.count} + '. ' + ${tableMap.key}"></h4>
        <div th:each="table,tableStat:${tableMap.value}">
            <!--这个是每个请求的说明,方便生成文档后进行整理-->
            <h5 class="second_title" th:text="${tableStat.count} + ')' + ${table.tag}"></h5>
            <table border="1" cellspacing="0" cellpadding="0" width="100%">
                <tr class="bg">
                    <td colspan="5" th:text="${table.tag}"></td>
                </tr>
                <tr>
                    <td width="25%">接口描述</td>
                    <td colspan="4" th:text="${table.description}"></td>
                </tr>
                <tr>
                    <td>URL</td>
                    <td colspan="4" th:text="${table.url}"></td>
                </tr>
                <tr>
                    <td>请求方式</td>
                    <td colspan="4" th:text="${#strings.toUpperCase(table.requestType)}"></td>
                </tr>
                <tr>
                    <td>请求类型</td>
                    <td colspan="4" th:text="${table.requestForm}"></td>
                </tr>
                <tr>
                    <td>返回类型</td>
                    <td colspan="4" th:text="${table.responseForm}"></td>
                </tr>
                <tr class="bg">
                    <td>参数名</td>
                    <td width="15%">数据类型</td>
                    <td width="15%">参数类型</td>
                    <td width="15%">是否必填</td>
                    <td width="29%">说明</td>
                </tr>
                <th:block th:each="request, c:${table.requestList}">
                    <tr>
                        <td align="left" th:text="${c.count} + '.' + ${request.name}"></td>
                        <td th:text="${request.type}"></td>
                        <td th:text="${request.paramType}"></td>
                        <td th:if="${request.require}" th:text="Y"></td>
                        <td th:if="${!request.require}" th:text="N"></td>
                        <td th:text="${request.remark}"></td>
                        <!--                        <td th:if="${request.modelAttr}" th:text="asdfagadfg"></td>-->
                    </tr>
                    <th:block th:if="${request.modelAttr}">
                        <tbody th:include="this::request(${request.modelAttr.properties},${c.count} + '.', 1)"/>
                    </th:block>
                </th:block>
                <tr class="bg">
                    <td>状态码</td>
                    <td colspan="2">描述</td>
                    <td colspan="2">说明</td>
                </tr>
                <tr th:each="response:${table.responseList}">
                    <td th:text="${response.name}"></td>
                    <td colspan="2" th:text="${response.description}"></td>
                    <td colspan="2" th:text="${response.remark}"></td>
                </tr>
                <tr class="bg">
                    <td>返回属性名</td>
                    <td colspan="2">类型</td>
                    <td colspan="2">说明</td>
                </tr>
                <!--               å¯¹è¿”回参数 é€’归生成行-->
                <tbody th:include="this::response(${table.modelAttr.properties},'', 1)"/>
<!--                <tr class="bg">-->
<!--                    <td colspan="5">示例</td>-->
<!--                </tr>-->
<!--                <tr class="specialHeight">-->
<!--                    <td class="bg">请求参数</td>-->
<!--                    <td colspan="4" th:text="${table.requestParam}"></td>-->
<!--                </tr>-->
<!--                <tr class="specialHeight">-->
<!--                    <td class="bg">返回值</td>-->
<!--                    <td colspan="4" th:text="${table.responseParam}"></td>-->
<!--                </tr>-->
            </table>
        </div>
    </div>
</div>
<th:block th:fragment="request(properties,count, lv)">
    <th:block th:each="p,c : ${properties}">
        <tr>
            <td align="left" th:text="${count} + '' + ${c.count} + '.' + ${p.name}"
                th:style="|padding-left:${10*lv}px|"></td>
            <td th:text="${p.type}"></td>
            <td></td>
            <td th:if="${p.require}" th:text="Y"></td>
            <td th:if="${!p.require}" th:text="N"></td>
            <td th:text="${p.description}"></td>
        </tr>
        <th:block th:unless="${#lists.isEmpty(p.properties)}"
                  th:include="this::request(${p.properties},${count} + '' + ${c.count} + '.',${lv+1})"/>
    </th:block>
</th:block>
<th:block th:fragment="response(properties,count, lv)">
    <th:block th:each="p,c : ${properties}">
        <tr>
            <td align="left" th:text="${count} + '' + ${c.count} + '.' + ${p.name}"
                th:style="|padding-left:${10*lv}px|"></td>
            <td colspan="2" th:text="${p.type}"></td>
            <td colspan="2" th:text="${p.description}"></td>
        </tr>
        <th:block th:unless="${#lists.isEmpty(p.properties)}"
                  th:include="this::response(${p.properties},${count} + '' + ${c.count} + '.',${lv+1})"/>
    </th:block>
</th:block>
</body>
</html>
src/test/kotlin/cn/flightfeather/supervision/common/score/AutoScoreTest.kt
@@ -20,6 +20,6 @@
    @Test
    fun go() {
        autoScore.go(2021, 10)
        autoScore.go(2022, 1)
    }
}