@@ -0,0 +1,8 @@ | |||||
### IDEA ### | |||||
*.iml | |||||
*/target/* | |||||
*/*.iml | |||||
/.gradle/ | |||||
*.pid | |||||
logs | |||||
/.idea/ |
@@ -0,0 +1,240 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||||
<modelVersion>4.0.0</modelVersion> | |||||
<parent> | |||||
<groupId>com.ningdatech</groupId> | |||||
<artifactId>kq-value-added-project</artifactId> | |||||
<version>1.0.0</version> | |||||
</parent> | |||||
<artifactId>kqapi</artifactId> | |||||
<version>1.0.0</version> | |||||
<properties> | |||||
</properties> | |||||
<dependencies> | |||||
<dependency> | |||||
<groupId>com.google.guava</groupId> | |||||
<artifactId>guava</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>cn.hutool</groupId> | |||||
<artifactId>hutool-all</artifactId> | |||||
<version>5.8.5</version> | |||||
</dependency> | |||||
<!--lombok--> | |||||
<dependency> | |||||
<groupId>org.projectlombok</groupId> | |||||
<artifactId>lombok</artifactId> | |||||
</dependency> | |||||
<!-- mybatis plus--> | |||||
<dependency> | |||||
<groupId>com.baomidou</groupId> | |||||
<artifactId>mybatis-plus-boot-starter</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.baomidou</groupId> | |||||
<artifactId>mybatis-plus-extension</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-freemarker</artifactId> | |||||
</dependency> | |||||
<!--spring boot 集成redis所需common-pool2--> | |||||
<dependency> | |||||
<groupId>org.apache.commons</groupId> | |||||
<artifactId>commons-pool2</artifactId> | |||||
<version>${commons-pool2.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.commons</groupId> | |||||
<artifactId>commons-lang3</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.alibaba</groupId> | |||||
<artifactId>fastjson</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.tomcat.embed</groupId> | |||||
<artifactId>tomcat-embed-core</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-validation</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-web</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-jdbc</artifactId> | |||||
</dependency> | |||||
<!--实现springboot的热加载--> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-devtools</artifactId> | |||||
<optional>true</optional> | |||||
<scope>true</scope> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-aop</artifactId> | |||||
</dependency> | |||||
<!--cache--> | |||||
<dependency> | |||||
<groupId>com.github.ben-manes.caffeine</groupId> | |||||
<artifactId>caffeine</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.httpcomponents</groupId> | |||||
<artifactId>httpclient</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.poi</groupId> | |||||
<artifactId>poi</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.poi</groupId> | |||||
<artifactId>poi-ooxml</artifactId> | |||||
</dependency> | |||||
<!-- 阿里云oss --> | |||||
<dependency> | |||||
<groupId>com.aliyun.oss</groupId> | |||||
<artifactId>aliyun-sdk-oss</artifactId> | |||||
<version>3.15.0</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>junit</groupId> | |||||
<artifactId>junit</artifactId> | |||||
<scope>test</scope> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.aspectj</groupId> | |||||
<artifactId>aspectjweaver</artifactId> | |||||
</dependency> | |||||
<!--Spring boot 测试--> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-test</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-configuration-processor</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.ningdatech</groupId> | |||||
<artifactId>nd-basic</artifactId> | |||||
<exclusions> | |||||
<exclusion> | |||||
<groupId>org.slf4j</groupId> | |||||
<artifactId>slf4j-log4j12</artifactId> | |||||
</exclusion> | |||||
<exclusion> | |||||
<artifactId>spring-boot-starter-security</artifactId> | |||||
<groupId>org.springframework.boot</groupId> | |||||
</exclusion> | |||||
</exclusions> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.ningdatech</groupId> | |||||
<artifactId>nd-swagger2-starter</artifactId> | |||||
<exclusions> | |||||
<exclusion> | |||||
<groupId>org.slf4j</groupId> | |||||
<artifactId>slf4j-log4j12</artifactId> | |||||
</exclusion> | |||||
</exclusions> | |||||
</dependency> | |||||
<!-- MYSQL --> | |||||
<dependency> | |||||
<groupId>mysql</groupId> | |||||
<artifactId>mysql-connector-java</artifactId> | |||||
</dependency> | |||||
</dependencies> | |||||
<!-- 打包 --> | |||||
<!--配置环境的profile--> | |||||
<profiles> | |||||
<profile> | |||||
<id>dev</id> | |||||
<properties> | |||||
<!--使用${environment}获取值--> | |||||
<environment>dev</environment> | |||||
</properties> | |||||
</profile> | |||||
<profile> | |||||
<id>test</id> | |||||
<properties> | |||||
<environment>test</environment> | |||||
</properties> | |||||
</profile> | |||||
<profile> | |||||
<id>pre</id> | |||||
<properties> | |||||
<environment>pre</environment> | |||||
</properties> | |||||
</profile> | |||||
<profile> | |||||
<id>prod</id> | |||||
<properties> | |||||
<environment>prod</environment> | |||||
</properties> | |||||
</profile> | |||||
</profiles> | |||||
<build> | |||||
<resources> | |||||
<resource> | |||||
<directory>src/main/resources</directory> | |||||
<includes> | |||||
<include>**/*</include> | |||||
</includes> | |||||
</resource> | |||||
<resource> | |||||
<directory>src/main/java</directory> | |||||
<includes> | |||||
<include>**/*.xml</include> | |||||
</includes> | |||||
</resource> | |||||
<resource> | |||||
<directory>src/main/lib</directory> | |||||
<targetPath>BOOT-INF/lib/</targetPath> | |||||
<includes> | |||||
<include>**/*.jar</include> | |||||
</includes> | |||||
</resource> | |||||
<resource> | |||||
<directory>src/main/resources</directory> | |||||
<targetPath>BOOT-INF/classes/</targetPath> | |||||
</resource> | |||||
</resources> | |||||
<finalName>${project.artifactId}</finalName> | |||||
<plugins> | |||||
<plugin> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-maven-plugin</artifactId> | |||||
<version>2.6.8</version> | |||||
<configuration> | |||||
<includeSystemScope>true</includeSystemScope> | |||||
</configuration> | |||||
<executions> | |||||
<execution> | |||||
<goals> | |||||
<goal>repackage</goal> | |||||
</goals> | |||||
</execution> | |||||
</executions> | |||||
</plugin> | |||||
<!-- 跳过单元测试 --> | |||||
<plugin> | |||||
<groupId>org.apache.maven.plugins</groupId> | |||||
<artifactId>maven-surefire-plugin</artifactId> | |||||
<configuration> | |||||
<skipTests>true</skipTests> | |||||
</configuration> | |||||
</plugin> | |||||
</plugins> | |||||
</build> | |||||
</project> |
@@ -0,0 +1,41 @@ | |||||
package com.ningdatech.kqapi; | |||||
import com.ningdatech.basic.util.SpringUtils; | |||||
import com.ningdatech.kqapi.common.util.SpringContextHolder; | |||||
import org.mybatis.spring.annotation.MapperScan; | |||||
import org.springframework.boot.SpringApplication; | |||||
import org.springframework.boot.autoconfigure.SpringBootApplication; | |||||
import org.springframework.context.ApplicationContext; | |||||
import org.springframework.context.annotation.Bean; | |||||
import org.springframework.context.annotation.ComponentScan; | |||||
import org.springframework.context.annotation.EnableAspectJAutoProxy; | |||||
import org.springframework.scheduling.annotation.EnableAsync; | |||||
import org.springframework.scheduling.annotation.EnableScheduling; | |||||
import org.springframework.transaction.annotation.EnableTransactionManagement; | |||||
/** | |||||
* @author zpf | |||||
*/ | |||||
@SpringBootApplication | |||||
@EnableAsync | |||||
@MapperScan(App.MAPPER_PACKAGES) | |||||
@EnableScheduling | |||||
@EnableTransactionManagement | |||||
@EnableAspectJAutoProxy(exposeProxy = true) | |||||
@ComponentScan(basePackages = {"com.ningdatech.kqapi","com.ningdatech.kqapi.common"}) | |||||
public class App { | |||||
protected static final String MAPPER_PACKAGES = "com.ningdatech.kqapi.**.mapper"; | |||||
public static void main(String[] args) { | |||||
ApplicationContext context = SpringApplication.run(App.class, args); | |||||
// 设置applicationContext | |||||
SpringUtils.setApplicationContext(context); | |||||
} | |||||
@Bean | |||||
public SpringContextHolder springContextHolder() { | |||||
return new SpringContextHolder(); | |||||
} | |||||
} |
@@ -0,0 +1,22 @@ | |||||
package com.ningdatech.kqapi.common.compare; | |||||
import java.lang.annotation.ElementType; | |||||
import java.lang.annotation.Retention; | |||||
import java.lang.annotation.RetentionPolicy; | |||||
import java.lang.annotation.Target; | |||||
/** | |||||
* 字段标记注解 | |||||
* | |||||
* @author zpf | |||||
* @since 2023/07/21 | |||||
*/ | |||||
@Target(ElementType.FIELD) | |||||
@Retention(RetentionPolicy.RUNTIME) | |||||
public @interface Compare { | |||||
/** | |||||
* 字段名称 | |||||
*/ | |||||
String value(); | |||||
} |
@@ -0,0 +1,47 @@ | |||||
package com.ningdatech.kqapi.common.compare; | |||||
/** | |||||
* @author zpf | |||||
* @since 2023/07/21 | |||||
*/ | |||||
public class CompareNode { | |||||
/** | |||||
* 字段 | |||||
*/ | |||||
private String fieldKey; | |||||
/** | |||||
* 字段值 | |||||
*/ | |||||
private Object fieldValue; | |||||
/** | |||||
* 字段名称 | |||||
*/ | |||||
private String fieldName; | |||||
public String getFieldKey() { | |||||
return fieldKey; | |||||
} | |||||
public void setFieldKey(String fieldKey) { | |||||
this.fieldKey = fieldKey; | |||||
} | |||||
public Object getFieldValue() { | |||||
return fieldValue; | |||||
} | |||||
public void setFieldValue(Object fieldValue) { | |||||
this.fieldValue = fieldValue; | |||||
} | |||||
public String getFieldName() { | |||||
return fieldName; | |||||
} | |||||
public void setFieldName(String fieldName) { | |||||
this.fieldName = fieldName; | |||||
} | |||||
} |
@@ -0,0 +1,182 @@ | |||||
package com.ningdatech.kqapi.common.compare; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import java.lang.reflect.Field; | |||||
import java.util.*; | |||||
/** | |||||
* 使用须知: <br> | |||||
* (1)该工具类主要用于两个同类对象的属性值比较; <br> | |||||
* (2)使用本工具类前,请将对应的类属性上打上 @Compare("xxx") 注解,其中xxx为字段的表达名称;<br> | |||||
* (3)为了比较灵活,只有打了该注解才会进行比较,不打的字段则不会进行比较 <br> | |||||
* (4)比较后,只会返回有变化的字段,无变化的字符则不返回 <br> | |||||
* | |||||
* @author zpf | |||||
* @since 2023/07/21 | |||||
*/ | |||||
public class CompareUtils<T> { | |||||
private static final String COMMA = ","; | |||||
/** | |||||
* 属性比较 | |||||
* | |||||
* @param source 源数据对象 | |||||
* @param target 目标数据对象 | |||||
* @return 对应属性值的比较变化 | |||||
*/ | |||||
public String compare(T source, T target) { | |||||
return compare(source, target, null); | |||||
} | |||||
/** | |||||
* 属性比较 | |||||
* | |||||
* @param source 源数据对象 | |||||
* @param target 目标数据对象 | |||||
* @param ignoreCompareFields 忽略比较的字段 | |||||
* @return 对应属性值的比较变化 | |||||
*/ | |||||
public String compare(T source, T target, List<String> ignoreCompareFields) { | |||||
if (Objects.isNull(source) && Objects.isNull(target)) { | |||||
return ""; | |||||
} | |||||
Map<String, CompareNode> sourceMap = this.getFiledValueMap(source); | |||||
Map<String, CompareNode> targetMap = this.getFiledValueMap(target); | |||||
if (sourceMap.isEmpty() && targetMap.isEmpty()) { | |||||
return ""; | |||||
} | |||||
// 如果源数据为空,则只显示目标数据,不显示属性变化情况 | |||||
if (sourceMap.isEmpty()) { | |||||
return doEmpty(targetMap, ignoreCompareFields); | |||||
} | |||||
// 如果源数据为空,则显示属性变化情况 | |||||
String s = doCompare(sourceMap, targetMap, ignoreCompareFields); | |||||
if (!s.endsWith(COMMA)) { | |||||
return s; | |||||
} | |||||
return s.substring(0, s.length() - 1); | |||||
} | |||||
public JSONObject compareToJson(T source, T target, List<String> ignoreCompareFields) { | |||||
JSONObject res = new JSONObject(); | |||||
if (Objects.isNull(source) && Objects.isNull(target)) { | |||||
return res; | |||||
} | |||||
Map<String, CompareNode> sourceMap = this.getFiledValueMap(source); | |||||
Map<String, CompareNode> targetMap = this.getFiledValueMap(target); | |||||
if (sourceMap.isEmpty() && targetMap.isEmpty()) { | |||||
return res; | |||||
} | |||||
// 如果源数据为空,则只显示目标数据,不显示属性变化情况 | |||||
if (sourceMap.isEmpty()) { | |||||
return res; | |||||
} | |||||
return doCompareJson(sourceMap, targetMap, ignoreCompareFields); | |||||
} | |||||
private String doEmpty(Map<String, CompareNode> targetMap, List<String> ignoreCompareFields) { | |||||
StringBuilder sb = new StringBuilder(); | |||||
Collection<CompareNode> values = targetMap.values(); | |||||
int size = values.size(); | |||||
int current = 0; | |||||
for (CompareNode node : values) { | |||||
current++; | |||||
Object o = Optional.ofNullable(node.getFieldValue()).orElse(""); | |||||
if (Objects.nonNull(ignoreCompareFields) && ignoreCompareFields.contains(node.getFieldKey())) { | |||||
continue; | |||||
} | |||||
if (o.toString().length() > 0) { | |||||
sb.append("[" + node.getFieldName() + ":" + o + "]"); | |||||
if (current < size) { | |||||
sb.append(COMMA); | |||||
} | |||||
} | |||||
} | |||||
return sb.toString(); | |||||
} | |||||
private String doCompare(Map<String, CompareNode> sourceMap, Map<String, CompareNode> targetMap, List<String> ignoreCompareFields) { | |||||
StringBuilder sb = new StringBuilder(); | |||||
Set<String> keys = sourceMap.keySet(); | |||||
int size = keys.size(); | |||||
int current = 0; | |||||
for (String key : keys) { | |||||
current++; | |||||
CompareNode sn = sourceMap.get(key); | |||||
CompareNode tn = targetMap.get(key); | |||||
if (Objects.nonNull(ignoreCompareFields) && ignoreCompareFields.contains(sn.getFieldKey())) { | |||||
continue; | |||||
} | |||||
String sv = Optional.ofNullable(sn.getFieldValue()).orElse("").toString(); | |||||
String tv = Optional.ofNullable(tn.getFieldValue()).orElse("").toString(); | |||||
// 只有两者属性值不一致时, 才显示变化情况 | |||||
if (!sv.equals(tv)) { | |||||
sb.append(String.format("[%s:%s -> %s]", sn.getFieldName(), sv, tv)); | |||||
if (current < size) { | |||||
sb.append(COMMA); | |||||
} | |||||
} | |||||
} | |||||
return sb.toString(); | |||||
} | |||||
private JSONObject doCompareJson(Map<String, CompareNode> sourceMap, Map<String, CompareNode> targetMap, List<String> ignoreCompareFields) { | |||||
JSONObject res = new JSONObject(); | |||||
Set<String> keys = sourceMap.keySet(); | |||||
int size = keys.size(); | |||||
int current = 0; | |||||
for (String key : keys) { | |||||
current++; | |||||
CompareNode sn = sourceMap.get(key); | |||||
CompareNode tn = targetMap.get(key); | |||||
if (Objects.nonNull(ignoreCompareFields) && ignoreCompareFields.contains(sn.getFieldKey())) { | |||||
continue; | |||||
} | |||||
String sv = Optional.ofNullable(sn.getFieldValue()).orElse("").toString(); | |||||
String tv = Optional.ofNullable(tn.getFieldValue()).orElse("").toString(); | |||||
// 只有两者属性值不一致时, 才显示变化情况 | |||||
if (!sv.equals(tv)) { | |||||
JSONObject valueChange = new JSONObject(); | |||||
valueChange.put("fieldKey",sn.getFieldKey()); | |||||
valueChange.put("old",tv); | |||||
valueChange.put("new",sv); | |||||
res.put(sn.getFieldName(),valueChange); | |||||
} | |||||
} | |||||
return res; | |||||
} | |||||
private Map<String, CompareNode> getFiledValueMap(T t) { | |||||
if (Objects.isNull(t)) { | |||||
return Collections.emptyMap(); | |||||
} | |||||
Field[] fields = t.getClass().getDeclaredFields(); | |||||
if (Objects.isNull(fields) || fields.length == 0) { | |||||
return Collections.emptyMap(); | |||||
} | |||||
Map<String, CompareNode> map = new LinkedHashMap(); | |||||
for (Field field : fields) { | |||||
Compare compareAnnotation = field.getAnnotation(Compare.class); | |||||
if (Objects.isNull(compareAnnotation)) { | |||||
continue; | |||||
} | |||||
field.setAccessible(true); | |||||
try { | |||||
String fieldKey = field.getName(); | |||||
CompareNode node = new CompareNode(); | |||||
node.setFieldKey(fieldKey); | |||||
node.setFieldValue(field.get(t)); | |||||
node.setFieldName(compareAnnotation.value()); | |||||
map.put(field.getName(), node); | |||||
} catch (IllegalArgumentException | IllegalAccessException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
return map; | |||||
} | |||||
} |
@@ -0,0 +1,109 @@ | |||||
package com.ningdatech.kqapi.common.config; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.apache.http.Header; | |||||
import org.apache.http.client.HttpClient; | |||||
import org.apache.http.client.config.RequestConfig; | |||||
import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy; | |||||
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; | |||||
import org.apache.http.impl.client.HttpClientBuilder; | |||||
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; | |||||
import org.apache.http.message.BasicHeader; | |||||
import org.springframework.context.annotation.Bean; | |||||
import org.springframework.context.annotation.Configuration; | |||||
import org.springframework.http.MediaType; | |||||
import org.springframework.http.client.ClientHttpRequestFactory; | |||||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; | |||||
import org.springframework.http.converter.HttpMessageConverter; | |||||
import org.springframework.http.converter.StringHttpMessageConverter; | |||||
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; | |||||
import org.springframework.web.client.RestTemplate; | |||||
import java.nio.charset.StandardCharsets; | |||||
import java.util.ArrayList; | |||||
import java.util.Arrays; | |||||
import java.util.List; | |||||
import java.util.concurrent.TimeUnit; | |||||
/** | |||||
* @Classname BeanConfig | |||||
* @Description | |||||
* @Date 2023/3/2 9:42 | |||||
* @Created by PoffyZhang | |||||
*/ | |||||
@Configuration | |||||
@Slf4j | |||||
public class BeanConfig { | |||||
@Bean | |||||
public RestTemplate restTemplate() { | |||||
// 添加内容转换器,使用默认的内容转换器 | |||||
RestTemplate restTemplate = new RestTemplate(httpRequestFactory()); | |||||
// 设置编码格式为UTF-8,解决中文乱码问题 | |||||
List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters(); | |||||
HttpMessageConverter<?> converterTarget = null; | |||||
for (HttpMessageConverter<?> item : converterList) { | |||||
if (item.getClass() == StringHttpMessageConverter.class) { | |||||
converterTarget = item; | |||||
break; | |||||
} | |||||
} | |||||
if (converterTarget != null) { | |||||
converterList.remove(converterTarget); | |||||
} | |||||
HttpMessageConverter<?> converter = new StringHttpMessageConverter(StandardCharsets.UTF_8); | |||||
converterList.add(1,converter); | |||||
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); | |||||
mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Arrays.asList( | |||||
MediaType.TEXT_HTML, | |||||
MediaType.TEXT_PLAIN)); | |||||
restTemplate.getMessageConverters().add(mappingJackson2HttpMessageConverter); | |||||
log.info("-----restTemplate-----初始化完成"); | |||||
return restTemplate; | |||||
} | |||||
@Bean | |||||
public ClientHttpRequestFactory httpRequestFactory() { | |||||
return new HttpComponentsClientHttpRequestFactory(httpClient()); | |||||
} | |||||
@Bean | |||||
public HttpClient httpClient() { | |||||
// 长连接保持30秒 | |||||
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(30, TimeUnit.SECONDS); | |||||
//设置整个连接池最大连接数 根据自己的场景决定 | |||||
connectionManager.setMaxTotal(500); | |||||
//同路由的并发数,路由是对maxTotal的细分 | |||||
connectionManager.setDefaultMaxPerRoute(500); | |||||
//requestConfig | |||||
RequestConfig requestConfig = RequestConfig.custom() | |||||
//服务器返回数据(response)的时间,超过该时间抛出read timeout | |||||
.setSocketTimeout(10000) | |||||
//连接上服务器(握手成功)的时间,超出该时间抛出connect timeout | |||||
.setConnectTimeout(5000) | |||||
//从连接池中获取连接的超时时间,超过该时间未拿到可用连接,会抛出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool | |||||
.setConnectionRequestTimeout(500) | |||||
.build(); | |||||
//headers | |||||
List<Header> headers = new ArrayList<>(); | |||||
headers.add(new BasicHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36")); | |||||
headers.add(new BasicHeader("Accept-Encoding", "gzip,deflate")); | |||||
headers.add(new BasicHeader("Accept-Language", "zh-CN")); | |||||
headers.add(new BasicHeader("Connection", "Keep-Alive")); | |||||
headers.add(new BasicHeader("Content-type", "application/json;charset=UTF-8")); | |||||
return HttpClientBuilder.create() | |||||
.setDefaultRequestConfig(requestConfig) | |||||
.setConnectionManager(connectionManager) | |||||
.setDefaultHeaders(headers) | |||||
// 保持长连接配置,需要在头添加Keep-Alive | |||||
.setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy()) | |||||
//重试次数,默认是3次,没有开启 | |||||
.setRetryHandler(new DefaultHttpRequestRetryHandler(2, true)) | |||||
.build(); | |||||
} | |||||
} |
@@ -0,0 +1,37 @@ | |||||
package com.ningdatech.kqapi.common.config; | |||||
import com.alibaba.fastjson.serializer.SerializerFeature; | |||||
import com.alibaba.fastjson.support.config.FastJsonConfig; | |||||
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; | |||||
import org.springframework.context.annotation.Configuration; | |||||
import org.springframework.http.MediaType; | |||||
import org.springframework.http.converter.HttpMessageConverter; | |||||
import org.springframework.web.servlet.config.annotation.EnableWebMvc; | |||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; | |||||
import java.nio.charset.StandardCharsets; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
/** | |||||
* @author qinxianyun | |||||
*/ | |||||
@EnableWebMvc | |||||
@Configuration | |||||
public class ConfigurerAdapter implements WebMvcConfigurer { | |||||
@Override | |||||
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { | |||||
// 使用 fastjson 序列化,会导致 @JsonIgnore 失效,可以使用 @JSONField(serialize = false) 替换 | |||||
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); | |||||
List<MediaType> supportMediaTypeList = new ArrayList<>(); | |||||
supportMediaTypeList.add(MediaType.APPLICATION_JSON); | |||||
FastJsonConfig config = new FastJsonConfig(); | |||||
config.setDateFormat("yyyy-MM-dd HH:mm:ss"); | |||||
config.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect); | |||||
converter.setFastJsonConfig(config); | |||||
converter.setSupportedMediaTypes(supportMediaTypeList); | |||||
converter.setDefaultCharset(StandardCharsets.UTF_8); | |||||
converters.add(converter); | |||||
} | |||||
} |
@@ -0,0 +1,19 @@ | |||||
package com.ningdatech.kqapi.common.config; | |||||
import lombok.Data; | |||||
import org.springframework.boot.context.properties.ConfigurationProperties; | |||||
import org.springframework.context.annotation.Configuration; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/9/9 下午5:37 | |||||
*/ | |||||
@Data | |||||
@Configuration | |||||
@ConfigurationProperties(prefix = "organization") | |||||
public class DingOrganizationProperties { | |||||
private List<String> deptVisibleScopes = new ArrayList<>(); | |||||
} |
@@ -0,0 +1,26 @@ | |||||
package com.ningdatech.kqapi.common.config; | |||||
import lombok.Data; | |||||
import org.springframework.boot.context.properties.ConfigurationProperties; | |||||
import org.springframework.context.annotation.Configuration; | |||||
/** | |||||
* @author zpf | |||||
* @date 2023/3/2 下午5:37 | |||||
*/ | |||||
@Data | |||||
@Configuration | |||||
@ConfigurationProperties(prefix = "provincial") | |||||
public class ProvincialProperties { | |||||
private String host; | |||||
private String pushUrl; | |||||
private String detailUrl; | |||||
private String domainUrl; | |||||
private String key; | |||||
private String secret; | |||||
} |
@@ -0,0 +1,18 @@ | |||||
package com.ningdatech.kqapi.common.constant; | |||||
/** | |||||
* <p> | |||||
* 创建人修改人基础字段 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 17:17 2023/01/29 | |||||
*/ | |||||
public interface BaseFieldConst { | |||||
String CREATE_BY = "createBy"; | |||||
String UPDATE_BY = "updateBy"; | |||||
String CREATE_ON = "createOn"; | |||||
String UPDATE_ON = "updateOn"; | |||||
} |
@@ -0,0 +1,108 @@ | |||||
package com.ningdatech.kqapi.common.constant; | |||||
import com.ningdatech.basic.model.ApiResponse; | |||||
import java.math.BigDecimal; | |||||
/** | |||||
* <p> | |||||
* 业务常量 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 13:42 2022/12/1 | |||||
*/ | |||||
public interface BizConst { | |||||
/** | |||||
* SQL查询一条 | |||||
*/ | |||||
String LIMIT_1 = "limit 1"; | |||||
String COOKIE_KEY = "ND_PROJECT_MANAGEMENT_JSESSION"; | |||||
/** | |||||
* 一小时秒数 | |||||
**/ | |||||
BigDecimal SECONDS_BY_HOUR = new BigDecimal(60 * 60); | |||||
/** | |||||
* 十分钟的毫秒数 | |||||
*/ | |||||
long MILLS_10_MIN = 1000L * 60 * 10; | |||||
/** | |||||
* 中国行政区划编码 | |||||
*/ | |||||
long ROOT_REGION_CODE = 100000L; | |||||
/** | |||||
* 一级行政区划数量 | |||||
*/ | |||||
int NUM_PROVINCE = 34; | |||||
/** | |||||
* 默认的父id | |||||
*/ | |||||
long PARENT_ID = 0L; | |||||
/** | |||||
* 默认树层级 | |||||
*/ | |||||
int TREE_GRADE = 0; | |||||
/** | |||||
* 默认的排序 | |||||
*/ | |||||
int SORT_VALUE = 0; | |||||
/** | |||||
* 浙江省的region_id | |||||
*/ | |||||
long ZJ_REGION_CODE = 330000L; | |||||
String NINE_AREA_CODE_LAST = "000"; | |||||
/** | |||||
* 省/直辖市 level | |||||
*/ | |||||
int GOV_L1 = 1; | |||||
/** | |||||
* 市 level | |||||
*/ | |||||
int GOV_L2 = 2; | |||||
/** | |||||
* 区/县 level | |||||
*/ | |||||
int GOV_L3 = 3; | |||||
/** | |||||
* 密码正则:长度8-20位且至少包含大写字母、小写字母、数字或特殊符号中的任意三种 | |||||
*/ | |||||
String REGEX_PASS = "^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_]+$)(?![a-z0-9]+$)(?![a-z\\W_]+$)(?![0-9\\W_]+$)[a-zA-Z0-9\\W_]{8,20}$"; | |||||
ApiResponse<Void> UNAUTHENTICATED = ApiResponse.of(401, "用户未登录", null); | |||||
int MAX_EXPORT_COUNT = 5000; | |||||
String RESPONSE_KEY_DATA = "data"; | |||||
String RESPONSE_KEY_ID = "id"; | |||||
String RESPONSE_KEY_DING_CODE = "dingCode"; | |||||
String RESPONSE_KEY_MATTER_NAME = "matterName"; | |||||
String RESPONSE_KEY_ORG_NAME = "orgName"; | |||||
String RESPONSE_KEY_USER_STATE = "userState"; | |||||
String RESPONSE_KEY_AREA_NAME = "areaName"; | |||||
String ORG_NAME = "organizationName"; | |||||
String ORG_CODE = "organizationCode"; | |||||
String DEV = "dev"; | |||||
String PRE = "pre"; | |||||
String PROD = "prod"; | |||||
String SAVE_SUCCESS = "保存成功"; | |||||
String OP_SUCCESS = "操作成功"; | |||||
String OP_FAIL = "操作失败"; | |||||
String SAVE_FAIL = "保存失败"; | |||||
} |
@@ -0,0 +1,69 @@ | |||||
package com.ningdatech.kqapi.common.constant; | |||||
/** | |||||
* @description: 常量 | |||||
* @author: LiuXinXin | |||||
* @date: 2022/5/5 17:31 | |||||
*/ | |||||
public interface CommonConst { | |||||
String COOKIE_KEY = "ND_JSESSION"; | |||||
Integer EXPORT_PAGE_NUMBER = 1; | |||||
Integer EXPORT_PAGE_SIZE = 100000; | |||||
String CALL_STATUS = "status"; | |||||
String CALL_STATUS_OK_VALUE = "ok"; | |||||
Integer COMMENT_MAX_SIZE = 163; | |||||
Integer SUB_COMMENT_SIZE_MIN = 0; | |||||
Integer SUB_COMMENT_SIZE_MAX = 160; | |||||
String PROJECT_DECLARE = "项目申报"; | |||||
String UNIT_INNER_AUDIT = "单位内部审核"; | |||||
String PRELIMINARY_PREVIEW = "项目预审"; | |||||
String DEPT_UNITED_REVIEW = "部门联审"; | |||||
String PROVINCE_UNITED_REVIEW = "省级部门联审"; | |||||
String ANNUAL_PLAN = "年度计划"; | |||||
String CONSTRUCTION_PLAN_REVIEW = "建设方案评审"; | |||||
String PROJECT_APPROVAL = "立项批复"; | |||||
String TENDER_PURCHASE = "招标采购"; | |||||
String PROJECT_PRELIMINARY_INSPECTION = "项目初验"; | |||||
String PROJECT_FINAL_INSPECTION = "项目终验"; | |||||
String ARCHIVED = "归档"; | |||||
String FILE_NAME = "name"; | |||||
String BASIS_FILE_NAME = "fileName"; | |||||
String NULL = "null"; | |||||
String TITLE = "title"; | |||||
String FILE_NAME_STR = "fileName"; | |||||
String FILE_ID_STR = "fileId"; | |||||
String ID_STR = "id"; | |||||
String FILE_LIST = "fileList"; | |||||
String ITEM_BASED = "依据项:"; | |||||
String ITEM_BASED_FILE_NAME = "依据文件名:"; | |||||
String APPENDIX = "文件:"; | |||||
String NEW_CONSTRUCTION = "新建"; | |||||
String CONTINUED_CONSTRUCTION = "续建"; | |||||
String MONTH = "月"; | |||||
String ZHI = "至"; | |||||
String YEAR = "年"; | |||||
Integer VERSION_ONE = 1; | |||||
Integer VERSION_SIZE = 2; | |||||
Integer VERSION_JUDGE = -1; | |||||
String COPY = "副本"; | |||||
String PROJECT_REPEAT = " 项目已在其他评价计划中,请勿重复添加!"; | |||||
String APP_REPEAT = " 应用已在其他评价计划中,请勿重复添加!"; | |||||
Integer REAPPRAISAL_TYPE = 1; | |||||
Integer VERIFY_TYPE = 2; | |||||
String REPEAT = " 已在其他当前评价计划其他分组中,请勿重复添加!"; | |||||
String NORMAL_TIME_PATTERN = "yyyy-MM-dd"; | |||||
} |
@@ -0,0 +1,34 @@ | |||||
package com.ningdatech.kqapi.common.constant; | |||||
import com.ningdatech.basic.util.StrPool; | |||||
/** | |||||
* 默认值 | |||||
* | |||||
* @author PoffyZhang | |||||
*/ | |||||
public interface DefValConst { | |||||
/** | |||||
* 默认的根节点path | |||||
*/ | |||||
String ROOT_PATH = StrPool.COMMA; | |||||
/** | |||||
* 默认树层级 | |||||
*/ | |||||
Integer TREE_GRADE = 0; | |||||
/** | |||||
* 默认的父id | |||||
*/ | |||||
Long PARENT_ID = 0L; | |||||
/** | |||||
* 默认的排序 | |||||
*/ | |||||
Integer SORT_VALUE = 0; | |||||
/** | |||||
* 字典占位符 | |||||
*/ | |||||
String DICT_PLACEHOLDER = "###"; | |||||
} |
@@ -0,0 +1,14 @@ | |||||
package com.ningdatech.kqapi.common.constant; | |||||
/** | |||||
* 浙政钉常量 | |||||
* | |||||
* @author CMM | |||||
* @since 2023/02/01 14:49 | |||||
*/ | |||||
public interface DingConst { | |||||
/** | |||||
* 工作通知 | |||||
*/ | |||||
String WORKING_NOTICE = "/message/workNotification"; | |||||
} |
@@ -0,0 +1,172 @@ | |||||
package com.ningdatech.kqapi.common.constant; | |||||
import java.math.BigDecimal; | |||||
/** | |||||
* 项目申报表单数据常量key | |||||
* @return | |||||
* @author CMM | |||||
* @since 2023/01/19 10:31 | |||||
*/ | |||||
public interface ProjectDeclareConst { | |||||
/** | |||||
* 基本信息 | |||||
*/ | |||||
class BasicInformation { | |||||
// 项目名称 | |||||
public static final String PROJECT_NAME = "projectName"; | |||||
// 是否一地创新全省共享项目 | |||||
public static final String INNOVATION_SHARING_PROJECT = "innovationSharingProject"; | |||||
// 是否临时增补 | |||||
public static final String TEMPORARY_SUPPLEMENT = "temporarySupplement"; | |||||
// 项目负责人 | |||||
public static final String PROJECT_LEADER = "projectLeader"; | |||||
// 项目负责人手机号 | |||||
public static final String PROJECT_LEADER_PHONE_NUMBER = "projectLeaderPhoneNumber"; | |||||
// 项目联系人 | |||||
public static final String PROJECT_CONTACT = "projectContact"; | |||||
// 项目联系人手机号 | |||||
public static final String PROJECT_CONTACT_PHONE_NUMBER = "projectContactPhoneNumber"; | |||||
// 建设单位 | |||||
public static final String CONSTRUCTION_UNIT = "constructionUnit"; | |||||
// 建设单位统一信用代码 | |||||
public static final String CONSTRUCTION_UNIT_UNIFIED_CREDIT_CODE = "constructionUnitUnifiedCreditCode"; | |||||
// 项目类型 | |||||
public static final String PROJECT_TYPE = "projectType"; | |||||
// 是否首次新建 | |||||
public static final String FIRST_NEW_CONSTRUCTION = "firstNewConstruction"; | |||||
// 预算年度 | |||||
public static final String BUDGET_YEAR = "projectYear"; | |||||
// 建设开始时间 | |||||
public static final String CONSTRUCTION_START_TIME = "constructionStartTime"; | |||||
// 建设结束时间 | |||||
public static final String CONSTRUCTION_END_TIME = "constructionEndTime"; | |||||
// 四大体系 | |||||
public static final String FOUR_SYSTEM = "fourSystem"; | |||||
// 是否数字化改革项目 | |||||
public static final String DIGITAL_REFORM_PROJECT = "digitalReformProject"; | |||||
// 建设层级 | |||||
public static final String CONSTRUCTION_HIERARCHY = "constructionHierarchy"; | |||||
// 立项依据材料 | |||||
public static final String PROJECT_BASIS_MATERIAL = "projectBasisMaterial"; | |||||
// 发改编码 | |||||
public static final String CHANGE_CODE = "changeCode"; | |||||
// 财政编码 | |||||
public static final String FISCAL_CODE = "fiscalCode"; | |||||
// 是否上云 | |||||
public static final String ON_CLOUD = "onCloud"; | |||||
// 项目简介 | |||||
public static final String PROJECT_INTRODUCTION = "projectIntroduction"; | |||||
} | |||||
/** | |||||
* 资金申报情况 | |||||
*/ | |||||
class FundDeclareInfo { | |||||
// 申报金额 | |||||
public static final String DECLARE_AMOUNT = "declareAmount"; | |||||
// 自有资金 | |||||
public static final String OWN_FUND = "ownFund"; | |||||
// 政府投资-本级财政资金 | |||||
public static final String GOVERNMENT_INVESTMENT_SAME_LEVEL_FUND = "governmentInvestmentSameLevelFund"; | |||||
// 政府投资-上级补助资金 | |||||
public static final String GOVERNMENT_INVESTMENT_SUPERIOR_FUND = "governmentInvestmentSuperiorFund"; | |||||
// 银行贷款 | |||||
public static final String BANK_LOAN = "bankLoan"; | |||||
// 其他资金 | |||||
public static final String OTHER_FUND = "otherFund"; | |||||
} | |||||
/** | |||||
* 总投资分配情况 | |||||
*/ | |||||
class TotalInvestmentAllocations { | |||||
// 软件开发 | |||||
public static final String SOFTWARE_DEVELOPMENT = "softwareDevelopment"; | |||||
// 云资源、硬件配置 | |||||
public static final String CLOUD_RESOURCE_HARDWARE_CONFIGURATION = "cloudResourceHardwareConfiguration"; | |||||
// 第三方服务 | |||||
public static final String THIRD_PARTY_SERVICE = "thirdPartyService"; | |||||
} | |||||
/** | |||||
* 年度支付计划 | |||||
*/ | |||||
class AnnualPaymentPlan { | |||||
// 年度支付金额 | |||||
public static final String ANNUAL_PAYMENT_AMOUNT = "annualPaymentAmount"; | |||||
// 自有资金 | |||||
public static final String OWN_FUND = "ownFund"; | |||||
// 政府投资-本级财政资金 | |||||
public static final String GOVERNMENT_INVESTMENT_SAME_LEVEL_FUND = "governmentInvestmentSameLevelFund"; | |||||
// 政府投资-上级补助资金 | |||||
public static final String GOVERNMENT_INVESTMENT_SUPERIOR_FUND = "governmentInvestmentSuperiorFund"; | |||||
// 银行贷款 | |||||
public static final String BANK_LOAN = "bankLoan"; | |||||
// 其他 | |||||
public static final String OTHER = "other"; | |||||
} | |||||
/** | |||||
* 核心业务 | |||||
*/ | |||||
class CoreBusiness { | |||||
} | |||||
/** | |||||
* 安全投入 | |||||
*/ | |||||
class SafetyInput { | |||||
// 投入项 | |||||
public static final String INPUT_ITEM = "inputItem"; | |||||
// 内容描述 | |||||
public static final String CONTENT_DESCRIPTION = "contentDescription"; | |||||
// 金额 | |||||
public static final String AMOUNT = "amount"; | |||||
} | |||||
/** | |||||
* 工程形象进度 | |||||
*/ | |||||
class ProjectImageProgress { | |||||
// 第一季度 | |||||
public static final String FIRST_QUARTER = "firstQuarter"; | |||||
// 第二季度 | |||||
public static final String SECOND_QUARTER = "secondQuarter"; | |||||
// 第三季度 | |||||
public static final String THIRD_QUARTER = "thirdQuarter"; | |||||
// 第四季度 | |||||
public static final String FOURTH_QUARTER = "fourthQuarter"; | |||||
} | |||||
/** | |||||
* 附件 | |||||
*/ | |||||
class Appendix { | |||||
} | |||||
/** | |||||
* 备注 | |||||
*/ | |||||
class Remark { | |||||
} | |||||
/** | |||||
* 应用信息 | |||||
*/ | |||||
class ApplicationInformation { | |||||
} | |||||
class Number { | |||||
public static final BigDecimal DECLARE_AMOUNT_JUDGEMENT = BigDecimal.valueOf(1000); | |||||
//区县是500万 | |||||
public static final BigDecimal DECLARE_COUNTY_AMOUNT_JUDGEMENT = BigDecimal.valueOf(500); | |||||
public static final Integer COUNTRY_BUILD_LEVEL = 1; | |||||
public static final Integer PROVINCE_BUILD_LEVEL = 2; | |||||
public static final Integer PROVINCE_SELF_BUILD_LEVEL = 3; | |||||
public static final Integer CITY_BUILD_LEVEL = 4; | |||||
public static final Integer CITY_SELF_BUILD_LEVEL = 5; | |||||
public static final Integer DISTRICTS_COUNTRIES_BUILD_LEVEL = 6; | |||||
public static final Integer VILLAGES_TOWNS_BUILD_LEVEL = 7; | |||||
} | |||||
} |
@@ -0,0 +1,50 @@ | |||||
package com.ningdatech.kqapi.common.constant; | |||||
/** | |||||
* <p> | |||||
* RegionConst | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 13:57 2023/3/1 | |||||
*/ | |||||
public interface RegionConst { | |||||
//---------------------------------------地区层级(缩写RL)------------------------------------------------------------- | |||||
int RL_PROVINCE = 1; | |||||
int RL_CITY = 2; | |||||
int RL_COUNTY = 3; | |||||
//---------------------------------------地区编码(缩写RC)------------------------------------------------------------- | |||||
/** | |||||
* 丽水行政区划编码 | |||||
*/ | |||||
String RC_LS = "331100"; | |||||
//丽水开发区 | |||||
String LS_KF = "331118"; | |||||
String LS_KF_IRS = "331151"; | |||||
String RC_LS_SBJ_IRS = "331101"; | |||||
//遂昌县 | |||||
String RC_SC = "331123"; | |||||
String LS_KF_NAME = "开发区"; | |||||
/** | |||||
* 中国行政区划编码 | |||||
*/ | |||||
String RC_CHINA = "100000"; | |||||
/** | |||||
* 浙江行政区划编码 | |||||
*/ | |||||
String RC_ZJ = "330000"; | |||||
//----------------------------------------地区父级ID(缩写PID)--------------------------------------------------------- | |||||
long PID_CHINA = 0; | |||||
} |
@@ -0,0 +1,14 @@ | |||||
package com.ningdatech.kqapi.common.constant; | |||||
/** | |||||
* @author CMM | |||||
* @since 2023/02/07 16:24 | |||||
*/ | |||||
public class StateMachineConst { | |||||
public static final String PROJECT_DECLARE = "projectDeclare"; | |||||
public static final String APPLICATION_DECLARE = "applicationDeclare"; | |||||
public static final String LI_SHUI_CITY_AREA_CODE = "331100"; | |||||
} |
@@ -0,0 +1,32 @@ | |||||
package com.ningdatech.kqapi.common.enumeration; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Getter; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/7/26 上午9:21 | |||||
*/ | |||||
@AllArgsConstructor | |||||
@Getter | |||||
public enum BoolDisplayEnum { | |||||
/** | |||||
* true | |||||
*/ | |||||
Y, | |||||
/** | |||||
* false | |||||
*/ | |||||
N; | |||||
public static boolean judgeBoolean(String key) { | |||||
return Y.name().equals(key); | |||||
} | |||||
public static BoolDisplayEnum judgeBoolean(boolean key) { | |||||
return key ? Y : N; | |||||
} | |||||
} |
@@ -0,0 +1,39 @@ | |||||
package com.ningdatech.kqapi.common.enumeration; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Getter; | |||||
/** | |||||
* @author zpf | |||||
* @date 2023/3/12 上午9:21 | |||||
*/ | |||||
@AllArgsConstructor | |||||
@Getter | |||||
public enum CommonEnum { | |||||
/** | |||||
* 公共的一些枚举 | |||||
*/ | |||||
YES(1,"是",1), | |||||
NO(0,"否",1), | |||||
LS_SBJ(331100,"市本级",2), | |||||
LS_LD(331102,"莲都区",2), | |||||
LS_QT(331121,"青田县",2), | |||||
LS_JY(331122,"缙云县",2), | |||||
LS_SC(331123,"遂昌县",2), | |||||
LS_SY(331124,"松阳县",2), | |||||
LS_YH(331125,"云和县",2), | |||||
LS_QY(331126,"庆元县",2), | |||||
LS_JN(331127,"景宁畲族自治县",2), | |||||
LS_LQ(331181,"龙泉市",2), | |||||
LS_KFQ(331199,"开发区",2), | |||||
ZWDD(0,"浙政钉",3), | |||||
MOBILE(1,"短信",3); | |||||
private Integer code; | |||||
private String desc; | |||||
private Integer groupId; | |||||
} |
@@ -0,0 +1,157 @@ | |||||
package com.ningdatech.kqapi.common.enumeration; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Getter; | |||||
import lombok.NoArgsConstructor; | |||||
/** | |||||
* 导出选项枚举 | |||||
* | |||||
* @author CMM | |||||
* @since 2023/02/10 16:38 | |||||
*/ | |||||
@Getter | |||||
@AllArgsConstructor | |||||
@NoArgsConstructor | |||||
public enum ExportOptionEnum { | |||||
/** | |||||
* 导出选项 | |||||
*/ | |||||
id(1, "项目ID"), | |||||
projectName(2, "项目名称"), | |||||
areaCode(3, "行政区划编码"), | |||||
area(4, "行政区划名称"), | |||||
responsibleMan(5, "项目负责人"), | |||||
responsibleManMobile(6, "项目负责人手机号"), | |||||
contactName(7, "项目联系人"), | |||||
contactPhone(8, "项目联系人手机号"), | |||||
higherSuperOrg(9, "上级业务主管单位"), | |||||
higherSuperOrgCode(10, "上级主管单位浙政钉ID"), | |||||
superOrg(11, "本级主管部门"), | |||||
superOrgCode(12, "本级主管部门浙政钉ID"), | |||||
buildOrgName(13, "建设单位名称"), | |||||
buildOrgZheJiangGovDingId(14, "建设单位浙政钉ID"), | |||||
orgCreditCode(15, "建设单位统一信用代码"), | |||||
projectType(16, "项目类型"), | |||||
isFirst(17, "是否首次新建"), | |||||
relatedExistsApplication(18, "关联应用"), | |||||
relatedExistsApplicationCode(19, "关联应用IRS编码"), | |||||
declareAmount(20, "申报金额"), | |||||
approvedTotalInvestmentIncrease(21, "批复金额"), | |||||
/** | |||||
* 表里没有 | |||||
*/ | |||||
budgetSource(22, "预算来源"), | |||||
projectYear(23, "预算年度"), | |||||
projectIntroduction(24, "项目简介"), | |||||
buildBasis(25, "立项依据"), | |||||
buildLevel(26, "建设层级"), | |||||
developCode(27, "发改编码"), | |||||
financialCode(28, "财政编码"), | |||||
/** | |||||
* 表里没有 | |||||
*/ | |||||
informationValidity(29, "信息是否有效"), | |||||
isDigitalReform(30, "是否数字化改革项目"), | |||||
bizDomain(31, "综合应用领域"), | |||||
isCloud(32, "是否上云"), | |||||
cloudType(33, "云类型"), | |||||
fourSystems(34, "四大体系"), | |||||
isTemporaryAugment(35, "是否临时增补"), | |||||
protectionLevel(36, "等保级别"), | |||||
isSecretComments(37, "是否密评"), | |||||
businessNumber(38, "业务编号"), | |||||
businessName(39, "业务名称"), | |||||
orgName(40, "单位名称"), | |||||
softwareDevelopmentAmount(41, "软件开发"), | |||||
cloudHardwarePurchaseAmount(42, "云资源、硬件购置"), | |||||
thirdPartyAmount(43, "第三方服务"), | |||||
safetyInputTitle(44, "投入项"), | |||||
safetyInputDescribe(45, "内容描述"), | |||||
safetyInputAmount(46, "金额"), | |||||
annualPlanAmount(47, "年度支付金额"), | |||||
annualPlanHaveAmount(48, "自有资金"), | |||||
declareGovOwnFinanceAmount(49, "政府投资-本级财政资金"), | |||||
declareGovSuperiorFinanceAmount(50, "政府投资-上级补助资金"), | |||||
declareBankLendingAmount(51, "银行贷款"), | |||||
declareOtherAmount(52, "其它资金"), | |||||
engineeringSpeedOne(53, "第一季度"), | |||||
engineeringSpeedTwo(54, "第二季度"), | |||||
engineeringSpeedThree(55, "第三季度"), | |||||
engineeringSpeedFour(56, "第四季度"), | |||||
preliminaryPlanFile(57, "初步方案"), | |||||
supportingMaterialsFile(58, "附件-佐证材料"), | |||||
projectRemarks(59, "备注"), | |||||
processStatusName(60, "流程状态名称"), | |||||
processLaunchTime(61,"流程发起时间"), | |||||
processHandleTime(62,"流程处理时间"), | |||||
projectStatusName(63,"项目状态名称"), | |||||
createOn(64,"创建时间"), | |||||
updateOn(65,"更新时间"); | |||||
private Integer code; | |||||
private String desc; | |||||
} |
@@ -0,0 +1,39 @@ | |||||
package com.ningdatech.kqapi.common.enumeration; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Getter; | |||||
import lombok.NoArgsConstructor; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
import java.util.Objects; | |||||
@Getter | |||||
@AllArgsConstructor | |||||
@NoArgsConstructor | |||||
public enum ProjectProcessStageEnum { | |||||
/** | |||||
* 项目流程配置 阶段枚举 | |||||
*/ | |||||
ORG_INTERNAL_APPROVAL_PROCESS(1,"单位内部审批流程"), | |||||
PROJECT_PREQUALIFICATION_APPROVAL_PROCESS(2,"项目预审审批流程"), | |||||
DEPARTMENT_JOINT_APPROVAL_PROCESS(3,"部门联合审批流程"), | |||||
CONSTRUCTION_PROJECT_APPROVAL_PROCESS(4,"建设方案审批流程"), | |||||
ACCEPTANCE_DECLARATION_APPROVAL_PROCESS(5,"验收申报审批流程"), | |||||
APPLY_DELAY(6,"申请延期审批流程"), | |||||
APPLY_BORROW(7,"申请借阅审批流程"); | |||||
private Integer code; | |||||
private String desc; | |||||
public static String getDesc(Integer code) { | |||||
if (Objects.isNull(code)) { | |||||
return StringUtils.EMPTY; | |||||
} | |||||
for (ProjectProcessStageEnum t : ProjectProcessStageEnum.values()) { | |||||
if (code.equals(t.getCode())) { | |||||
return t.desc; | |||||
} | |||||
} | |||||
return StringUtils.EMPTY; | |||||
} | |||||
} |
@@ -0,0 +1,24 @@ | |||||
package com.ningdatech.kqapi.common.errorcode; | |||||
import lombok.Getter; | |||||
/** | |||||
* @author LiuXinXin | |||||
*/ | |||||
@Getter | |||||
public enum AppErrorCode { | |||||
USER(100), | |||||
AUTH(101); | |||||
private final Integer code; | |||||
AppErrorCode(Integer code) { | |||||
this.code = code; | |||||
} | |||||
public Integer getCode() { | |||||
return code; | |||||
} | |||||
} |
@@ -0,0 +1,62 @@ | |||||
package com.ningdatech.kqapi.common.handler; | |||||
import com.ningdatech.basic.enumeration.Status; | |||||
import com.ningdatech.basic.model.ApiResponse; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.context.support.DefaultMessageSourceResolvable; | |||||
import org.springframework.http.HttpStatus; | |||||
import org.springframework.validation.BindException; | |||||
import org.springframework.web.bind.MethodArgumentNotValidException; | |||||
import org.springframework.web.bind.annotation.ControllerAdvice; | |||||
import org.springframework.web.bind.annotation.ExceptionHandler; | |||||
import org.springframework.web.bind.annotation.ResponseBody; | |||||
import org.springframework.web.bind.annotation.ResponseStatus; | |||||
import org.springframework.web.servlet.NoHandlerFoundException; | |||||
import javax.validation.ConstraintViolation; | |||||
import javax.validation.ConstraintViolationException; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* @description: 统一错误处理 | |||||
* @author: liuxinxin | |||||
* @date: 2023/01/03 11:39 | |||||
*/ | |||||
@Slf4j | |||||
@ControllerAdvice | |||||
@ResponseStatus(HttpStatus.BAD_REQUEST) | |||||
public class GlobalExceptionHandler { | |||||
@ResponseBody | |||||
@ExceptionHandler(value = NoHandlerFoundException.class) | |||||
public ApiResponse<Void> noHandlerFoundException(NoHandlerFoundException e) { | |||||
log.error("【全局异常拦截】NoHandlerFoundException: 请求方法 {}, 请求路径 {}", e.getRequestURL(), e.getHttpMethod()); | |||||
return ApiResponse.ofStatus(Status.REQUEST_NOT_FOUND); | |||||
} | |||||
@ResponseBody | |||||
@ExceptionHandler(value = {MethodArgumentNotValidException.class, BindException.class}) | |||||
public ApiResponse<Void> bindException(BindException e) { | |||||
String msg = e.getAllErrors().stream() | |||||
.map(DefaultMessageSourceResolvable::getDefaultMessage) | |||||
.collect(Collectors.joining(",")); | |||||
return ApiResponse.of(Status.BAD_REQUEST.getCode(), msg, null); | |||||
} | |||||
@ResponseBody | |||||
@ExceptionHandler(value = ConstraintViolationException.class) | |||||
public ApiResponse<Void> constraintViolationException(ConstraintViolationException e) { | |||||
String msg = e.getConstraintViolations().stream() | |||||
.map(ConstraintViolation::getMessage) | |||||
.collect(Collectors.joining(",")); | |||||
return ApiResponse.of(Status.BAD_REQUEST.getCode(), msg, null); | |||||
} | |||||
@ResponseBody | |||||
@ExceptionHandler(value = Exception.class) | |||||
public ApiResponse<Void> handlerException(Exception e) { | |||||
log.error("【全局异常拦截】: 异常信息 {}: {} ", e.getClass().getSimpleName(), e); | |||||
return ApiResponse.of(Status.BAD_REQUEST.getCode(), e.getMessage(), null); | |||||
} | |||||
} |
@@ -0,0 +1,58 @@ | |||||
package com.ningdatech.kqapi.common.handler; | |||||
import com.ningdatech.basic.model.ApiResponse; | |||||
import org.springframework.core.MethodParameter; | |||||
import org.springframework.http.MediaType; | |||||
import org.springframework.http.converter.HttpMessageConverter; | |||||
import org.springframework.http.server.ServerHttpRequest; | |||||
import org.springframework.http.server.ServerHttpResponse; | |||||
import org.springframework.web.bind.annotation.ExceptionHandler; | |||||
import org.springframework.web.bind.annotation.RestControllerAdvice; | |||||
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; | |||||
/** | |||||
* @Author liuxinxin | |||||
* @Date 2021/7/21 11:26 | |||||
* @Version 1.0 | |||||
**/ | |||||
@RestControllerAdvice(basePackages = { | |||||
"com.ningdatech.kqapi.zzsfw.controller" | |||||
}) | |||||
public class GlobalResponseHandler implements ResponseBodyAdvice<Object> { | |||||
private static final String SWAGGER_CLASS_PREFIX = "springfox.documentation"; | |||||
@Override | |||||
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) { | |||||
return filter(methodParameter); | |||||
} | |||||
@Override | |||||
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, | |||||
Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, | |||||
ServerHttpResponse serverHttpResponse) { | |||||
ApiResponse<Object> apiResponse = ApiResponse.ofSuccess(o); | |||||
// 处理字符串时,遇到了类型转换的问题,debug一步一步跟踪,原来是对于字符串的ContentType是“text-plain”, | |||||
// ConverterType是StringHttpMessageConverter这个类型转换, | |||||
// 由于将结果封装成了自定义的ApiResponse类型,所以有ApiResponse转换成String报错 | |||||
// 所以需要对String类型的返回值单独进行处理 | |||||
// if (o instanceof String) { | |||||
// return JSONUtil.toJsonStr(apiResponse); | |||||
// } | |||||
return ApiResponse.ofSuccess(o); | |||||
// return o; | |||||
} | |||||
private Boolean filter(MethodParameter methodParameter) { | |||||
Class<?> declaringClass = methodParameter.getDeclaringClass(); | |||||
// swagger中的所有返回不进行统一封装 | |||||
if (declaringClass.getName().contains(SWAGGER_CLASS_PREFIX)) { | |||||
return false; | |||||
} | |||||
if (methodParameter.hasMethodAnnotation(ExceptionHandler.class)) { | |||||
return false; | |||||
} | |||||
// 如果本身就是使用ApiResponse返回,则不需要进行格式化 | |||||
return !methodParameter.getParameterType().equals(ApiResponse.class); | |||||
} | |||||
} |
@@ -0,0 +1,137 @@ | |||||
package com.ningdatech.kqapi.common.util; | |||||
import cn.hutool.core.util.StrUtil; | |||||
import com.ningdatech.basic.util.StrPool; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
import org.springframework.util.NumberUtils; | |||||
import java.math.BigDecimal; | |||||
import java.math.RoundingMode; | |||||
import java.time.LocalDateTime; | |||||
import java.time.ZoneId; | |||||
import java.util.*; | |||||
import java.util.function.Consumer; | |||||
import java.util.function.Function; | |||||
import java.util.stream.Collectors; | |||||
import static java.util.stream.Collectors.toList; | |||||
/** | |||||
* <p> | |||||
* BizUtils | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 17:32 2023/1/29 | |||||
*/ | |||||
public class BizUtils { | |||||
private BizUtils() { | |||||
} | |||||
public static <T extends Collection<?>> void notEmpty(T objs, Consumer<T> consumer) { | |||||
if (objs != null && !objs.isEmpty()) { | |||||
consumer.accept(objs); | |||||
} | |||||
} | |||||
public static <T extends Number> List<T> splitToNum(String str, Class<T> aClass) { | |||||
if (StrUtil.isEmpty(str)) { | |||||
return Collections.emptyList(); | |||||
} | |||||
return Arrays.stream(str.split(StrPool.COMMA)) | |||||
.map(w -> NumberUtils.parseNumber(w, aClass)) | |||||
.collect(Collectors.toList()); | |||||
} | |||||
public static List<Long> splitToLong(String str) { | |||||
return splitToNum(str, Long.class); | |||||
} | |||||
public static <T> void notNull(T obj, Consumer<T> consumer) { | |||||
if (obj != null) { | |||||
consumer.accept(obj); | |||||
} | |||||
} | |||||
public static void notBlank(String str, Consumer<String> consumer) { | |||||
if (StrUtil.isNotBlank(str)) { | |||||
consumer.accept(str); | |||||
} | |||||
} | |||||
public static boolean getJSONType(String str) { | |||||
boolean result = false; | |||||
if (StringUtils.isNotBlank(str)) { | |||||
str = str.trim(); | |||||
if (str.startsWith("{") && str.endsWith("}")) { | |||||
result = true; | |||||
} else if (str.startsWith("[") && str.endsWith("]")) { | |||||
result = true; | |||||
} | |||||
} | |||||
return result; | |||||
} | |||||
public static String uuid32() { | |||||
return UUID.randomUUID().toString().replace("-", ""); | |||||
} | |||||
/** | |||||
* 对象分组取第一条 | |||||
* | |||||
* @param objs 对象集合 | |||||
* @param group 分组函数 | |||||
* @param comparator 比较器 | |||||
* @return java.util.Collection<T> | |||||
* @author WendyYang | |||||
**/ | |||||
public static <T> Collection<T> groupFirst(Collection<T> objs, Function<T, Object> group, Comparator<T> comparator) { | |||||
return groupFirstMap(objs, group, comparator).values(); | |||||
} | |||||
/** | |||||
* 对象分组取第一条 | |||||
* | |||||
* @param objs 对象集合 | |||||
* @param group 分组函数 | |||||
* @param comparator 比较器 | |||||
* @return java.util.Collection<T> | |||||
* @author WendyYang | |||||
**/ | |||||
public static <V, K> Map<K, V> groupFirstMap(Collection<V> objs, Function<V, K> group, Comparator<V> comparator) { | |||||
return objs.stream().collect(Collectors.groupingBy(group, | |||||
Collectors.collectingAndThen(toList(), w -> { | |||||
w.sort(comparator); | |||||
return w.get(0); | |||||
}))); | |||||
} | |||||
public static String inSqlJoin(List<String> strings) { | |||||
return strings.stream().map(w -> "'" + w + "'").collect(Collectors.joining(StrPool.COMMA, StrPool.LEFT_BRACKET, StrPool.RIGHT_BRACKET)); | |||||
} | |||||
public static LocalDateTime convertDate(Date date) { | |||||
if (Objects.nonNull(date)) { | |||||
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); | |||||
} | |||||
return null; | |||||
} | |||||
public static String computeRise(Integer numa, Integer numb) { | |||||
if((Objects.isNull(numb)|| numb.equals(0)) && | |||||
(Objects.isNull(numa)|| numa.equals(0))){ | |||||
return "0"; | |||||
} | |||||
if(Objects.isNull(numa) || numa.equals(0)){ | |||||
return "-100"; | |||||
} | |||||
if(Objects.isNull(numb)|| numb.equals(0)){ | |||||
return "100"; | |||||
} | |||||
return BigDecimal.valueOf((numa - numb) * 100.0).divide(BigDecimal.valueOf(numb),2, RoundingMode.CEILING) | |||||
.stripTrailingZeros().toPlainString(); | |||||
} | |||||
} |
@@ -0,0 +1,25 @@ | |||||
package com.ningdatech.kqapi.common.util; | |||||
/** | |||||
* @author qinxianyun | |||||
* @see {@link SpringContextHolder} | |||||
* 针对某些初始化方法,在SpringContextHolder 初始化前时,<br> | |||||
* 可提交一个 提交回调任务。<br> | |||||
* 在SpringContextHolder 初始化后,进行回调使用 | |||||
*/ | |||||
public interface CallBack { | |||||
/** | |||||
* 回调执行方法 | |||||
*/ | |||||
void executor(); | |||||
/** | |||||
* 本回调任务名称 | |||||
* @return / | |||||
*/ | |||||
default String getCallBackName() { | |||||
return Thread.currentThread().getId() + ":" + this.getClass().getName(); | |||||
} | |||||
} | |||||
@@ -0,0 +1,27 @@ | |||||
package com.ningdatech.kqapi.common.util; | |||||
import com.ningdatech.basic.util.StrPool; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
import java.util.Arrays; | |||||
import java.util.Collection; | |||||
import java.util.Collections; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* @Classname CodeUtil | |||||
* @Description | |||||
* @Date 2023/6/20 16:06 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Slf4j | |||||
public class CodeUtil { | |||||
public static Collection<String> convertStrToList(String str) { | |||||
if(StringUtils.isBlank(str)){ | |||||
return Collections.emptyList(); | |||||
} | |||||
return Arrays.stream(str.split(StrPool.COMMA)).collect(Collectors.toList()); | |||||
} | |||||
} |
@@ -0,0 +1,53 @@ | |||||
package com.ningdatech.kqapi.common.util; | |||||
import org.springframework.core.io.InputStreamResource; | |||||
import java.io.InputStream; | |||||
public class CommonInputStreamResource extends InputStreamResource { | |||||
/*** | |||||
* 文件長度 | |||||
*/ | |||||
private int length; | |||||
/*** | |||||
* 文件名稱 | |||||
*/ | |||||
private String fileName; | |||||
public CommonInputStreamResource(InputStream inputStream) { | |||||
super(inputStream); | |||||
} | |||||
public CommonInputStreamResource(InputStream inputStream, int length,String fileName) { | |||||
super(inputStream); | |||||
this.length = length; | |||||
this.fileName = fileName; | |||||
} | |||||
/** | |||||
* 覆写父类方法 | |||||
* 如果不重写这个方法,并且文件有一定大小,那么服务端会出现异常 | |||||
* {@code The multi-part request contained parameter data (excluding uploaded files) that exceeded} | |||||
* | |||||
* @return | |||||
*/ | |||||
@Override | |||||
public String getFilename() { | |||||
return this.fileName; | |||||
} | |||||
/** | |||||
* 覆写父类 contentLength 方法 | |||||
* 因为 {@link org.springframework.core.io.AbstractResource#contentLength()}方法会重新读取一遍文件, | |||||
* 而上传文件时,restTemplate 会通过这个方法获取大小。然后当真正需要读取内容的时候,发现已经读完,会报如下错误。 | |||||
* <code> | |||||
* java.lang.IllegalStateException: InputStream has already been read - do not use InputStreamResource if a stream needs to be read multiple times | |||||
* at org.springframework.core.io.InputStreamResource.getInputStream(InputStreamResource.java:96) | |||||
* </code> | |||||
* <p> | |||||
* ref:com.amazonaws.services.s3.model.S3ObjectInputStream#available() | |||||
* | |||||
* @return | |||||
*/ | |||||
@Override | |||||
public long contentLength() { | |||||
int estimate = length; | |||||
return estimate == 0 ? 1 : estimate; | |||||
} | |||||
} |
@@ -0,0 +1,85 @@ | |||||
package com.ningdatech.kqapi.common.util; | |||||
import org.apache.commons.codec.binary.Hex; | |||||
import javax.crypto.Mac; | |||||
import javax.crypto.SecretKey; | |||||
import javax.crypto.spec.SecretKeySpec; | |||||
import java.nio.charset.Charset; | |||||
import java.nio.charset.StandardCharsets; | |||||
import java.security.InvalidKeyException; | |||||
import java.security.MessageDigest; | |||||
import java.security.NoSuchAlgorithmException; | |||||
/** | |||||
* 加密工具 | |||||
* @author hank | |||||
*/ | |||||
public class CryptUtils { | |||||
/** | |||||
* 默认的算法 | |||||
*/ | |||||
private static final String DE_KEY_MAC = "HmacMD5"; | |||||
/** | |||||
* 默认的字符集 | |||||
*/ | |||||
private static final Charset DE_CHARSET = StandardCharsets.UTF_8; | |||||
/** | |||||
* 使用默认的算法(HmacMD5) 得到hmac 16进制字符串 | |||||
* @param inputStr 需要加密的串 | |||||
* @param key key | |||||
* @return 16进制字符串 | |||||
* @throws Exception | |||||
*/ | |||||
public static String encryptHMAC(String inputStr, String key) throws Exception { | |||||
return encryptHMAC(inputStr, key, DE_KEY_MAC); | |||||
} | |||||
/** | |||||
* 使用指定的算法得到hmac 16进制字符串 | |||||
* @param inputStr 需要加密的串 | |||||
* @param key key | |||||
* @param keyMac hmac算法 | |||||
* @return 16进制字符串 | |||||
* @throws Exception | |||||
*/ | |||||
public static String encryptHMAC(String inputStr, String key, String keyMac) throws Exception { | |||||
return Hex.encodeHexString(encryptHMAC(inputStr.getBytes(DE_CHARSET), key, keyMac)); | |||||
} | |||||
public static String MD5Encode(String origin) throws NoSuchAlgorithmException { | |||||
MessageDigest md = MessageDigest.getInstance("MD5"); | |||||
return Hex.encodeHexString(md.digest(origin.getBytes(DE_CHARSET))); | |||||
} | |||||
private static byte[] encryptHMAC(byte[] data, String key, String keyMac) throws Exception { | |||||
SecretKey secretKey = new SecretKeySpec(key.getBytes(DE_CHARSET), keyMac); | |||||
Mac mac = Mac.getInstance(secretKey.getAlgorithm()); | |||||
mac.init(secretKey); | |||||
return mac.doFinal(data); | |||||
} | |||||
/** | |||||
* 生成HMAC-MD5值 | |||||
* @param data 消息数据 | |||||
* @param key 密钥 | |||||
* @return HMAC-MD5值 | |||||
* @throws NoSuchAlgorithmException | |||||
* @throws InvalidKeyException | |||||
*/ | |||||
public static byte[] hmacMd5(byte[] data, byte[] key) | |||||
throws NoSuchAlgorithmException, InvalidKeyException { | |||||
SecretKeySpec signingKey = new SecretKeySpec(key, "HmacMD5"); | |||||
Mac mac = Mac.getInstance("HmacMD5"); | |||||
mac.init(signingKey); | |||||
return mac.doFinal(data); | |||||
} | |||||
public static void main(String[] args) throws Exception{ | |||||
System.out.println("HMACStr:\n" + encryptHMAC("a", "hank")); | |||||
} | |||||
} |
@@ -0,0 +1,104 @@ | |||||
package com.ningdatech.kqapi.common.util; | |||||
import cn.hutool.core.io.IoUtil; | |||||
import com.ningdatech.basic.exception.BizException; | |||||
import freemarker.template.Configuration; | |||||
import freemarker.template.Template; | |||||
import freemarker.template.TemplateException; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.apache.http.entity.ContentType; | |||||
import org.springframework.core.io.ByteArrayResource; | |||||
import javax.servlet.ServletOutputStream; | |||||
import javax.servlet.http.HttpServletResponse; | |||||
import java.io.*; | |||||
import java.math.BigDecimal; | |||||
import java.net.URLEncoder; | |||||
import java.nio.charset.StandardCharsets; | |||||
import java.nio.file.Files; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import java.util.zip.ZipEntry; | |||||
import java.util.zip.ZipOutputStream; | |||||
/** | |||||
* <p> | |||||
* FreemarkerWordUtil | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023/7/24 | |||||
**/ | |||||
@Slf4j | |||||
public class FreemarkerWordUtil { | |||||
private static void setDownFileName(HttpServletResponse response, String fileName) { | |||||
String fileNameEncoded; | |||||
try { | |||||
fileNameEncoded = URLEncoder.encode(fileName, "UTF-8"); | |||||
} catch (UnsupportedEncodingException e) { | |||||
throw new RuntimeException("文件名编码异常"); | |||||
} | |||||
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileNameEncoded); | |||||
} | |||||
private static final Configuration CONFIGURATION = new Configuration(Configuration.VERSION_2_3_31); | |||||
static { | |||||
CONFIGURATION.setDefaultEncoding("UTF-8"); | |||||
CONFIGURATION.setClassForTemplateLoading(FreemarkerWordUtil.class, "/template"); | |||||
} | |||||
/** | |||||
* 生成word文件 | |||||
* | |||||
* @param dataMap word中需要展示的动态数据,用map集合来保存 | |||||
* @param templateName word模板名称,例如:test.ftl | |||||
* @param filePath 文件生成的目标路径,例如:D:/wordFile/ | |||||
* @param fileName 生成的文件名称,例如:test.doc | |||||
*/ | |||||
public static void create(Object dataMap, String templateName, String filePath, String fileName) { | |||||
try { | |||||
Template template = CONFIGURATION.getTemplate(templateName); | |||||
//输出文件 | |||||
File outFile = new File(filePath + File.separator + fileName); | |||||
//如果输出目标文件夹不存在,则创建 | |||||
if (!outFile.getParentFile().exists()) { | |||||
boolean ignore = outFile.getParentFile().mkdirs(); | |||||
} | |||||
//将模板和数据模型合并生成文件 | |||||
Writer out = new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(outFile.toPath()), StandardCharsets.UTF_8)); | |||||
//生成文件 | |||||
template.process(dataMap, out); | |||||
IoUtil.flush(out); | |||||
IoUtil.close(out); | |||||
} catch (Exception e) { | |||||
log.error("根据模版生成Word文件失败:", e); | |||||
throw BizException.wrap("根据模版生成Word文件失败"); | |||||
} | |||||
} | |||||
public static void export(String fileName, Object data, HttpServletResponse response, String templateName) throws TemplateException, IOException { | |||||
Template template = CONFIGURATION.getTemplate(templateName); | |||||
response.setCharacterEncoding(StandardCharsets.UTF_8.displayName()); | |||||
response.setContentType(ContentType.APPLICATION_JSON.getMimeType()); | |||||
setDownFileName(response, fileName); | |||||
try (StringWriter out = new StringWriter(); | |||||
Writer writer = new BufferedWriter(out, 4096)) { | |||||
template.process(data, writer); | |||||
try (InputStream is = new ByteArrayResource(out.toString().getBytes(StandardCharsets.UTF_8)).getInputStream(); | |||||
ServletOutputStream outputStream = response.getOutputStream()) { | |||||
// 缓冲区 | |||||
byte[] buffer = new byte[1024]; | |||||
int bytesToRead; | |||||
// 通过循环将读入的Word文件的内容输出到浏览器中 | |||||
while ((bytesToRead = is.read(buffer)) != -1) { | |||||
outputStream.write(buffer, 0, bytesToRead); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,89 @@ | |||||
package com.ningdatech.kqapi.common.util; | |||||
import java.io.ByteArrayInputStream; | |||||
import java.io.ByteArrayOutputStream; | |||||
import java.io.IOException; | |||||
import java.util.zip.GZIPInputStream; | |||||
import java.util.zip.GZIPOutputStream; | |||||
/** | |||||
* <p> | |||||
* 压缩为Gzip | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
*/ | |||||
public class GzipUtils { | |||||
/** | |||||
* 使用gzip进行压缩 | |||||
*/ | |||||
public static String compress(String primStr) { | |||||
if (primStr == null || primStr.length() == 0) { | |||||
return primStr; | |||||
} | |||||
ByteArrayOutputStream out = new ByteArrayOutputStream(); | |||||
GZIPOutputStream gzip = null; | |||||
try { | |||||
gzip = new GZIPOutputStream(out); | |||||
gzip.write(primStr.getBytes()); | |||||
} catch (IOException e) { | |||||
throw new RuntimeException(e); | |||||
} finally { | |||||
if (gzip != null) { | |||||
try { | |||||
gzip.close(); | |||||
} catch (IOException e) { | |||||
throw new RuntimeException(e); | |||||
} | |||||
} | |||||
} | |||||
return new sun.misc.BASE64Encoder().encode(out.toByteArray()); | |||||
} | |||||
/** | |||||
* 使用gzip进行解压缩 | |||||
*/ | |||||
public static String uncompress(String compressedStr) { | |||||
if (compressedStr == null) { | |||||
return null; | |||||
} | |||||
ByteArrayOutputStream out = new ByteArrayOutputStream(); | |||||
ByteArrayInputStream in = null; | |||||
GZIPInputStream ginzip = null; | |||||
byte[] compressed = null; | |||||
String decompressed = null; | |||||
try { | |||||
compressed = new sun.misc.BASE64Decoder().decodeBuffer(compressedStr); | |||||
in = new ByteArrayInputStream(compressed); | |||||
ginzip = new GZIPInputStream(in); | |||||
byte[] buffer = new byte[1024]; | |||||
int offset = -1; | |||||
while ((offset = ginzip.read(buffer)) != -1) { | |||||
out.write(buffer, 0, offset); | |||||
} | |||||
decompressed = out.toString(); | |||||
} catch (IOException e) { | |||||
e.printStackTrace(); | |||||
} finally { | |||||
if (ginzip != null) { | |||||
try { | |||||
ginzip.close(); | |||||
} catch (IOException e) { | |||||
} | |||||
} | |||||
if (in != null) { | |||||
try { | |||||
in.close(); | |||||
} catch (IOException e) { | |||||
} | |||||
} | |||||
try { | |||||
out.close(); | |||||
} catch (IOException e) { | |||||
} | |||||
} | |||||
return decompressed; | |||||
} | |||||
} |
@@ -0,0 +1,82 @@ | |||||
package com.ningdatech.kqapi.common.util; | |||||
import org.apache.commons.math3.util.Pair; | |||||
import javax.crypto.Mac; | |||||
import javax.crypto.spec.SecretKeySpec; | |||||
import javax.xml.bind.DatatypeConverter; | |||||
import java.io.UnsupportedEncodingException; | |||||
import java.net.URI; | |||||
import java.net.URLEncoder; | |||||
import java.text.DateFormat; | |||||
import java.text.SimpleDateFormat; | |||||
import java.util.*; | |||||
import java.util.stream.Collectors; | |||||
public class HmacAuthUtil { | |||||
/** | |||||
* 构造http请求 header | |||||
* | |||||
* @param url 请求url,全路径格式,比如:https://bcdsg.zj.gov.cn/api/p/v1/user.get | |||||
* @param requestMethod 请求方法,大写格式,如:GET, POST | |||||
* @param accessKey 应用的 AK | |||||
* @param secretKey 应用的 SK | |||||
* @return | |||||
*/ | |||||
public static Map<String, String> generateHeader(String url, String requestMethod, String accessKey, String secretKey) { | |||||
Map<String, String> header = new HashMap<>(); | |||||
try { | |||||
DateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US); | |||||
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); | |||||
String date = dateFormat.format(new Date()); | |||||
URI uri = URI.create(url); | |||||
String canonicalQueryString = getCanonicalQueryString(uri.getQuery()); | |||||
String message = requestMethod.toUpperCase() + "\n" + uri.getPath() + "\n" + canonicalQueryString + "\n" + accessKey + "\n" + date + "\n"; | |||||
Mac mac = Mac.getInstance("HmacSHA256"); | |||||
mac.init(new SecretKeySpec(secretKey.getBytes(), "HmacSHA256")); | |||||
byte[] hash = mac.doFinal(message.getBytes()); | |||||
// to lowercase hexits | |||||
DatatypeConverter.printHexBinary(hash); | |||||
// to base64 | |||||
String sign = DatatypeConverter.printBase64Binary(hash); | |||||
header.put("X-BG-HMAC-SIGNATURE", sign); | |||||
header.put("X-BG-HMAC-ALGORITHM", "hmac-sha256"); | |||||
header.put("X-BG-HMAC-ACCESS-KEY", accessKey); | |||||
header.put("X-BG-DATE-TIME", date); | |||||
System.out.println(date); | |||||
} catch (Exception e) { | |||||
throw new RuntimeException("generate jc brain header error", e); | |||||
} | |||||
return header; | |||||
} | |||||
private static String getCanonicalQueryString(String query) { | |||||
if (query == null || query.trim().length() == 0) { | |||||
return ""; | |||||
} | |||||
List<Pair<String, String>> queryParamList = new ArrayList<>(); | |||||
String[] params = query.split("&"); | |||||
for (String param : params) { | |||||
String[] keyValue = param.split("="); | |||||
Pair<String, String> pair = new Pair<String, String>(keyValue[0], keyValue.length > 1 ? keyValue[1] : ""); | |||||
queryParamList.add(pair); | |||||
} | |||||
List<Pair<String, String>> sortedParamList = queryParamList.stream().sorted(Comparator.comparing(param -> param.getKey() + "=" + Optional.ofNullable(param.getValue()).orElse(""))).collect(Collectors.toList()); | |||||
List<Pair<String, String>> encodeParamList = new ArrayList<>(); | |||||
sortedParamList.stream().forEach(param -> { | |||||
try { | |||||
String key = URLEncoder.encode(param.getKey(), "utf-8"); | |||||
String value = URLEncoder.encode(Optional.ofNullable(param.getValue()).orElse(""), "utf-8"); | |||||
encodeParamList.add(new Pair<>(key, value)); | |||||
} catch (UnsupportedEncodingException e) { | |||||
throw new RuntimeException("encoding error"); | |||||
} | |||||
}); | |||||
StringBuilder queryParamString = new StringBuilder(64); | |||||
for (Pair<String, String> encodeParam : encodeParamList) { | |||||
queryParamString.append(encodeParam.getKey()).append("=").append(Optional.ofNullable(encodeParam.getValue()).orElse("")); | |||||
queryParamString.append("&"); | |||||
} | |||||
return queryParamString.substring(0, queryParamString.length() - 1); | |||||
} | |||||
} |
@@ -0,0 +1,246 @@ | |||||
package com.ningdatech.kqapi.common.util; | |||||
import org.apache.http.HttpEntity; | |||||
import org.apache.http.NameValuePair; | |||||
import org.apache.http.client.config.RequestConfig; | |||||
import org.apache.http.client.entity.UrlEncodedFormEntity; | |||||
import org.apache.http.client.methods.CloseableHttpResponse; | |||||
import org.apache.http.client.methods.HttpGet; | |||||
import org.apache.http.client.methods.HttpPost; | |||||
import org.apache.http.conn.ssl.DefaultHostnameVerifier; | |||||
import org.apache.http.conn.ssl.NoopHostnameVerifier; | |||||
import org.apache.http.conn.ssl.SSLConnectionSocketFactory; | |||||
import org.apache.http.conn.ssl.TrustStrategy; | |||||
import org.apache.http.conn.util.PublicSuffixMatcher; | |||||
import org.apache.http.conn.util.PublicSuffixMatcherLoader; | |||||
import org.apache.http.entity.StringEntity; | |||||
import org.apache.http.impl.client.CloseableHttpClient; | |||||
import org.apache.http.impl.client.HttpClientBuilder; | |||||
import org.apache.http.impl.client.HttpClients; | |||||
import org.apache.http.message.BasicNameValuePair; | |||||
import org.apache.http.ssl.SSLContexts; | |||||
import org.apache.http.util.EntityUtils; | |||||
import org.slf4j.Logger; | |||||
import org.slf4j.LoggerFactory; | |||||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; | |||||
import javax.net.ssl.SSLContext; | |||||
import java.io.IOException; | |||||
import java.net.URL; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
public class HttpUtil { | |||||
private Logger logger = LoggerFactory.getLogger(getClass()); | |||||
private RequestConfig requestConfig = RequestConfig.custom() | |||||
.setSocketTimeout(15000) | |||||
.setConnectTimeout(15000) | |||||
.setConnectionRequestTimeout(15000) | |||||
.build(); | |||||
private static HttpUtil instance = null; | |||||
private HttpUtil(){} | |||||
public static HttpUtil getInstance(){ | |||||
if (instance == null) { | |||||
instance = new HttpUtil(); | |||||
} | |||||
return instance; | |||||
} | |||||
/** | |||||
* 发送 post 请求 | |||||
* @param httpUrl 地址 | |||||
*/ | |||||
public String sendHttpPost(String httpUrl) { | |||||
HttpPost httpPost= new HttpPost(httpUrl);// 创建 httpPost | |||||
return sendHttpPost(httpPost); | |||||
} | |||||
/** | |||||
* 发送 post 请求 | |||||
* @param httpUrl 地址 | |||||
* @param params 参数(格式:key1=value1&key2=value2) | |||||
*/ | |||||
public String sendHttpPost(String httpUrl, String params) { | |||||
HttpPost httpPost= new HttpPost(httpUrl);// 创建 httpPost | |||||
try { | |||||
//设置参数 | |||||
StringEntity stringEntity = new StringEntity(params, "UTF-8"); | |||||
stringEntity.setContentType("application/x-www-form-urlencoded"); | |||||
httpPost.setEntity(stringEntity); | |||||
} catch (Exception e) { | |||||
logger.error(e.getMessage(),e); | |||||
} | |||||
return sendHttpPost(httpPost); | |||||
} | |||||
/** | |||||
* 发送 post 请求 | |||||
* @param httpUrl 地址 | |||||
* @param maps 参数 | |||||
*/ | |||||
public String sendHttpPost(String httpUrl, Map<String, String> maps) { | |||||
HttpPost httpPost= new HttpPost(httpUrl);// 创建 httpPost | |||||
// 创建参数队列 | |||||
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); | |||||
for (String key : maps.keySet()) { | |||||
nameValuePairs.add(new BasicNameValuePair(key, maps.get(key))); | |||||
} | |||||
try { | |||||
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8")); | |||||
} catch (Exception e) { | |||||
logger.error(e.getMessage(),e); | |||||
} | |||||
return sendHttpPost(httpPost); | |||||
} | |||||
/** | |||||
* 发送 Post请求 | |||||
* @param httpPost | |||||
*@return | |||||
*/ | |||||
private String sendHttpPost(HttpPost httpPost) { | |||||
CloseableHttpClient httpClient = null; | |||||
CloseableHttpResponse response = null; | |||||
HttpEntity entity = null; | |||||
String responseContent = null; | |||||
try { | |||||
// 创建默认的 httpClient 实例. | |||||
httpClient = HttpClients.createDefault(); | |||||
httpPost.setConfig(requestConfig); | |||||
// 执行请求 | |||||
response = httpClient.execute(httpPost); | |||||
entity = response.getEntity(); | |||||
responseContent = EntityUtils.toString(entity, "UTF-8"); | |||||
} catch (Exception e) { | |||||
logger.error(e.getMessage(),e); | |||||
} finally { | |||||
try { | |||||
// 关闭连接,释放资源 | |||||
if (response != null) { | |||||
response.close(); | |||||
} | |||||
if (httpClient != null) { | |||||
httpClient.close(); | |||||
} | |||||
} catch (IOException e) { | |||||
logger.error(e.getMessage(),e); | |||||
} | |||||
} | |||||
return responseContent; | |||||
} | |||||
/** | |||||
* 发送 get 请求 | |||||
* @param httpUrl | |||||
*/ | |||||
public String sendHttpGet(String httpUrl) { | |||||
HttpGet httpGet = new HttpGet(httpUrl);// 创建 get 请求 | |||||
return sendHttpGet(httpGet); | |||||
} | |||||
/** | |||||
* 发送 get请求 Https | |||||
* @param httpUrl | |||||
*/ | |||||
public String sendHttpsGet(String httpUrl) { | |||||
HttpGet httpGet = new HttpGet(httpUrl);// 创建 get 请求 | |||||
return sendHttpsGet(httpGet); | |||||
} | |||||
/** | |||||
* 发送 Get请求 | |||||
* @param httpGet | |||||
*@return | |||||
*/ | |||||
private String sendHttpGet(HttpGet httpGet) { | |||||
CloseableHttpClient httpClient = null; | |||||
CloseableHttpResponse response = null; | |||||
HttpEntity entity = null; | |||||
String responseContent = null; | |||||
try { | |||||
// 创建默认的 httpClient 实例. | |||||
httpClient = HttpClients.createDefault(); | |||||
httpGet.setConfig(requestConfig); | |||||
// 执行请求 | |||||
response = httpClient.execute(httpGet); | |||||
entity = response.getEntity(); | |||||
responseContent = EntityUtils.toString(entity, "UTF-8"); | |||||
} catch (Exception e) { | |||||
logger.error(e.getMessage(),e); | |||||
} finally { | |||||
try { | |||||
// 关闭连接,释放资源 | |||||
if (response != null) { | |||||
response.close(); | |||||
} | |||||
if (httpClient != null) { | |||||
httpClient.close(); | |||||
} | |||||
} catch (IOException e) { | |||||
logger.error(e.getMessage(),e); | |||||
} | |||||
} | |||||
return responseContent; | |||||
} | |||||
/** | |||||
* 发送 Get请求 Https | |||||
*@return | |||||
*/ | |||||
private String sendHttpsGet(HttpGet httpGet) { | |||||
CloseableHttpClient httpClient = null; | |||||
CloseableHttpResponse response = null; | |||||
HttpEntity entity = null; | |||||
String responseContent = null; | |||||
try { | |||||
// 创建默认的 httpClient 实例. | |||||
PublicSuffixMatcher publicSuffixMatcher = PublicSuffixMatcherLoader.load(new | |||||
URL(httpGet.getURI().toString())); | |||||
DefaultHostnameVerifier hostnameVerifier = new DefaultHostnameVerifier(publicSuffixMatcher); | |||||
httpClient = HttpClients.custom().setSSLHostnameVerifier(hostnameVerifier).build(); | |||||
httpGet.setConfig(requestConfig); | |||||
// 执行请求 | |||||
response = httpClient.execute(httpGet); | |||||
entity = response.getEntity(); | |||||
responseContent = EntityUtils.toString(entity, "UTF-8"); | |||||
} catch (Exception e) { | |||||
logger.error(e.getMessage(),e); | |||||
} finally { | |||||
try { | |||||
// 关闭连接,释放资源 | |||||
if (response != null) { | |||||
response.close(); | |||||
} | |||||
if (httpClient != null) { | |||||
httpClient.close(); | |||||
} | |||||
} catch (IOException e) { | |||||
logger.error(e.getMessage(),e); | |||||
} | |||||
} | |||||
return responseContent; | |||||
} | |||||
/** | |||||
* 通过该工厂类创建的RestTemplate发送请求时,可忽略https证书认证 | |||||
* @return 工厂 | |||||
*/ | |||||
public static HttpComponentsClientHttpRequestFactory generateHttpRequestFactory(){ | |||||
try{ | |||||
TrustStrategy acceptingTrustStrategy = ((x509Certificates, authType) -> true); | |||||
SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build(); | |||||
SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier()); | |||||
HttpClientBuilder httpClientBuilder = HttpClients.custom(); | |||||
httpClientBuilder.setSSLSocketFactory(connectionSocketFactory); | |||||
CloseableHttpClient httpClient = httpClientBuilder.build(); | |||||
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); | |||||
factory.setHttpClient(httpClient); | |||||
return factory; | |||||
}catch (Exception e){ | |||||
e.printStackTrace(); | |||||
} | |||||
return null; | |||||
} | |||||
} |
@@ -0,0 +1,52 @@ | |||||
package com.ningdatech.kqapi.common.util; | |||||
import org.slf4j.Logger; | |||||
import org.slf4j.LoggerFactory; | |||||
import java.nio.charset.StandardCharsets; | |||||
import java.security.MessageDigest; | |||||
public class Md5Utils { | |||||
private static final Logger LOGGER = LoggerFactory.getLogger(Md5Utils.class); | |||||
public static byte[] md5(String s) { | |||||
MessageDigest algorithm; | |||||
try { | |||||
algorithm = MessageDigest.getInstance("MD5"); | |||||
algorithm.reset(); | |||||
algorithm.update(s.getBytes(StandardCharsets.UTF_8)); | |||||
return algorithm.digest(); | |||||
} catch (Exception e) { | |||||
LOGGER.error("MD5 Error...", e); | |||||
} | |||||
return null; | |||||
} | |||||
private static String toHex(byte[] hash) { | |||||
if (hash == null) { | |||||
return null; | |||||
} | |||||
StringBuilder buf = new StringBuilder(hash.length * 2); | |||||
int i; | |||||
for (i = 0; i < hash.length; i++) { | |||||
if ((hash[i] & 0xff) < 0x10) { | |||||
buf.append("0"); | |||||
} | |||||
buf.append(Long.toString(hash[i] & 0xff, 16)); | |||||
} | |||||
return buf.toString(); | |||||
} | |||||
public static String hash(String s) { | |||||
try { | |||||
String hex = toHex(md5(s)); | |||||
if (hex == null) { | |||||
return s; | |||||
} | |||||
return new String(hex.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8); | |||||
} catch (Exception e) { | |||||
LOGGER.error("not supported charset:", e); | |||||
return s; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,58 @@ | |||||
package com.ningdatech.kqapi.common.util; | |||||
import com.alibaba.fastjson.JSON; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import java.util.HashMap; | |||||
import java.util.Map; | |||||
import java.util.Objects; | |||||
/** | |||||
* @Classname RefreshKeyUtil | |||||
* @Description | |||||
* @Date 2023/6/27 10:03 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Slf4j | |||||
public class RefreshKeyUtil { | |||||
public static String getRequestSecret(String appKey, String appSecret,Long requestTime) { | |||||
// 刷新秘钥 | |||||
HttpUtil httpUtil = HttpUtil.getInstance(); | |||||
log.info("请求密钥" + appSecret); | |||||
String sign = Md5Utils.hash (appKey + appSecret + requestTime); | |||||
String refreshUrl = "http://interface.zjzwfw.gov.cn/gateway/app/refreshTokenByKey.htm"; | |||||
log.info(refreshUrl); | |||||
Map<String,String> map = new HashMap<>(); | |||||
map.put("appKey",appKey); | |||||
map.put("sign",sign); | |||||
map.put("requestTime",requestTime + ""); | |||||
String result = httpUtil.sendHttpPost(refreshUrl,map); | |||||
log.info(result); | |||||
JSONObject dataJson = JSON.parseObject(result).getJSONObject("datas"); | |||||
if(Objects.nonNull(dataJson)){ | |||||
return dataJson.getString("requestSecret"); | |||||
} | |||||
return result; | |||||
} | |||||
public static String refreshSecret(String appKey, String refreshSecret,Long requestTime) { | |||||
// 刷新秘钥 | |||||
HttpUtil httpUtil = HttpUtil.getInstance(); | |||||
log.info("刷新密钥" + refreshSecret); | |||||
String refreshSign = Md5Utils.hash (appKey + refreshSecret + requestTime); | |||||
String refreshUrl = "http://interface.zjzwfw.gov.cn/gateway/app/refreshTokenBySec.htm"; | |||||
log.info(refreshUrl); | |||||
Map<String,String> map = new HashMap<>(); | |||||
map.put("appKey",appKey); | |||||
map.put("sign",refreshSign); | |||||
map.put("requestTime",requestTime + ""); | |||||
String result = httpUtil.sendHttpPost(refreshUrl,map); | |||||
log.info(result); | |||||
JSONObject dataJson = JSON.parseObject(result).getJSONObject("datas"); | |||||
if(Objects.nonNull(dataJson)){ | |||||
return dataJson.getString("requestSecret"); | |||||
} | |||||
return result; | |||||
} | |||||
} |
@@ -0,0 +1,150 @@ | |||||
package com.ningdatech.kqapi.common.util; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import org.springframework.beans.BeansException; | |||||
import org.springframework.beans.factory.DisposableBean; | |||||
import org.springframework.context.ApplicationContext; | |||||
import org.springframework.context.ApplicationContextAware; | |||||
import org.springframework.core.env.Environment; | |||||
import org.springframework.lang.NonNull; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
/** | |||||
* @author qinxianyun | |||||
*/ | |||||
@Slf4j | |||||
public class SpringContextHolder implements ApplicationContextAware, DisposableBean { | |||||
private static ApplicationContext applicationContext = null; | |||||
private static final List<CallBack> CALL_BACKS = new ArrayList<>(); | |||||
private static boolean addCallback = true; | |||||
/** | |||||
* 针对 某些初始化方法,在SpringContextHolder 未初始化时 提交回调方法。 | |||||
* 在SpringContextHolder 初始化后,进行回调使用 | |||||
* | |||||
* @param callBack 回调函数 | |||||
*/ | |||||
public synchronized static void addCallBacks(CallBack callBack) { | |||||
if (addCallback) { | |||||
SpringContextHolder.CALL_BACKS.add(callBack); | |||||
} else { | |||||
log.warn("CallBack:{} 已无法添加!立即执行", callBack.getCallBackName()); | |||||
callBack.executor(); | |||||
} | |||||
} | |||||
/** | |||||
* 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. | |||||
*/ | |||||
@SuppressWarnings("unchecked") | |||||
public static <T> T getBean(String name) { | |||||
assertContextInjected(); | |||||
return (T) applicationContext.getBean(name); | |||||
} | |||||
/** | |||||
* 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. | |||||
*/ | |||||
public static <T> T getBean(Class<T> requiredType) { | |||||
assertContextInjected(); | |||||
return applicationContext.getBean(requiredType); | |||||
} | |||||
/** | |||||
* 获取SpringBoot 配置信息 | |||||
* | |||||
* @param property 属性key | |||||
* @param defaultValue 默认值 | |||||
* @param requiredType 返回类型 | |||||
* @return / | |||||
*/ | |||||
public static <T> T getProperties(String property, T defaultValue, Class<T> requiredType) { | |||||
T result = defaultValue; | |||||
try { | |||||
result = getBean(Environment.class).getProperty(property, requiredType); | |||||
} catch (Exception ignored) { | |||||
} | |||||
return result; | |||||
} | |||||
/** | |||||
* 获取SpringBoot 配置信息 | |||||
* | |||||
* @param property 属性key | |||||
* @return / | |||||
*/ | |||||
public static String getProperties(String property) { | |||||
return getProperties(property, null, String.class); | |||||
} | |||||
/** | |||||
* 获取SpringBoot 配置信息 | |||||
* | |||||
* @param property 属性key | |||||
* @param requiredType 返回类型 | |||||
* @return / | |||||
*/ | |||||
public static <T> T getProperties(String property, Class<T> requiredType) { | |||||
return getProperties(property, null, requiredType); | |||||
} | |||||
/** | |||||
* 检查ApplicationContext不为空. | |||||
*/ | |||||
private static void assertContextInjected() { | |||||
if (applicationContext == null) { | |||||
throw new IllegalStateException("applicationContext属性未注入, 请在applicationContext" + | |||||
".xml中定义SpringContextHolder或在SpringBoot启动类中注册SpringContextHolder."); | |||||
} | |||||
} | |||||
/** | |||||
* 清除SpringContextHolder中的ApplicationContext为Null. | |||||
*/ | |||||
private static void clearHolder() { | |||||
log.debug("清除SpringContextHolder中的ApplicationContext:" | |||||
+ applicationContext); | |||||
applicationContext = null; | |||||
} | |||||
@Override | |||||
public void destroy() { | |||||
SpringContextHolder.clearHolder(); | |||||
} | |||||
@Override | |||||
public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException { | |||||
if (SpringContextHolder.applicationContext != null) { | |||||
log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + SpringContextHolder.applicationContext); | |||||
} | |||||
SpringContextHolder.applicationContext = applicationContext; | |||||
if (addCallback) { | |||||
for (CallBack callBack : SpringContextHolder.CALL_BACKS) { | |||||
callBack.executor(); | |||||
} | |||||
CALL_BACKS.clear(); | |||||
} | |||||
SpringContextHolder.addCallback = false; | |||||
} | |||||
/** | |||||
* 获取当前启用的配置文件 | |||||
* <ul> | |||||
* <li><b>生产环境:prod</b></li> | |||||
* <li><b>开发环境:dev</b></li> | |||||
* </ul> | |||||
* | |||||
* @return java.lang.String | |||||
* @author WendyYang | |||||
**/ | |||||
public static String getActiveProfile() { | |||||
String[] strings = applicationContext.getEnvironment().getActiveProfiles(); | |||||
return strings[0]; | |||||
} | |||||
} |
@@ -0,0 +1,26 @@ | |||||
package com.ningdatech.kqapi.zzsfw.controller; | |||||
import io.swagger.annotations.Api; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.validation.annotation.Validated; | |||||
import org.springframework.web.bind.annotation.RequestMapping; | |||||
import org.springframework.web.bind.annotation.RestController; | |||||
/** | |||||
* <p> | |||||
* 省回流_政务服务_数据共享_事项基本信息表 前端控制器 | |||||
* </p> | |||||
* | |||||
* @author ZPF | |||||
* @since 2023-10-25 | |||||
*/ | |||||
@Slf4j | |||||
@Validated | |||||
@RestController | |||||
@RequestMapping("/api/v1/zzsfw/") | |||||
@Api(value = "DscSxAdsShareItemQltQlsxCommonIDVKqController", tags = "柯桥-政务数据") | |||||
@RequiredArgsConstructor | |||||
public class DscSxAdsShareItemQltQlsxCommonIDVKqController { | |||||
} |
@@ -0,0 +1,42 @@ | |||||
package com.ningdatech.kqapi.zzsfw.controller; | |||||
import com.ningdatech.kqapi.zzsfw.entity.vo.MattersVO; | |||||
import com.ningdatech.kqapi.zzsfw.entity.vo.ZoneVO; | |||||
import com.ningdatech.kqapi.zzsfw.manage.MatterManage; | |||||
import io.swagger.annotations.Api; | |||||
import io.swagger.annotations.ApiOperation; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.validation.annotation.Validated; | |||||
import org.springframework.web.bind.annotation.GetMapping; | |||||
import org.springframework.web.bind.annotation.RequestMapping; | |||||
import org.springframework.stereotype.Controller; | |||||
import org.springframework.web.bind.annotation.RestController; | |||||
import java.util.List; | |||||
/** | |||||
* <p> | |||||
* 前端控制器 | |||||
* </p> | |||||
* | |||||
* @author ZPF | |||||
* @since 2023-10-27 | |||||
*/ | |||||
@Slf4j | |||||
@Validated | |||||
@RestController | |||||
@RequestMapping("/api/v1/zzsfw/") | |||||
@Api(value = "NdKqZzsfwMenuController", tags = "柯桥-政务数据") | |||||
@RequiredArgsConstructor | |||||
public class NdKqZzsfwMenuController { | |||||
private final MatterManage matterManage; | |||||
@ApiOperation(value = "获取政务事项数据列表", notes = "获取政务事项数据列表") | |||||
@GetMapping("/matters") | |||||
public List<ZoneVO> getMatters() { | |||||
return matterManage.getMatters(); | |||||
} | |||||
} |
@@ -0,0 +1,422 @@ | |||||
package com.ningdatech.kqapi.zzsfw.entity.entity; | |||||
import com.baomidou.mybatisplus.annotation.TableId; | |||||
import com.baomidou.mybatisplus.annotation.TableName; | |||||
import java.io.Serializable; | |||||
import java.time.LocalDateTime; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
/** | |||||
* <p> | |||||
* 省回流_政务服务_数据共享_事项基本信息表 | |||||
* </p> | |||||
* | |||||
* @author ZPF | |||||
* @since 2023-10-25 | |||||
*/ | |||||
@Data | |||||
@TableName("dsc_sx_ads_share_item_qlt_qlsx_common_i_d_v_kq") | |||||
@ApiModel(value = "DscSxAdsShareItemQltQlsxCommonIDVKq对象", description = "省回流_政务服务_数据共享_事项基本信息表") | |||||
public class DscSxAdsShareItemQltQlsxCommonIDVKq implements Serializable { | |||||
private static final long serialVersionUID = 1L; | |||||
@ApiModelProperty("事项唯一标识") | |||||
@TableId | |||||
private String rowguid; | |||||
@ApiModelProperty("写入同步时间") | |||||
private LocalDateTime updateDate; | |||||
@ApiModelProperty("事项更新类型") | |||||
private String updateType; | |||||
@ApiModelProperty("事项类型") | |||||
private String qlKind; | |||||
@ApiModelProperty("主项编码") | |||||
private String qlMainitemId; | |||||
@ApiModelProperty("子项编码") | |||||
private String qlSubitemId; | |||||
@ApiModelProperty("事权层级") | |||||
private String shiquancj; | |||||
@ApiModelProperty("行政区划代码") | |||||
private String belongxiaqucode; | |||||
@ApiModelProperty("实施机关组织机构代码(主管部门组织机构代码)") | |||||
private String qlDepOrgcdoe; | |||||
@ApiModelProperty("权力来源") | |||||
private String itemsource; | |||||
@ApiModelProperty("版本号") | |||||
private String versionNumber; | |||||
@ApiModelProperty("事项入库时间") | |||||
private LocalDateTime versionDate; | |||||
@ApiModelProperty("事项状态生效时间") | |||||
private LocalDateTime qlEffectTime; | |||||
@ApiModelProperty("事项内部编码") | |||||
private String qlInnerCode; | |||||
@ApiModelProperty("事项名称") | |||||
private String qlName; | |||||
@ApiModelProperty("事项状态") | |||||
private String qlState; | |||||
@ApiModelProperty("法定依据(审批依据;实施依据)") | |||||
private String lawbasis; | |||||
@ApiModelProperty("法定期限") | |||||
private Long anticipateDay; | |||||
@ApiModelProperty("法定期限单位") | |||||
private String anticipateType; | |||||
@ApiModelProperty("承诺期限") | |||||
private Long promiseDay; | |||||
@ApiModelProperty("办事者到办事现场次数") | |||||
private Long applyerminCount; | |||||
@ApiModelProperty("是否列为国家、省、市、县级行政审批制度改革试点") | |||||
private String isPilot; | |||||
@ApiModelProperty("实施机关(主管部门名称)") | |||||
private String qlDep; | |||||
@ApiModelProperty("实施或牵头的处(科)室名称") | |||||
private String leadDept; | |||||
@ApiModelProperty("办件类型") | |||||
private String bjtype; | |||||
@ApiModelProperty("本级审批性质") | |||||
private String benjispxz; | |||||
@ApiModelProperty("办理频率") | |||||
private String handleFrequency; | |||||
@ApiModelProperty("行政相对人性质(适用对象(行政相对人性质);服务相对人性质)") | |||||
private String xingzhenxdrxz; | |||||
@ApiModelProperty("审批条件(申请条件;受理条件)") | |||||
private String applyCondition; | |||||
@ApiModelProperty("办件结果文件名称(审批结果)") | |||||
private String banjianFinishfiles; | |||||
@ApiModelProperty("咨询电话") | |||||
private String linkTel; | |||||
@ApiModelProperty("监督投诉电话") | |||||
private String superviseTel; | |||||
@ApiModelProperty("电脑端网上办理地址") | |||||
private String webapplyurl; | |||||
@ApiModelProperty("网上咨询网址") | |||||
private String webconsulturl; | |||||
@ApiModelProperty("是否收费") | |||||
private String chargeFlag; | |||||
@ApiModelProperty("收费依据") | |||||
private String chargeBasis; | |||||
@ApiModelProperty("法人关注点") | |||||
private String rightclassQiyezt; | |||||
@ApiModelProperty("面向法人的对象分类") | |||||
private String rightclassQiyedx; | |||||
@ApiModelProperty("个人关注点") | |||||
private String rightclassGerensx; | |||||
@ApiModelProperty("面向个人的对象分类") | |||||
private String rightclassGerendx; | |||||
@ApiModelProperty("内部流程信息") | |||||
private String inFlowInfo; | |||||
@ApiModelProperty("业务申报材料") | |||||
private String materialInfo; | |||||
@ApiModelProperty("材料情形说明") | |||||
private String materialCaseInfo; | |||||
@ApiModelProperty("收费项目") | |||||
private String chargeitemInfo; | |||||
@ApiModelProperty("常见问题解答") | |||||
private String qaInfo; | |||||
@ApiModelProperty("受理地点信息") | |||||
private String acceptAddressInfo; | |||||
@ApiModelProperty("交换标识") | |||||
private String syncSign; | |||||
@ApiModelProperty("交换时间") | |||||
private LocalDateTime syncDate; | |||||
@ApiModelProperty("交换错误描述") | |||||
private String syncErrorDesc; | |||||
@ApiModelProperty("部门组织机构代码") | |||||
private String ouorgcode; | |||||
@ApiModelProperty("部门编码") | |||||
private String ouguid; | |||||
@ApiModelProperty("法人登录地址(电脑端法人认证地址)") | |||||
private String farenurl; | |||||
@ApiModelProperty("电脑端个人认证标识") | |||||
private String gerenflag; | |||||
@ApiModelProperty("是否统建系统(是否使用统一网上申报)") | |||||
private String isTongjian; | |||||
@ApiModelProperty("事项编码") | |||||
private String qlFullId; | |||||
@ApiModelProperty("委托下放") | |||||
private String entrust; | |||||
@ApiModelProperty("委托下放说明") | |||||
private String entrustdes; | |||||
@ApiModelProperty("最少上门次数说明") | |||||
private String applyerminCountDesc; | |||||
@ApiModelProperty("事项所属业务类型") | |||||
private String outypecode; | |||||
@ApiModelProperty("对外公布办理程序描述") | |||||
private String outFlowDesc; | |||||
@ApiModelProperty("办结类型") | |||||
private String banjianFinishtype; | |||||
@ApiModelProperty("是否允许特别程序申请") | |||||
private String isSpecialpro; | |||||
@ApiModelProperty("删除数据标识") | |||||
private String state2; | |||||
@ApiModelProperty("不适宜开展网上申报") | |||||
private String nosuitApply; | |||||
@ApiModelProperty("是否接入统一办件库") | |||||
private String isUnifydo; | |||||
@ApiModelProperty("是否是上级主管部门统建系统") | |||||
private String isUpunify; | |||||
@ApiModelProperty("权力属性") | |||||
private String qlAtt; | |||||
@ApiModelProperty("备注") | |||||
private String baknote; | |||||
@ApiModelProperty("星级服务(网上办理业务模式)") | |||||
private String webapplymode; | |||||
@ApiModelProperty("权力来源方式") | |||||
private String itemsourcetype; | |||||
@ApiModelProperty("是否可以适用处罚简易程序") | |||||
private String isSimplepunish; | |||||
@ApiModelProperty("是否涉及征收(税)费减免的审批") | |||||
private String isLevywaiver; | |||||
@ApiModelProperty("征收标准") | |||||
private String feebasis; | |||||
@ApiModelProperty("自由裁量") | |||||
private String factInfo; | |||||
@ApiModelProperty("涉密或敏感") | |||||
private String isCs; | |||||
@ApiModelProperty("未接入统一办件库其他原因说明") | |||||
private String unifydodes; | |||||
@ApiModelProperty("极少业务") | |||||
private String isVlb; | |||||
@ApiModelProperty("nounify_do") | |||||
private String nounifyDo; | |||||
@ApiModelProperty("乡镇延伸事项的部门源事项") | |||||
private String qlInnerCodeItem; | |||||
@ApiModelProperty("是否投资(bak1)") | |||||
private String isTouzip; | |||||
@ApiModelProperty("行业主题分类") | |||||
private String hangyeclasstype; | |||||
@ApiModelProperty("其他行政权力子类型") | |||||
private String qlSubKind; | |||||
@ApiModelProperty("移动端网上办理地址") | |||||
private String appwebapplyurl; | |||||
@ApiModelProperty("移动端网上预约地址") | |||||
private String appappointmenturl; | |||||
@ApiModelProperty("电脑端网上预约地址") | |||||
private String appointmenturl; | |||||
@ApiModelProperty("是否网上预约") | |||||
private String isWebappointment; | |||||
@ApiModelProperty("网上预约时段") | |||||
private String webappointmentperiod; | |||||
@ApiModelProperty("主要内容") | |||||
private String maincontext; | |||||
@ApiModelProperty("共同实施单位") | |||||
private String doDept; | |||||
@ApiModelProperty("相关附件") | |||||
private String relatedguid; | |||||
@ApiModelProperty("相关附件信息") | |||||
private String related; | |||||
@ApiModelProperty("是否提供快递送达") | |||||
private String isExpress; | |||||
@ApiModelProperty("公共服务事项子类型") | |||||
private String serviceSubKind; | |||||
@ApiModelProperty("是否列入最多跑一次事项清单") | |||||
private String ispyc; | |||||
@ApiModelProperty("联办事项") | |||||
private String lbsx; | |||||
@ApiModelProperty("外部流程图") | |||||
private String outFlowUrl; | |||||
@ApiModelProperty("受理机构") | |||||
private String acpInstitution; | |||||
@ApiModelProperty("决定机构") | |||||
private String decInstitution; | |||||
@ApiModelProperty("涉及的内容(公共服务:主要内容)") | |||||
private String contentInvolve; | |||||
@ApiModelProperty("适用对象说明") | |||||
private String applicableObject; | |||||
@ApiModelProperty("行政相对人权利和义务") | |||||
private String xingzhenxdrxy; | |||||
@ApiModelProperty("有无数量限制") | |||||
private String countLimit; | |||||
@ApiModelProperty("数量限制情况说明") | |||||
private String countNote; | |||||
@ApiModelProperty("禁止性要求") | |||||
private String banRequirement; | |||||
@ApiModelProperty("事项审查类型") | |||||
private String shixiangsctype; | |||||
@ApiModelProperty("事项审查类型说明") | |||||
private String shixiangsclx; | |||||
@ApiModelProperty("申请方式") | |||||
private String applyType; | |||||
@ApiModelProperty("联系电话") | |||||
private String applyTypeTel; | |||||
@ApiModelProperty("邮箱") | |||||
private String applyTypeMail; | |||||
@ApiModelProperty("传真") | |||||
private String applyTypeFax; | |||||
@ApiModelProperty("办理方式") | |||||
private String handleType; | |||||
@ApiModelProperty("手机端法人认证地址") | |||||
private String mbfarenadd; | |||||
@ApiModelProperty("手机端个人认证标识") | |||||
private String mbgerenflag; | |||||
@ApiModelProperty("时限说明") | |||||
private String destime; | |||||
@ApiModelProperty("送达方式") | |||||
private String serviceMode; | |||||
@ApiModelProperty("送达时限") | |||||
private String serviceDay; | |||||
@ApiModelProperty("其他") | |||||
private String ununifydoOther; | |||||
@ApiModelProperty("是否自有") | |||||
private String ishasownflow; | |||||
@ApiModelProperty("分区") | |||||
private String dt; | |||||
@ApiModelProperty("所属地市") | |||||
private String dscCity; | |||||
@ApiModelProperty("所需区/县") | |||||
private String dscAdmRegion; | |||||
@ApiModelProperty("数源单位代码") | |||||
private String dscSydepCode; | |||||
@ApiModelProperty("数源单位") | |||||
private String dscSydepName; | |||||
@ApiModelProperty("数据所属系统名称") | |||||
private String dscSydepSys; | |||||
@ApiModelProperty("数源单位表名") | |||||
private String dscSydepTblname; | |||||
@ApiModelProperty("唯一自增序列号") | |||||
private String dscBizRecordId; | |||||
@ApiModelProperty("I插入U更新D删除") | |||||
private String dscBizOperation; | |||||
@ApiModelProperty("源表数据同步时间") | |||||
private LocalDateTime dscBizTimestamp; | |||||
@ApiModelProperty("数据来源表名(清洗库或基础库表名)") | |||||
private String dscDatasrTblname; | |||||
@ApiModelProperty("业务主键MD5值(清洗增加)") | |||||
private String dscHashUnique; | |||||
@ApiModelProperty("清洗时间(清洗增加)") | |||||
private String dscCleanTimestamp; | |||||
@ApiModelProperty("地市仓数据入库时间") | |||||
private LocalDateTime dscDwRksj; | |||||
} |
@@ -0,0 +1,57 @@ | |||||
package com.ningdatech.kqapi.zzsfw.entity.entity; | |||||
import com.baomidou.mybatisplus.annotation.IdType; | |||||
import com.baomidou.mybatisplus.annotation.TableId; | |||||
import com.baomidou.mybatisplus.annotation.TableName; | |||||
import java.io.Serializable; | |||||
import java.time.LocalDateTime; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
/** | |||||
* <p> | |||||
* | |||||
* </p> | |||||
* | |||||
* @author ZPF | |||||
* @since 2023-10-27 | |||||
*/ | |||||
@Data | |||||
@TableName("nd_kq_zzsfw_menu") | |||||
@ApiModel(value = "NdKqZzsfwMenu对象", description = "") | |||||
public class NdKqZzsfwMenu implements Serializable { | |||||
private static final long serialVersionUID = 1L; | |||||
@ApiModelProperty("id主键") | |||||
@TableId(type = IdType.AUTO) | |||||
private Long id; | |||||
@ApiModelProperty("数据同步时间") | |||||
private LocalDateTime createOn; | |||||
@ApiModelProperty("社区名") | |||||
private String zoneName; | |||||
@ApiModelProperty("窗口") | |||||
private String window; | |||||
@ApiModelProperty("部门") | |||||
private String department; | |||||
@ApiModelProperty("事项名称") | |||||
private String itemName; | |||||
@ApiModelProperty("事项在政务中心的rowid") | |||||
private String itemRowid; | |||||
@ApiModelProperty("排序") | |||||
private Integer sort; | |||||
@ApiModelProperty("链接") | |||||
private String webapplyurl; | |||||
@ApiModelProperty("是否在政务中心查到url") | |||||
private Integer hasUrl; | |||||
} |
@@ -0,0 +1,34 @@ | |||||
package com.ningdatech.kqapi.zzsfw.entity.vo; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import java.io.Serializable; | |||||
/** | |||||
* <p> | |||||
* 事项 | |||||
* </p> | |||||
* | |||||
* @author ZPF | |||||
* @since 2023-10-25 | |||||
*/ | |||||
@Data | |||||
@ApiModel(value = "MattersVO", description = "事项") | |||||
public class MattersVO implements Serializable { | |||||
private static final long serialVersionUID = 1L; | |||||
@ApiModelProperty("id") | |||||
private String rowguid; | |||||
@ApiModelProperty("事项名称") | |||||
private String matterName; | |||||
@ApiModelProperty("事项链接") | |||||
private String webapplyurl; | |||||
@ApiModelProperty("排序编号") | |||||
private Integer sort; | |||||
} |
@@ -0,0 +1,29 @@ | |||||
package com.ningdatech.kqapi.zzsfw.entity.vo; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import java.io.Serializable; | |||||
import java.util.List; | |||||
/** | |||||
* <p> | |||||
* 社区VO | |||||
* </p> | |||||
* | |||||
* @author ZPF | |||||
* @since 2023-10-25 | |||||
*/ | |||||
@Data | |||||
@ApiModel(value = "WindowVO", description = "窗口VO") | |||||
public class WindowVO implements Serializable { | |||||
private static final long serialVersionUID = 1L; | |||||
@ApiModelProperty("窗口") | |||||
private String windowName; | |||||
@ApiModelProperty("事项") | |||||
private List<MattersVO> matters; | |||||
} |
@@ -0,0 +1,29 @@ | |||||
package com.ningdatech.kqapi.zzsfw.entity.vo; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import java.io.Serializable; | |||||
import java.util.List; | |||||
/** | |||||
* <p> | |||||
* 社区VO | |||||
* </p> | |||||
* | |||||
* @author ZPF | |||||
* @since 2023-10-25 | |||||
*/ | |||||
@Data | |||||
@ApiModel(value = "ZoneVO", description = "社区VO") | |||||
public class ZoneVO implements Serializable { | |||||
private static final long serialVersionUID = 1L; | |||||
@ApiModelProperty("社区") | |||||
private String zoneName; | |||||
@ApiModelProperty("社区") | |||||
private List<WindowVO> windows; | |||||
} |
@@ -0,0 +1,76 @@ | |||||
package com.ningdatech.kqapi.zzsfw.manage; | |||||
import cn.hutool.core.bean.BeanUtil; | |||||
import cn.hutool.core.collection.CollUtil; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.ningdatech.kqapi.zzsfw.entity.entity.DscSxAdsShareItemQltQlsxCommonIDVKq; | |||||
import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwMenu; | |||||
import com.ningdatech.kqapi.zzsfw.entity.vo.MattersVO; | |||||
import com.ningdatech.kqapi.zzsfw.entity.vo.WindowVO; | |||||
import com.ningdatech.kqapi.zzsfw.entity.vo.ZoneVO; | |||||
import com.ningdatech.kqapi.zzsfw.service.IDscSxAdsShareItemQltQlsxCommonIDVKqService; | |||||
import com.ningdatech.kqapi.zzsfw.service.INdKqZzsfwMenuService; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.Collections; | |||||
import java.util.HashSet; | |||||
import java.util.List; | |||||
import java.util.Set; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* @Classname MatterManage | |||||
* @Description | |||||
* @Date 2023/10/25 14:55 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Component | |||||
@Slf4j | |||||
@RequiredArgsConstructor | |||||
public class MatterManage { | |||||
private final INdKqZzsfwMenuService menuService; | |||||
public List<ZoneVO> getMatters() { | |||||
List<NdKqZzsfwMenu> matters = menuService.list(Wrappers.lambdaQuery(NdKqZzsfwMenu.class) | |||||
.eq(NdKqZzsfwMenu::getHasUrl,1) | |||||
.orderByAsc(NdKqZzsfwMenu::getSort)); | |||||
if(CollUtil.isEmpty(matters)){ | |||||
return Collections.emptyList(); | |||||
} | |||||
Set<String> zoneSet = new HashSet<>(); | |||||
return matters.stream().filter(m -> zoneSet.add(m.getZoneName())).map(m -> { | |||||
ZoneVO zone = new ZoneVO(); | |||||
zone.setZoneName(m.getZoneName()); | |||||
zone.setWindows(generateWindows(m,matters)); | |||||
return zone; | |||||
}).collect(Collectors.toList()); | |||||
} | |||||
private List<WindowVO> generateWindows(NdKqZzsfwMenu menu, List<NdKqZzsfwMenu> matters) { | |||||
return matters.stream().filter(m -> StringUtils.isNotBlank(m.getZoneName()) && m.getZoneName().equals(menu.getZoneName())) | |||||
.map(m -> { | |||||
WindowVO window = new WindowVO(); | |||||
window.setWindowName(m.getWindow()); | |||||
window.setMatters(generateMatters(m,matters)); | |||||
return window; | |||||
}).collect(Collectors.toList()); | |||||
} | |||||
private List<MattersVO> generateMatters(NdKqZzsfwMenu menu, List<NdKqZzsfwMenu> matters) { | |||||
return matters.stream().filter(m -> StringUtils.isNotBlank(m.getWindow()) && m.getWindow().equals(menu.getWindow())) | |||||
.map(m -> { | |||||
MattersVO matter = new MattersVO(); | |||||
matter.setMatterName(m.getItemName()); | |||||
matter.setWebapplyurl(m.getWebapplyurl()); | |||||
matter.setRowguid(m.getItemRowid()); | |||||
matter.setSort(m.getSort()); | |||||
return matter; | |||||
}).collect(Collectors.toList()); | |||||
} | |||||
} |
@@ -0,0 +1,16 @@ | |||||
package com.ningdatech.kqapi.zzsfw.mapper; | |||||
import com.ningdatech.kqapi.zzsfw.entity.entity.DscSxAdsShareItemQltQlsxCommonIDVKq; | |||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |||||
/** | |||||
* <p> | |||||
* 省回流_政务服务_数据共享_事项基本信息表 Mapper 接口 | |||||
* </p> | |||||
* | |||||
* @author ZPF | |||||
* @since 2023-10-25 | |||||
*/ | |||||
public interface DscSxAdsShareItemQltQlsxCommonIDVKqMapper extends BaseMapper<DscSxAdsShareItemQltQlsxCommonIDVKq> { | |||||
} |
@@ -0,0 +1,5 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||||
<mapper namespace="com.ningdatech.kqapi.zzsfw.mapper.DscSxAdsShareItemQltQlsxCommonIDVKqMapper"> | |||||
</mapper> |
@@ -0,0 +1,16 @@ | |||||
package com.ningdatech.kqapi.zzsfw.mapper; | |||||
import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwMenu; | |||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |||||
/** | |||||
* <p> | |||||
* Mapper 接口 | |||||
* </p> | |||||
* | |||||
* @author ZPF | |||||
* @since 2023-10-27 | |||||
*/ | |||||
public interface NdKqZzsfwMenuMapper extends BaseMapper<NdKqZzsfwMenu> { | |||||
} |
@@ -0,0 +1,5 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||||
<mapper namespace="com.ningdatech.kqapi.zzsfw.mapper.NdKqZzsfwMenuMapper"> | |||||
</mapper> |
@@ -0,0 +1,16 @@ | |||||
package com.ningdatech.kqapi.zzsfw.service; | |||||
import com.ningdatech.kqapi.zzsfw.entity.entity.DscSxAdsShareItemQltQlsxCommonIDVKq; | |||||
import com.baomidou.mybatisplus.extension.service.IService; | |||||
/** | |||||
* <p> | |||||
* 省回流_政务服务_数据共享_事项基本信息表 服务类 | |||||
* </p> | |||||
* | |||||
* @author ZPF | |||||
* @since 2023-10-25 | |||||
*/ | |||||
public interface IDscSxAdsShareItemQltQlsxCommonIDVKqService extends IService<DscSxAdsShareItemQltQlsxCommonIDVKq> { | |||||
} |
@@ -0,0 +1,16 @@ | |||||
package com.ningdatech.kqapi.zzsfw.service; | |||||
import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwMenu; | |||||
import com.baomidou.mybatisplus.extension.service.IService; | |||||
/** | |||||
* <p> | |||||
* 服务类 | |||||
* </p> | |||||
* | |||||
* @author ZPF | |||||
* @since 2023-10-27 | |||||
*/ | |||||
public interface INdKqZzsfwMenuService extends IService<NdKqZzsfwMenu> { | |||||
} |
@@ -0,0 +1,20 @@ | |||||
package com.ningdatech.kqapi.zzsfw.service.impl; | |||||
import com.ningdatech.kqapi.zzsfw.entity.entity.DscSxAdsShareItemQltQlsxCommonIDVKq; | |||||
import com.ningdatech.kqapi.zzsfw.mapper.DscSxAdsShareItemQltQlsxCommonIDVKqMapper; | |||||
import com.ningdatech.kqapi.zzsfw.service.IDscSxAdsShareItemQltQlsxCommonIDVKqService; | |||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | |||||
import org.springframework.stereotype.Service; | |||||
/** | |||||
* <p> | |||||
* 省回流_政务服务_数据共享_事项基本信息表 服务实现类 | |||||
* </p> | |||||
* | |||||
* @author ZPF | |||||
* @since 2023-10-25 | |||||
*/ | |||||
@Service | |||||
public class DscSxAdsShareItemQltQlsxCommonIDVKqServiceImpl extends ServiceImpl<DscSxAdsShareItemQltQlsxCommonIDVKqMapper, DscSxAdsShareItemQltQlsxCommonIDVKq> implements IDscSxAdsShareItemQltQlsxCommonIDVKqService { | |||||
} |
@@ -0,0 +1,20 @@ | |||||
package com.ningdatech.kqapi.zzsfw.service.impl; | |||||
import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwMenu; | |||||
import com.ningdatech.kqapi.zzsfw.mapper.NdKqZzsfwMenuMapper; | |||||
import com.ningdatech.kqapi.zzsfw.service.INdKqZzsfwMenuService; | |||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | |||||
import org.springframework.stereotype.Service; | |||||
/** | |||||
* <p> | |||||
* 服务实现类 | |||||
* </p> | |||||
* | |||||
* @author ZPF | |||||
* @since 2023-10-27 | |||||
*/ | |||||
@Service | |||||
public class NdKqZzsfwMenuServiceImpl extends ServiceImpl<NdKqZzsfwMenuMapper, NdKqZzsfwMenu> implements INdKqZzsfwMenuService { | |||||
} |
@@ -0,0 +1,123 @@ | |||||
server: | |||||
port: 33060 | |||||
servlet: | |||||
context-path: /kq | |||||
spring: | |||||
mvc: | |||||
pathmatch: | |||||
matching-strategy: ant_path_matcher | |||||
session: | |||||
store-type: redis | |||||
redis: | |||||
namespace: "spring:session" | |||||
timeout: 864000 | |||||
redis: | |||||
timeout: 5000 | |||||
host: 47.98.125.47 | |||||
port: 26379 | |||||
database: 7 | |||||
password: Ndkj1234 | |||||
jedis: | |||||
pool: | |||||
max-active: 200 | |||||
max-idle: 500 | |||||
min-idle: 8 | |||||
max-wait: 10000 | |||||
application: | |||||
name: kq | |||||
jackson: | |||||
default-property-inclusion: non_null | |||||
time-zone: GMT+8 | |||||
date-format: yyyy-MM-dd HH:mm:ss | |||||
jpa: | |||||
properties: | |||||
hibernate: | |||||
default_schema: PUBLIC | |||||
hbm2ddl: | |||||
auto: update | |||||
show_sql: true | |||||
show-sql: true | |||||
hibernate: | |||||
ddl-auto: update | |||||
datasource: | |||||
type: com.zaxxer.hikari.HikariDataSource | |||||
driver-class-name: com.mysql.cj.jdbc.Driver | |||||
url: jdbc:mysql://47.98.125.47:3306/kqzzsfw?serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false | |||||
username: root | |||||
password: NingdaKeji123! | |||||
# 数据源 | |||||
hikari: | |||||
# 是客户端等待连接池连接的最大毫秒数 | |||||
connection-timeout: 30000 | |||||
# 是允许连接在连接池中空闲的最长时间 | |||||
minimum-idle: 5 | |||||
# 配置最大池大小 | |||||
maximum-pool-size: 300 | |||||
# 是允许连接在连接池中空闲的最长时间(以毫秒为单位) | |||||
idle-timeout: 60000 | |||||
# 池中连接关闭后的最长生命周期(以毫秒为单位) | |||||
max-lifetime: 600000 | |||||
# 配置从池返回的连接的默认自动提交行为。默认值为true。 | |||||
auto-commit: true | |||||
# 开启连接监测泄露 | |||||
leak-detection-threshold: 10000 | |||||
# 测试连接数据库 | |||||
connection-test-query: SELECT 1 | |||||
#设置上传 单个文件的大小 | |||||
servlet: | |||||
multipart: | |||||
max-file-size: 100MB | |||||
max-request-size: 150MB | |||||
mybatis-plus: | |||||
configuration: | |||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl | |||||
global-config: | |||||
db-config: | |||||
logic-delete-value: true | |||||
logic-not-delete-value: false | |||||
logging: | |||||
config: classpath:logback-spring.xml | |||||
#日志配置 | |||||
level: | |||||
root: info | |||||
file: | |||||
path: logs | |||||
nd: | |||||
cache: | |||||
type: REDIS | |||||
serializerType: ProtoStuff | |||||
cacheNullVal: true | |||||
def: | |||||
keyPrefix: kq | |||||
log: | |||||
enabled: true | |||||
type: DB | |||||
# 文件存储 | |||||
file: | |||||
storage-type: ALI_OSS | |||||
ali: | |||||
protocol: https:// | |||||
bucket: devplat | |||||
urlPrefix: oss-cn-hangzhou.aliyuncs.com | |||||
endpoint: oss-cn-hangzhou.aliyuncs.com | |||||
accessKeyId: LTAI4GL7uypycnBjiRn55rMG | |||||
accessKeySecret: qwYC7bW9bkStsko7qkLVnToAzj0Y98 | |||||
# 日志文件配置 | |||||
log: | |||||
path: ./logs | |||||
info: | |||||
file-size: 50MB | |||||
max-size: 5 | |||||
total-size: 200MB | |||||
error: | |||||
file-size: 10MB | |||||
max-size: 5 | |||||
total-size: 50MB | |||||
swagger: | |||||
enabled: true | |||||
hostname: iZbp13nwyvib53j4j1p2xoZ | |||||
@@ -0,0 +1,121 @@ | |||||
server: | |||||
port: 33060 | |||||
servlet: | |||||
context-path: /kq | |||||
spring: | |||||
mvc: | |||||
pathmatch: | |||||
matching-strategy: ant_path_matcher | |||||
session: | |||||
store-type: redis | |||||
redis: | |||||
namespace: "spring:session" | |||||
timeout: 864000 | |||||
redis: | |||||
timeout: 5000 | |||||
host: 47.98.125.47 | |||||
port: 26379 | |||||
database: 7 | |||||
password: Ndkj1234 | |||||
jedis: | |||||
pool: | |||||
max-active: 200 | |||||
max-idle: 500 | |||||
min-idle: 8 | |||||
max-wait: 10000 | |||||
application: | |||||
name: kq | |||||
jackson: | |||||
default-property-inclusion: non_null | |||||
time-zone: GMT+8 | |||||
date-format: yyyy-MM-dd HH:mm:ss | |||||
jpa: | |||||
properties: | |||||
hibernate: | |||||
default_schema: PUBLIC | |||||
hbm2ddl: | |||||
auto: update | |||||
show_sql: true | |||||
show-sql: true | |||||
hibernate: | |||||
ddl-auto: update | |||||
datasource: | |||||
type: com.zaxxer.hikari.HikariDataSource | |||||
driver-class-name: com.mysql.cj.jdbc.Driver | |||||
url: jdbc:mysql://47.98.125.47:3306/kqzzsfw?serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false | |||||
username: root | |||||
password: NingdaKeji123! | |||||
# 数据源 | |||||
hikari: | |||||
# 是客户端等待连接池连接的最大毫秒数 | |||||
connection-timeout: 30000 | |||||
# 是允许连接在连接池中空闲的最长时间 | |||||
minimum-idle: 5 | |||||
# 配置最大池大小 | |||||
maximum-pool-size: 300 | |||||
# 是允许连接在连接池中空闲的最长时间(以毫秒为单位) | |||||
idle-timeout: 60000 | |||||
# 池中连接关闭后的最长生命周期(以毫秒为单位) | |||||
max-lifetime: 600000 | |||||
# 配置从池返回的连接的默认自动提交行为。默认值为true。 | |||||
auto-commit: true | |||||
# 开启连接监测泄露 | |||||
leak-detection-threshold: 5000 | |||||
# 测试连接数据库 | |||||
connection-test-query: SELECT 1 | |||||
#设置上传 单个文件的大小 | |||||
servlet: | |||||
multipart: | |||||
max-file-size: 100MB | |||||
max-request-size: 150MB | |||||
mybatis-plus: | |||||
configuration: | |||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl | |||||
global-config: | |||||
db-config: | |||||
logic-delete-value: true | |||||
logic-not-delete-value: false | |||||
logging: | |||||
config: classpath:logback-spring.xml | |||||
#日志配置 | |||||
level: | |||||
root: info | |||||
file: | |||||
path: logs | |||||
nd: | |||||
cache: | |||||
type: REDIS | |||||
serializerType: ProtoStuff | |||||
cacheNullVal: true | |||||
def: | |||||
keyPrefix: kq | |||||
log: | |||||
enabled: true | |||||
type: DB | |||||
# 文件存储 | |||||
file: | |||||
storage-type: ALI_OSS | |||||
ali: | |||||
protocol: https:// | |||||
bucket: devplat | |||||
urlPrefix: oss-cn-hangzhou.aliyuncs.com | |||||
endpoint: oss-cn-hangzhou.aliyuncs.com | |||||
accessKeyId: LTAI4GL7uypycnBjiRn55rMG | |||||
accessKeySecret: qwYC7bW9bkStsko7qkLVnToAzj0Y98 | |||||
# 日志文件配置 | |||||
log: | |||||
path: ./logs | |||||
info: | |||||
file-size: 50MB | |||||
max-size: 5 | |||||
total-size: 200MB | |||||
error: | |||||
file-size: 10MB | |||||
max-size: 5 | |||||
total-size: 50MB | |||||
swagger: | |||||
enabled: true | |||||
hostname: iZbp13nwyvib53j4j1p2xoZ |
@@ -0,0 +1,123 @@ | |||||
server: | |||||
port: 33060 | |||||
servlet: | |||||
context-path: /kq | |||||
spring: | |||||
mvc: | |||||
pathmatch: | |||||
matching-strategy: ant_path_matcher | |||||
session: | |||||
store-type: redis | |||||
redis: | |||||
namespace: "spring:session" | |||||
timeout: 864000 | |||||
redis: | |||||
timeout: 5000 | |||||
host: 47.98.125.47 | |||||
port: 26379 | |||||
database: 7 | |||||
password: Ndkj1234 | |||||
jedis: | |||||
pool: | |||||
max-active: 200 | |||||
max-idle: 500 | |||||
min-idle: 8 | |||||
max-wait: 10000 | |||||
application: | |||||
name: kq | |||||
jackson: | |||||
default-property-inclusion: non_null | |||||
time-zone: GMT+8 | |||||
date-format: yyyy-MM-dd HH:mm:ss | |||||
jpa: | |||||
properties: | |||||
hibernate: | |||||
default_schema: PUBLIC | |||||
hbm2ddl: | |||||
auto: update | |||||
show_sql: true | |||||
show-sql: true | |||||
hibernate: | |||||
ddl-auto: update | |||||
datasource: | |||||
type: com.zaxxer.hikari.HikariDataSource | |||||
driver-class-name: com.mysql.cj.jdbc.Driver | |||||
url: jdbc:mysql://47.98.125.47:3306/kqzzsfw?serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false | |||||
username: root | |||||
password: NingdaKeji123! | |||||
# 数据源 | |||||
hikari: | |||||
# 是客户端等待连接池连接的最大毫秒数 | |||||
connection-timeout: 30000 | |||||
# 是允许连接在连接池中空闲的最长时间 | |||||
minimum-idle: 5 | |||||
# 配置最大池大小 | |||||
maximum-pool-size: 300 | |||||
# 是允许连接在连接池中空闲的最长时间(以毫秒为单位) | |||||
idle-timeout: 60000 | |||||
# 池中连接关闭后的最长生命周期(以毫秒为单位) | |||||
max-lifetime: 600000 | |||||
# 配置从池返回的连接的默认自动提交行为。默认值为true。 | |||||
auto-commit: true | |||||
# 开启连接监测泄露 | |||||
leak-detection-threshold: 5000 | |||||
# 测试连接数据库 | |||||
connection-test-query: SELECT 1 | |||||
#设置上传 单个文件的大小 | |||||
servlet: | |||||
multipart: | |||||
max-file-size: 100MB | |||||
max-request-size: 150MB | |||||
mybatis-plus: | |||||
configuration: | |||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl | |||||
global-config: | |||||
db-config: | |||||
logic-delete-value: true | |||||
logic-not-delete-value: false | |||||
logging: | |||||
config: classpath:logback-spring.xml | |||||
#日志配置 | |||||
level: | |||||
root: info | |||||
file: | |||||
path: logs | |||||
nd: | |||||
cache: | |||||
type: REDIS | |||||
serializerType: ProtoStuff | |||||
cacheNullVal: true | |||||
def: | |||||
keyPrefix: kq | |||||
log: | |||||
enabled: true | |||||
type: DB | |||||
# 文件存储 | |||||
file: | |||||
storage-type: ALI_OSS | |||||
ali: | |||||
protocol: https:// | |||||
bucket: devplat | |||||
urlPrefix: oss-cn-hangzhou.aliyuncs.com | |||||
endpoint: oss-cn-hangzhou.aliyuncs.com | |||||
accessKeyId: LTAI4GL7uypycnBjiRn55rMG | |||||
accessKeySecret: qwYC7bW9bkStsko7qkLVnToAzj0Y98 | |||||
# 日志文件配置 | |||||
log: | |||||
path: ./logs | |||||
info: | |||||
file-size: 50MB | |||||
max-size: 5 | |||||
total-size: 200MB | |||||
error: | |||||
file-size: 10MB | |||||
max-size: 5 | |||||
total-size: 50MB | |||||
swagger: | |||||
enabled: true | |||||
hostname: iZbp13nwyvib53j4j1p2xoZ | |||||
@@ -0,0 +1,3 @@ | |||||
spring: | |||||
profiles: | |||||
active: dev |
@@ -0,0 +1,68 @@ | |||||
<configuration scan="true" scanPeriod="10 seconds"> | |||||
<springProperty name="logPath" scope="context" source="log.path" defaultValue="./logs"/> | |||||
<springProperty name="infoFileSize" scope="context" source="log.info.file-size"/> | |||||
<springProperty name="infoMaxSize" scope="context" source="log.info.max-size"/> | |||||
<springProperty name="infoTotalSize" scope="context" source="log.info.total-size"/> | |||||
<springProperty name="errorFileSize" scope="context" source="log.error.file-size"/> | |||||
<springProperty name="errorMaxSize" scope="context" source="log.error.max-size"/> | |||||
<springProperty name="errorTotalSize" scope="context" source="log.error.total-size"/> | |||||
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||||
<File>${logPath}/info.log</File> | |||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||||
<fileNamePattern>${logPath}/info-%d{yyyyMMdd}-%i.log</fileNamePattern> | |||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> | |||||
<maxFileSize>${infoFileSize}</maxFileSize> | |||||
</timeBasedFileNamingAndTriggeringPolicy> | |||||
<maxHistory>${infoMaxSize}</maxHistory> | |||||
<totalSizeCap>${infoTotalSize}</totalSizeCap> | |||||
</rollingPolicy> | |||||
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> | |||||
<layout class="ch.qos.logback.classic.PatternLayout"> | |||||
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n | |||||
</Pattern> | |||||
</layout> | |||||
<charset>UTF-8</charset> | |||||
</encoder> | |||||
</appender> | |||||
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||||
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> | |||||
<level>ERROR</level> | |||||
</filter> | |||||
<File>${logPath}/error.log</File> | |||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||||
<fileNamePattern>${logPath}/error-%d{yyyyMMdd}-%i.log</fileNamePattern> | |||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> | |||||
<maxFileSize>${errorFileSize}</maxFileSize> | |||||
</timeBasedFileNamingAndTriggeringPolicy> | |||||
<maxHistory>${errorMaxSize}</maxHistory> | |||||
<totalSizeCap>${errorTotalSize}</totalSizeCap> | |||||
</rollingPolicy> | |||||
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> | |||||
<layout class="ch.qos.logback.classic.PatternLayout"> | |||||
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n | |||||
</Pattern> | |||||
</layout> | |||||
<charset>UTF-8</charset> | |||||
</encoder> | |||||
</appender> | |||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> | |||||
<encoder> | |||||
<pattern> | |||||
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n | |||||
</pattern> | |||||
<charset>UTF-8</charset> | |||||
</encoder> | |||||
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> | |||||
<level>DEBUG</level> | |||||
</filter> | |||||
</appender> | |||||
<root level="INFO"> | |||||
<appender-ref ref="INFO_FILE"/> | |||||
<appender-ref ref="ERROR_FILE"/> | |||||
<appender-ref ref="STDOUT"/> | |||||
</root> | |||||
</configuration> |
@@ -0,0 +1,741 @@ | |||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> | |||||
<?mso-application progid="Word.Document"?> | |||||
<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" | |||||
xmlns:w10="urn:schemas-microsoft-com:office:word" | |||||
xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" | |||||
xmlns:aml="http://schemas.microsoft.com/aml/2001/core" | |||||
xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" | |||||
xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" | |||||
w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve" | |||||
xmlns:wpsCustomData="http://www.wps.cn/officeDocument/2013/wpsCustomData"> | |||||
<w:fonts> | |||||
<w:defaultFonts w:ascii="Arial" w:fareast="Arial" w:h-ansi="Arial" w:cs="Arial"/> | |||||
<w:font w:name="Times New Roman"> | |||||
<w:panose-1 w:val="02020603050405020304"/> | |||||
<w:charset w:val="00"/> | |||||
<w:family w:val="Auto"/> | |||||
<w:pitch w:val="Default"/> | |||||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000000" | |||||
w:csb-1="00000000"/> | |||||
</w:font> | |||||
<w:font w:name="宋体"> | |||||
<w:altName w:val="汉仪书宋二KW"/> | |||||
<w:panose-1 w:val="00000000000000000000"/> | |||||
<w:charset w:val="86"/> | |||||
<w:family w:val="Auto"/> | |||||
<w:pitch w:val="Default"/> | |||||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000000" | |||||
w:csb-1="00000000"/> | |||||
</w:font> | |||||
<w:font w:name="Wingdings"> | |||||
<w:panose-1 w:val="05000000000000000000"/> | |||||
<w:charset w:val="02"/> | |||||
<w:family w:val="Auto"/> | |||||
<w:pitch w:val="Default"/> | |||||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000000" | |||||
w:csb-1="00000000"/> | |||||
</w:font> | |||||
<w:font w:name="Arial"> | |||||
<w:panose-1 w:val="020B0604020202020204"/> | |||||
<w:charset w:val="01"/> | |||||
<w:family w:val="SWiss"/> | |||||
<w:pitch w:val="Default"/> | |||||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000000" | |||||
w:csb-1="00000000"/> | |||||
</w:font> | |||||
<w:font w:name="黑体"> | |||||
<w:altName w:val="汉仪中黑KW"/> | |||||
<w:panose-1 w:val="02010609060101010101"/> | |||||
<w:charset w:val="86"/> | |||||
<w:family w:val="Auto"/> | |||||
<w:pitch w:val="Default"/> | |||||
<w:sig w:usb-0="800002BF" w:usb-1="38CF7CFA" w:usb-2="00000016" w:usb-3="00000000" w:csb-0="00040001" | |||||
w:csb-1="00000000"/> | |||||
</w:font> | |||||
<w:font w:name="Courier New"> | |||||
<w:panose-1 w:val="02070309020205020404"/> | |||||
<w:charset w:val="01"/> | |||||
<w:family w:val="Modern"/> | |||||
<w:pitch w:val="Default"/> | |||||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000000" | |||||
w:csb-1="00000000"/> | |||||
</w:font> | |||||
<w:font w:name="Symbol"> | |||||
<w:altName w:val="Kingsoft Sign"/> | |||||
<w:panose-1 w:val="05050102010706020507"/> | |||||
<w:charset w:val="02"/> | |||||
<w:family w:val="Roman"/> | |||||
<w:pitch w:val="Default"/> | |||||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="80000000" | |||||
w:csb-1="00000000"/> | |||||
</w:font> | |||||
<w:font w:name="Calibri"> | |||||
<w:altName w:val="Helvetica Neue"/> | |||||
<w:panose-1 w:val="020F0502020204030204"/> | |||||
<w:charset w:val="00"/> | |||||
<w:family w:val="SWiss"/> | |||||
<w:pitch w:val="Default"/> | |||||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000001" w:usb-3="00000000" w:csb-0="0000019F" | |||||
w:csb-1="00000000"/> | |||||
</w:font> | |||||
<w:font w:name="Helvetica Neue"> | |||||
<w:panose-1 w:val="02000503000000020004"/> | |||||
<w:charset w:val="00"/> | |||||
<w:family w:val="Auto"/> | |||||
<w:pitch w:val="Default"/> | |||||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000000" | |||||
w:csb-1="00000000"/> | |||||
</w:font> | |||||
<w:font w:name="汉仪书宋二KW"> | |||||
<w:panose-1 w:val="00020600040101010101"/> | |||||
<w:charset w:val="86"/> | |||||
<w:family w:val="Auto"/> | |||||
<w:pitch w:val="Default"/> | |||||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00160000" | |||||
w:csb-1="00000000"/> | |||||
</w:font> | |||||
<w:font w:name="微软雅黑"> | |||||
<w:altName w:val="汉仪旗黑"/> | |||||
<w:panose-1 w:val="00000000000000000000"/> | |||||
<w:charset w:val="00"/> | |||||
<w:family w:val="Auto"/> | |||||
<w:pitch w:val="Default"/> | |||||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000000" | |||||
w:csb-1="00000000"/> | |||||
</w:font> | |||||
<w:font w:name="汉仪旗黑"> | |||||
<w:panose-1 w:val="00020600040101010101"/> | |||||
<w:charset w:val="86"/> | |||||
<w:family w:val="Auto"/> | |||||
<w:pitch w:val="Default"/> | |||||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00060000" | |||||
w:csb-1="00000000"/> | |||||
</w:font> | |||||
<w:font w:name="汉仪中黑KW"> | |||||
<w:panose-1 w:val="00020600040101010101"/> | |||||
<w:charset w:val="86"/> | |||||
<w:family w:val="Auto"/> | |||||
<w:pitch w:val="Default"/> | |||||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00160000" | |||||
w:csb-1="00000000"/> | |||||
</w:font> | |||||
<w:font w:name="Kingsoft Sign"> | |||||
<w:panose-1 w:val="05050102010706020507"/> | |||||
<w:charset w:val="00"/> | |||||
<w:family w:val="Auto"/> | |||||
<w:pitch w:val="Default"/> | |||||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000000" | |||||
w:csb-1="00000000"/> | |||||
</w:font> | |||||
</w:fonts> | |||||
<w:styles> | |||||
<w:latentStyles w:defLockedState="off" w:latentStyleCount="260"> | |||||
<w:lsdException w:name="Normal"/> | |||||
<w:lsdException w:name="heading 1"/> | |||||
<w:lsdException w:name="heading 2"/> | |||||
<w:lsdException w:name="heading 3"/> | |||||
<w:lsdException w:name="heading 4"/> | |||||
<w:lsdException w:name="heading 5"/> | |||||
<w:lsdException w:name="heading 6"/> | |||||
<w:lsdException w:name="heading 7"/> | |||||
<w:lsdException w:name="heading 8"/> | |||||
<w:lsdException w:name="heading 9"/> | |||||
<w:lsdException w:name="index 1"/> | |||||
<w:lsdException w:name="index 2"/> | |||||
<w:lsdException w:name="index 3"/> | |||||
<w:lsdException w:name="index 4"/> | |||||
<w:lsdException w:name="index 5"/> | |||||
<w:lsdException w:name="index 6"/> | |||||
<w:lsdException w:name="index 7"/> | |||||
<w:lsdException w:name="index 8"/> | |||||
<w:lsdException w:name="index 9"/> | |||||
<w:lsdException w:name="toc 1"/> | |||||
<w:lsdException w:name="toc 2"/> | |||||
<w:lsdException w:name="toc 3"/> | |||||
<w:lsdException w:name="toc 4"/> | |||||
<w:lsdException w:name="toc 5"/> | |||||
<w:lsdException w:name="toc 6"/> | |||||
<w:lsdException w:name="toc 7"/> | |||||
<w:lsdException w:name="toc 8"/> | |||||
<w:lsdException w:name="toc 9"/> | |||||
<w:lsdException w:name="Normal Indent"/> | |||||
<w:lsdException w:name="footnote text"/> | |||||
<w:lsdException w:name="annotation text"/> | |||||
<w:lsdException w:name="header"/> | |||||
<w:lsdException w:name="footer"/> | |||||
<w:lsdException w:name="index heading"/> | |||||
<w:lsdException w:name="caption"/> | |||||
<w:lsdException w:name="table of figures"/> | |||||
<w:lsdException w:name="envelope address"/> | |||||
<w:lsdException w:name="envelope return"/> | |||||
<w:lsdException w:name="footnote reference"/> | |||||
<w:lsdException w:name="annotation reference"/> | |||||
<w:lsdException w:name="line number"/> | |||||
<w:lsdException w:name="page number"/> | |||||
<w:lsdException w:name="endnote reference"/> | |||||
<w:lsdException w:name="endnote text"/> | |||||
<w:lsdException w:name="table of authorities"/> | |||||
<w:lsdException w:name="macro"/> | |||||
<w:lsdException w:name="toa heading"/> | |||||
<w:lsdException w:name="List"/> | |||||
<w:lsdException w:name="List Bullet"/> | |||||
<w:lsdException w:name="List Number"/> | |||||
<w:lsdException w:name="List 2"/> | |||||
<w:lsdException w:name="List 3"/> | |||||
<w:lsdException w:name="List 4"/> | |||||
<w:lsdException w:name="List 5"/> | |||||
<w:lsdException w:name="List Bullet 2"/> | |||||
<w:lsdException w:name="List Bullet 3"/> | |||||
<w:lsdException w:name="List Bullet 4"/> | |||||
<w:lsdException w:name="List Bullet 5"/> | |||||
<w:lsdException w:name="List Number 2"/> | |||||
<w:lsdException w:name="List Number 3"/> | |||||
<w:lsdException w:name="List Number 4"/> | |||||
<w:lsdException w:name="List Number 5"/> | |||||
<w:lsdException w:name="Title"/> | |||||
<w:lsdException w:name="Closing"/> | |||||
<w:lsdException w:name="Signature"/> | |||||
<w:lsdException w:name="Default Paragraph Font"/> | |||||
<w:lsdException w:name="Body Text"/> | |||||
<w:lsdException w:name="Body Text Indent"/> | |||||
<w:lsdException w:name="List Continue"/> | |||||
<w:lsdException w:name="List Continue 2"/> | |||||
<w:lsdException w:name="List Continue 3"/> | |||||
<w:lsdException w:name="List Continue 4"/> | |||||
<w:lsdException w:name="List Continue 5"/> | |||||
<w:lsdException w:name="Message Header"/> | |||||
<w:lsdException w:name="Subtitle"/> | |||||
<w:lsdException w:name="Salutation"/> | |||||
<w:lsdException w:name="Date"/> | |||||
<w:lsdException w:name="Body Text First Indent"/> | |||||
<w:lsdException w:name="Body Text First Indent 2"/> | |||||
<w:lsdException w:name="Note Heading"/> | |||||
<w:lsdException w:name="Body Text 2"/> | |||||
<w:lsdException w:name="Body Text 3"/> | |||||
<w:lsdException w:name="Body Text Indent 2"/> | |||||
<w:lsdException w:name="Body Text Indent 3"/> | |||||
<w:lsdException w:name="Block Text"/> | |||||
<w:lsdException w:name="Hyperlink"/> | |||||
<w:lsdException w:name="FollowedHyperlink"/> | |||||
<w:lsdException w:name="Strong"/> | |||||
<w:lsdException w:name="Emphasis"/> | |||||
<w:lsdException w:name="Document Map"/> | |||||
<w:lsdException w:name="Plain Text"/> | |||||
<w:lsdException w:name="E-mail Signature"/> | |||||
<w:lsdException w:name="Normal (Web)"/> | |||||
<w:lsdException w:name="HTML Acronym"/> | |||||
<w:lsdException w:name="HTML Address"/> | |||||
<w:lsdException w:name="HTML Cite"/> | |||||
<w:lsdException w:name="HTML Code"/> | |||||
<w:lsdException w:name="HTML Definition"/> | |||||
<w:lsdException w:name="HTML Keyboard"/> | |||||
<w:lsdException w:name="HTML Preformatted"/> | |||||
<w:lsdException w:name="HTML Sample"/> | |||||
<w:lsdException w:name="HTML Typewriter"/> | |||||
<w:lsdException w:name="HTML Variable"/> | |||||
<w:lsdException w:name="Normal Table"/> | |||||
<w:lsdException w:name="annotation subject"/> | |||||
<w:lsdException w:name="Table Simple 1"/> | |||||
<w:lsdException w:name="Table Simple 2"/> | |||||
<w:lsdException w:name="Table Simple 3"/> | |||||
<w:lsdException w:name="Table Classic 1"/> | |||||
<w:lsdException w:name="Table Classic 2"/> | |||||
<w:lsdException w:name="Table Classic 3"/> | |||||
<w:lsdException w:name="Table Classic 4"/> | |||||
<w:lsdException w:name="Table Colorful 1"/> | |||||
<w:lsdException w:name="Table Colorful 2"/> | |||||
<w:lsdException w:name="Table Colorful 3"/> | |||||
<w:lsdException w:name="Table Columns 1"/> | |||||
<w:lsdException w:name="Table Columns 2"/> | |||||
<w:lsdException w:name="Table Columns 3"/> | |||||
<w:lsdException w:name="Table Columns 4"/> | |||||
<w:lsdException w:name="Table Columns 5"/> | |||||
<w:lsdException w:name="Table Grid 1"/> | |||||
<w:lsdException w:name="Table Grid 2"/> | |||||
<w:lsdException w:name="Table Grid 3"/> | |||||
<w:lsdException w:name="Table Grid 4"/> | |||||
<w:lsdException w:name="Table Grid 5"/> | |||||
<w:lsdException w:name="Table Grid 6"/> | |||||
<w:lsdException w:name="Table Grid 7"/> | |||||
<w:lsdException w:name="Table Grid 8"/> | |||||
<w:lsdException w:name="Table List 1"/> | |||||
<w:lsdException w:name="Table List 2"/> | |||||
<w:lsdException w:name="Table List 3"/> | |||||
<w:lsdException w:name="Table List 4"/> | |||||
<w:lsdException w:name="Table List 5"/> | |||||
<w:lsdException w:name="Table List 6"/> | |||||
<w:lsdException w:name="Table List 7"/> | |||||
<w:lsdException w:name="Table List 8"/> | |||||
<w:lsdException w:name="Table 3D effects 1"/> | |||||
<w:lsdException w:name="Table 3D effects 2"/> | |||||
<w:lsdException w:name="Table 3D effects 3"/> | |||||
<w:lsdException w:name="Table Contemporary"/> | |||||
<w:lsdException w:name="Table Elegant"/> | |||||
<w:lsdException w:name="Table Professional"/> | |||||
<w:lsdException w:name="Table Subtle 1"/> | |||||
<w:lsdException w:name="Table Subtle 2"/> | |||||
<w:lsdException w:name="Table Web 1"/> | |||||
<w:lsdException w:name="Table Web 2"/> | |||||
<w:lsdException w:name="Table Web 3"/> | |||||
<w:lsdException w:name="Balloon Text"/> | |||||
<w:lsdException w:name="Table Grid"/> | |||||
<w:lsdException w:name="Table Theme"/> | |||||
<w:lsdException w:name="Light Shading"/> | |||||
<w:lsdException w:name="Light List"/> | |||||
<w:lsdException w:name="Light Grid"/> | |||||
<w:lsdException w:name="Medium Shading 1"/> | |||||
<w:lsdException w:name="Medium Shading 2"/> | |||||
<w:lsdException w:name="Medium List 1"/> | |||||
<w:lsdException w:name="Medium List 2"/> | |||||
<w:lsdException w:name="Medium Grid 1"/> | |||||
<w:lsdException w:name="Medium Grid 2"/> | |||||
<w:lsdException w:name="Medium Grid 3"/> | |||||
<w:lsdException w:name="Dark List"/> | |||||
<w:lsdException w:name="Colorful Shading"/> | |||||
<w:lsdException w:name="Colorful List"/> | |||||
<w:lsdException w:name="Colorful Grid"/> | |||||
<w:lsdException w:name="Light Shading Accent 1"/> | |||||
<w:lsdException w:name="Light List Accent 1"/> | |||||
<w:lsdException w:name="Light Grid Accent 1"/> | |||||
<w:lsdException w:name="Medium Shading 1 Accent 1"/> | |||||
<w:lsdException w:name="Medium Shading 2 Accent 1"/> | |||||
<w:lsdException w:name="Medium List 1 Accent 1"/> | |||||
<w:lsdException w:name="Medium List 2 Accent 1"/> | |||||
<w:lsdException w:name="Medium Grid 1 Accent 1"/> | |||||
<w:lsdException w:name="Medium Grid 2 Accent 1"/> | |||||
<w:lsdException w:name="Medium Grid 3 Accent 1"/> | |||||
<w:lsdException w:name="Dark List Accent 1"/> | |||||
<w:lsdException w:name="Colorful Shading Accent 1"/> | |||||
<w:lsdException w:name="Colorful List Accent 1"/> | |||||
<w:lsdException w:name="Colorful Grid Accent 1"/> | |||||
<w:lsdException w:name="Light Shading Accent 2"/> | |||||
<w:lsdException w:name="Light List Accent 2"/> | |||||
<w:lsdException w:name="Light Grid Accent 2"/> | |||||
<w:lsdException w:name="Medium Shading 1 Accent 2"/> | |||||
<w:lsdException w:name="Medium Shading 2 Accent 2"/> | |||||
<w:lsdException w:name="Medium List 1 Accent 2"/> | |||||
<w:lsdException w:name="Medium List 2 Accent 2"/> | |||||
<w:lsdException w:name="Medium Grid 1 Accent 2"/> | |||||
<w:lsdException w:name="Medium Grid 2 Accent 2"/> | |||||
<w:lsdException w:name="Medium Grid 3 Accent 2"/> | |||||
<w:lsdException w:name="Dark List Accent 2"/> | |||||
<w:lsdException w:name="Colorful Shading Accent 2"/> | |||||
<w:lsdException w:name="Colorful List Accent 2"/> | |||||
<w:lsdException w:name="Colorful Grid Accent 2"/> | |||||
<w:lsdException w:name="Light Shading Accent 3"/> | |||||
<w:lsdException w:name="Light List Accent 3"/> | |||||
<w:lsdException w:name="Light Grid Accent 3"/> | |||||
<w:lsdException w:name="Medium Shading 1 Accent 3"/> | |||||
<w:lsdException w:name="Medium Shading 2 Accent 3"/> | |||||
<w:lsdException w:name="Medium List 1 Accent 3"/> | |||||
<w:lsdException w:name="Medium List 2 Accent 3"/> | |||||
<w:lsdException w:name="Medium Grid 1 Accent 3"/> | |||||
<w:lsdException w:name="Medium Grid 2 Accent 3"/> | |||||
<w:lsdException w:name="Medium Grid 3 Accent 3"/> | |||||
<w:lsdException w:name="Dark List Accent 3"/> | |||||
<w:lsdException w:name="Colorful Shading Accent 3"/> | |||||
<w:lsdException w:name="Colorful List Accent 3"/> | |||||
<w:lsdException w:name="Colorful Grid Accent 3"/> | |||||
<w:lsdException w:name="Light Shading Accent 4"/> | |||||
<w:lsdException w:name="Light List Accent 4"/> | |||||
<w:lsdException w:name="Light Grid Accent 4"/> | |||||
<w:lsdException w:name="Medium Shading 1 Accent 4"/> | |||||
<w:lsdException w:name="Medium Shading 2 Accent 4"/> | |||||
<w:lsdException w:name="Medium List 1 Accent 4"/> | |||||
<w:lsdException w:name="Medium List 2 Accent 4"/> | |||||
<w:lsdException w:name="Medium Grid 1 Accent 4"/> | |||||
<w:lsdException w:name="Medium Grid 2 Accent 4"/> | |||||
<w:lsdException w:name="Medium Grid 3 Accent 4"/> | |||||
<w:lsdException w:name="Dark List Accent 4"/> | |||||
<w:lsdException w:name="Colorful Shading Accent 4"/> | |||||
<w:lsdException w:name="Colorful List Accent 4"/> | |||||
<w:lsdException w:name="Colorful Grid Accent 4"/> | |||||
<w:lsdException w:name="Light Shading Accent 5"/> | |||||
<w:lsdException w:name="Light List Accent 5"/> | |||||
<w:lsdException w:name="Light Grid Accent 5"/> | |||||
<w:lsdException w:name="Medium Shading 1 Accent 5"/> | |||||
<w:lsdException w:name="Medium Shading 2 Accent 5"/> | |||||
<w:lsdException w:name="Medium List 1 Accent 5"/> | |||||
<w:lsdException w:name="Medium List 2 Accent 5"/> | |||||
<w:lsdException w:name="Medium Grid 1 Accent 5"/> | |||||
<w:lsdException w:name="Medium Grid 2 Accent 5"/> | |||||
<w:lsdException w:name="Medium Grid 3 Accent 5"/> | |||||
<w:lsdException w:name="Dark List Accent 5"/> | |||||
<w:lsdException w:name="Colorful Shading Accent 5"/> | |||||
<w:lsdException w:name="Colorful List Accent 5"/> | |||||
<w:lsdException w:name="Colorful Grid Accent 5"/> | |||||
<w:lsdException w:name="Light Shading Accent 6"/> | |||||
<w:lsdException w:name="Light List Accent 6"/> | |||||
<w:lsdException w:name="Light Grid Accent 6"/> | |||||
<w:lsdException w:name="Medium Shading 1 Accent 6"/> | |||||
<w:lsdException w:name="Medium Shading 2 Accent 6"/> | |||||
<w:lsdException w:name="Medium List 1 Accent 6"/> | |||||
<w:lsdException w:name="Medium List 2 Accent 6"/> | |||||
<w:lsdException w:name="Medium Grid 1 Accent 6"/> | |||||
<w:lsdException w:name="Medium Grid 2 Accent 6"/> | |||||
<w:lsdException w:name="Medium Grid 3 Accent 6"/> | |||||
<w:lsdException w:name="Dark List Accent 6"/> | |||||
<w:lsdException w:name="Colorful Shading Accent 6"/> | |||||
<w:lsdException w:name="Colorful List Accent 6"/> | |||||
<w:lsdException w:name="Colorful Grid Accent 6"/> | |||||
</w:latentStyles> | |||||
<w:style w:type="paragraph" w:styleId="a1" w:default="on"> | |||||
<w:name w:val="Normal"/> | |||||
<w:semiHidden/> | |||||
<w:pPr> | |||||
<w:kinsoku w:val="off"/> | |||||
<w:autoSpaceDE w:val="off"/> | |||||
<w:autoSpaceDN w:val="off"/> | |||||
<w:adjustRightInd w:val="off"/> | |||||
<w:snapToGrid w:val="off"/> | |||||
<w:spacing w:line="240" w:line-rule="auto"/> | |||||
<w:jc w:val="left"/> | |||||
<w:textAlignment w:val="baseline"/> | |||||
</w:pPr> | |||||
<w:rPr> | |||||
<w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:fareast="Arial" w:cs="Arial" w:hint="default"/> | |||||
<w:snapToGrid w:val="off"/> | |||||
<w:color w:val="000000"/> | |||||
<w:kern w:val="0"/> | |||||
<w:sz w:val="21"/> | |||||
<w:sz-cs w:val="21"/> | |||||
<w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/> | |||||
</w:rPr> | |||||
</w:style> | |||||
<w:style w:type="character" w:styleId="a4" w:default="on"> | |||||
<w:name w:val="Default Paragraph Font"/> | |||||
<w:semiHidden/> | |||||
</w:style> | |||||
<w:style w:type="table" w:styleId="a3" w:default="on"> | |||||
<w:name w:val="Normal Table"/> | |||||
<w:semiHidden/> | |||||
<w:tblPr> | |||||
<w:tblCellMar> | |||||
<w:top w:w="0" w:type="dxa"/> | |||||
<w:left w:w="108" w:type="dxa"/> | |||||
<w:bottom w:w="0" w:type="dxa"/> | |||||
<w:right w:w="108" w:type="dxa"/> | |||||
</w:tblCellMar> | |||||
</w:tblPr> | |||||
</w:style> | |||||
<w:style w:type="paragraph" w:styleId="a2"> | |||||
<w:name w:val="Body Text"/> | |||||
<w:basedOn w:val="a1"/> | |||||
<w:semiHidden/> | |||||
<w:rPr> | |||||
<w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:fareast="Arial" w:cs="Arial" w:hint="default"/> | |||||
<w:sz w:val="21"/> | |||||
<w:sz-cs w:val="21"/> | |||||
<w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/> | |||||
</w:rPr> | |||||
</w:style> | |||||
<w:style w:type="table" w:styleId="a5"> | |||||
<w:name w:val="Table Normal"/> | |||||
<w:semiHidden/> | |||||
<w:tblPr> | |||||
<w:tblCellMar> | |||||
<w:top w:w="0" w:type="dxa"/> | |||||
<w:left w:w="0" w:type="dxa"/> | |||||
<w:bottom w:w="0" w:type="dxa"/> | |||||
<w:right w:w="0" w:type="dxa"/> | |||||
</w:tblCellMar> | |||||
</w:tblPr> | |||||
</w:style> | |||||
</w:styles> | |||||
<w:bgPict> | |||||
<w:background/> | |||||
<v:background id="_x0000_s1025"> | |||||
<v:fill on="f" focussize="0,0"/> | |||||
</v:background> | |||||
</w:bgPict> | |||||
<w:docPr> | |||||
<w:view w:val="print"/> | |||||
<w:zoom w:percent="170"/> | |||||
<w:characterSpacingControl w:val="DontCompress"/> | |||||
<w:documentProtection w:enforcement="off"/> | |||||
<w:displayBackgroundShape w:val="1"/> | |||||
<w:punctuationKerning/> | |||||
<w:doNotEmbedSystemFonts/> | |||||
<w:bordersDontSurroundHeader/> | |||||
<w:bordersDontSurroundFooter/> | |||||
<w:defaultTabStop w:val="500"/> | |||||
<w:displayHorizontalDrawingGridEvery w:val="1"/> | |||||
<w:displayVerticalDrawingGridEvery w:val="1"/> | |||||
<w:compat> | |||||
<w:ulTrailSpace/> | |||||
<w:useFELayout/> | |||||
<w:spaceForUL/> | |||||
<w:wrapTextWithPunct/> | |||||
<w:breakWrappedTables/> | |||||
<w:useAsianBreakRules/> | |||||
<w:dontGrowAutofit/> | |||||
<w:useFELayout/> | |||||
</w:compat> | |||||
</w:docPr> | |||||
<w:body> | |||||
<wx:sect> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="279" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="279" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:spacing w:before="193" w:line="176" w:line-rule="auto"/> | |||||
<w:jc w:val="center"/> | |||||
<w:outlineLvl w:val="0"/> | |||||
<w:rPr> | |||||
<w:rFonts w:fareast="微软雅黑" w:hint="default"/> | |||||
<w:lang w:val="EN-US"/> | |||||
</w:rPr> | |||||
</w:pPr> | |||||
<w:r> | |||||
<w:rPr> | |||||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||||
w:hint="default"/> | |||||
<w:spacing w:val="-4"/> | |||||
<w:sz w:val="45"/> | |||||
<w:sz-cs w:val="45"/> | |||||
</w:rPr> | |||||
<w:t>${projectName}</w:t> | |||||
</w:r> | |||||
<w:r> | |||||
<w:rPr> | |||||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||||
w:hint="fareast"/> | |||||
<w:spacing w:val="-4"/> | |||||
<w:sz w:val="45"/> | |||||
<w:sz-cs w:val="45"/> | |||||
<w:lang w:val="EN-US"/> | |||||
</w:rPr> | |||||
<w:t>专家评审意见</w:t> | |||||
</w:r> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="257" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="257" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="257" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:ind w:first-line="500" w:first-line-chars="0"/> | |||||
<w:rPr> | |||||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||||
w:hint="fareast"/> | |||||
<w:sz w:val="30"/> | |||||
<w:sz-cs w:val="30"/> | |||||
</w:rPr> | |||||
</w:pPr> | |||||
<w:r> | |||||
<w:rPr> | |||||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||||
w:hint="fareast"/> | |||||
<w:sz w:val="30"/> | |||||
<w:sz-cs w:val="30"/> | |||||
</w:rPr> | |||||
<w:t>${meetingTime},${holdOrg}组织专家在${meetingAddress}对${projectName} | |||||
进行评审。专家组认真听取了项目业主方、建设方的情况汇报,审阅了项目材料,实地查看了设备及平台演示,专家组织质询、讨论后提出以下意见: | |||||
</w:t> | |||||
</w:r> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="257" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:ind w:first-line="500" w:first-line-chars="0"/> | |||||
<w:rPr> | |||||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||||
w:hint="fareast"/> | |||||
<w:sz w:val="30"/> | |||||
<w:sz-cs w:val="30"/> | |||||
</w:rPr> | |||||
</w:pPr> | |||||
<w:r> | |||||
<w:rPr> | |||||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||||
w:hint="fareast"/> | |||||
<w:sz w:val="30"/> | |||||
<w:sz-cs w:val="30"/> | |||||
</w:rPr> | |||||
<w:t>${(reviewResult)!}</w:t> | |||||
</w:r> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="244" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="244" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="244" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="244" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="244" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="244" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="244" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="244" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="244" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="244" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="244" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="244" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="244" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="244" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="245" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:pStyle w:val="a2"/> | |||||
<w:spacing w:line="245" w:line-rule="auto"/> | |||||
</w:pPr> | |||||
</w:p> | |||||
<w:p> | |||||
<w:pPr> | |||||
<w:spacing w:before="129" w:line="175" w:line-rule="auto"/> | |||||
<w:rPr> | |||||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||||
w:hint="default"/> | |||||
<w:sz w:val="30"/> | |||||
<w:sz-cs w:val="30"/> | |||||
</w:rPr> | |||||
</w:pPr> | |||||
<w:r> | |||||
<w:rPr> | |||||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||||
w:hint="default"/> | |||||
<w:spacing w:val="-8"/> | |||||
<w:sz w:val="30"/> | |||||
<w:sz-cs w:val="30"/> | |||||
</w:rPr> | |||||
<w:t>专家组</w:t> | |||||
</w:r> | |||||
<w:r> | |||||
<w:rPr> | |||||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||||
w:hint="default"/> | |||||
<w:spacing w:val="-61"/> | |||||
<w:sz w:val="30"/> | |||||
<w:sz-cs w:val="30"/> | |||||
</w:rPr> | |||||
<w:t></w:t> | |||||
</w:r> | |||||
<w:r> | |||||
<w:rPr> | |||||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||||
w:hint="default"/> | |||||
<w:spacing w:val="-8"/> | |||||
<w:sz w:val="30"/> | |||||
<w:sz-cs w:val="30"/> | |||||
</w:rPr> | |||||
<w:t>(签名</w:t> | |||||
</w:r> | |||||
<w:r> | |||||
<w:rPr> | |||||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||||
w:hint="default"/> | |||||
<w:spacing w:val="-14"/> | |||||
<w:sz w:val="30"/> | |||||
<w:sz-cs w:val="30"/> | |||||
</w:rPr> | |||||
<w:t>):</w:t> | |||||
</w:r> | |||||
</w:p> | |||||
<w:sectPr> | |||||
<w:pgSz w:w="11900" w:h="16839"/> | |||||
<w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="0" w:footer="0" | |||||
w:gutter="0"/> | |||||
<w:cols w:space="720"/> | |||||
</w:sectPr> | |||||
</wx:sect> | |||||
</w:body></w:wordDocument> |
@@ -0,0 +1,294 @@ | |||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | |||||
<html | |||||
xmlns="http://www.w3.org/1999/xhtml" | |||||
xmlns:font-family="http://www.w3.org/1999/xhtml" | |||||
> | |||||
<head> | |||||
<meta charset="UTF-8" /> | |||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |||||
<title>Document</title> | |||||
<style> | |||||
html, | |||||
body,p { | |||||
padding: 0; | |||||
margin: 0; | |||||
font-family: SimSun; | |||||
} | |||||
.pdf { | |||||
margin: 0 auto; | |||||
padding: 10px 0 30px; | |||||
text-align: center; | |||||
} | |||||
.title { | |||||
padding: 0 0 20px 0; | |||||
font-size: 34px; | |||||
margin: 0; | |||||
font-family: SimSun; | |||||
word-break: break-all; | |||||
height: 80px; | |||||
} | |||||
.tit { | |||||
word-break: break-all; | |||||
} | |||||
.tab { | |||||
padding: 0 20px; | |||||
} | |||||
.projectId { | |||||
color: #999999; | |||||
text-align: left; | |||||
margin-bottom: 8px; | |||||
margin-top: 0; | |||||
} | |||||
.projectId > .time { | |||||
float: right; | |||||
} | |||||
table { | |||||
width: 100%; | |||||
border-collapse: collapse; | |||||
font-size: 16px; | |||||
table-layout: fixed; | |||||
word-break: break-all; | |||||
word-wrap: break-word; | |||||
text-align: left; | |||||
} | |||||
td { | |||||
padding: 15px 8px; | |||||
border: 1px solid; | |||||
} | |||||
.tabTit { | |||||
background-color: #eee; | |||||
} | |||||
.label { | |||||
width: 150px; | |||||
} | |||||
.sealTd { | |||||
height: 200px; | |||||
position: relative; | |||||
} | |||||
.seal { | |||||
position: absolute; | |||||
right: 20px; | |||||
bottom: 30px; | |||||
width: 150px; | |||||
} | |||||
.seal > .time { | |||||
text-align: right; | |||||
} | |||||
.content { | |||||
height: 210px; | |||||
} | |||||
.textDiv{ | |||||
display: flex; | |||||
align-items: center; | |||||
height: 100%; | |||||
position: relative; | |||||
} | |||||
.textDiv > .right { | |||||
position: absolute; | |||||
bottom: 4px; | |||||
right: 4px; | |||||
} | |||||
.h-80{ | |||||
height: 80px; | |||||
} | |||||
.h-100{ | |||||
height: 100px; | |||||
} | |||||
.h-400{ | |||||
height: 400px; | |||||
} | |||||
.h-1200{ | |||||
height: 1200px; | |||||
} | |||||
</style> | |||||
</head> | |||||
<body> | |||||
<div class="pdf"> | |||||
<p class="title"> | |||||
<span class="tit">#title#</span> | |||||
</p> | |||||
<div class="tab"> | |||||
<p class="projectId"> | |||||
<span> | |||||
项目编号: | |||||
<span>#projectCode#</span> | |||||
</span> | |||||
<span class="time">#time#</span> | |||||
</p> | |||||
<table> | |||||
<tbody> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">项目基本信息</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">项目名称</td> | |||||
<td colspan="3" align="center">#projectName#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">是否临时增补</td> | |||||
<td align="center">#isTemporaryAugment#</td> | |||||
<td class="label">是否一地创新全省共享项目</td> | |||||
<td align="center">#isInnovateWholeProvinceShare#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">项目负责人</td> | |||||
<td align="center">#responsibleMan#</td> | |||||
<td class="label">负责人手机号</td> | |||||
<td align="center">#responsibleManMobile#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">项目联系人</td> | |||||
<td align="center">#contactName#</td> | |||||
<td class="label">项目联系人手机号</td> | |||||
<td align="center">#contactPhone#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">建设单位</td> | |||||
<td align="center">#buildOrgName#</td> | |||||
<td class="label">建设单位统一社会信用代码</td> | |||||
<td align="center">#orgCreditCode#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">项目类型</td> | |||||
<td align="center">#projectType#</td> | |||||
<td class="label">是否首次新建</td> | |||||
<td align="center">#isFirst#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">预算年度</td> | |||||
<td align="center">#projectYear#</td> | |||||
<td class="label">建设起止时间</td> | |||||
<td align="center">#beginAndEndTime#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">四大体系</td> | |||||
<td colspan="3" align="center">#fourSystems#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">是否数字化改革项目</td> | |||||
<td align="center">#isDigitalReform#</td> | |||||
<td class="label">综合业务领域</td> | |||||
<td align="center">#bizDomain#</td> | |||||
</tr> | |||||
<tr class="h-400"> | |||||
<td class="label">立项依据</td> | |||||
<td colspan="3" align="center">#buildBasisList#</td> | |||||
</tr> | |||||
<tr class="h-100"> | |||||
<td class="label">是否上云</td> | |||||
<td align="center">#isCloud#</td> | |||||
<td class="label">云类型</td> | |||||
<td align="center">#cloudType#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">项目简介</td> | |||||
<td colspan="3" align="center"> | |||||
<p class="h-1200">#projectIntroduction#</p> | |||||
</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">资金申报情况</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">申报金额</td> | |||||
<td colspan="3" align="center">#declareAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">自有资金</td> | |||||
<td align="center">#declareHaveAmount#</td> | |||||
<td class="label">政府投资-本级财政资金</td> | |||||
<td align="center">#declareGovOwnFinanceAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">政府投资-上级补助资金</td> | |||||
<td align="center">#declareGovSuperiorFinanceAmount#</td> | |||||
<td class="label">银行贷款</td> | |||||
<td align="center">#declareBankLendingAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">其他资金</td> | |||||
<td colspan="3" align="center">#declareOtherAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">本年计划投资(万元)</td> | |||||
<td colspan="3" align="center">#yearPlanInvest#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">资金分配情况</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">软件开发</td> | |||||
<td align="center">#softwareDevelopmentAmount#</td> | |||||
<td class="label">云资源、硬件购置</td> | |||||
<td align="center">#cloudHardwarePurchaseAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">第三方服务</td> | |||||
<td colspan="3" align="center">#thirdPartyAmount#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">年度支付计划</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">年度支付金额</td> | |||||
<td colspan="3" align="center">#annualPlanAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">自有资金</td> | |||||
<td align="center">#annualPlanHaveAmount#</td> | |||||
<td class="label">政府投资-本级财政资金</td> | |||||
<td align="center">#annualPlanGovOwnFinanceAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">政府投资-上级补助资金</td> | |||||
<td align="center">#annualPlanGovSuperiorFinanceAmount#</td> | |||||
<td class="label">银行贷款</td> | |||||
<td align="center">#annualPlanBankLendingAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">其他资金</td> | |||||
<td colspan="3" align="center">#annualPlanOtherAmount#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">备注</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">备注</td> | |||||
<td colspan="3" align="center"><p class="h-1200">#projectRemarks#</p></td> | |||||
</tr> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">单位意见</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">本级主管单位意见(盖章)</td> | |||||
<td colspan="3" class="text content"> | |||||
<div class="textDiv"> | |||||
<div class="left"> | |||||
<span>#superOrgOpinion#</span> | |||||
</div> | |||||
<div class="right"> | |||||
<span>#superOrgAuditDate#</span> | |||||
</div> | |||||
</div> | |||||
</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">上级主管单位意见(盖章)</td> | |||||
<td colspan="3" class="text content"> | |||||
<div class="textDiv"> | |||||
<div class="left"> | |||||
<span>#higherOrgOpinion#</span> | |||||
</div> | |||||
<div class="right"> | |||||
<span>#higherOrgAuditDate#</span> | |||||
</div> | |||||
</div> | |||||
</td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
</div> | |||||
</div> | |||||
</body> | |||||
</html> |
@@ -0,0 +1,281 @@ | |||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | |||||
<html | |||||
xmlns="http://www.w3.org/1999/xhtml" | |||||
xmlns:font-family="http://www.w3.org/1999/xhtml" | |||||
> | |||||
<head> | |||||
<meta charset="UTF-8" /> | |||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |||||
<title>Document</title> | |||||
<style> | |||||
html, | |||||
body,p { | |||||
padding: 0; | |||||
margin: 0; | |||||
font-family: SimSun; | |||||
} | |||||
.pdf { | |||||
margin: 0 auto; | |||||
padding: 10px 0 30px; | |||||
text-align: center; | |||||
} | |||||
.title { | |||||
padding: 0 0 20px 0; | |||||
font-size: 34px; | |||||
margin: 0; | |||||
font-family: SimSun; | |||||
word-break: break-all; | |||||
height: 80px; | |||||
} | |||||
.tit { | |||||
word-break: break-all; | |||||
} | |||||
.tab { | |||||
padding: 0 20px; | |||||
} | |||||
.projectId { | |||||
color: #999999; | |||||
text-align: left; | |||||
margin-bottom: 8px; | |||||
margin-top: 0; | |||||
} | |||||
.projectId > .time { | |||||
float: right; | |||||
} | |||||
table { | |||||
width: 100%; | |||||
border-collapse: collapse; | |||||
font-size: 16px; | |||||
table-layout: fixed; | |||||
word-break: break-all; | |||||
word-wrap: break-word; | |||||
text-align: left; | |||||
} | |||||
td { | |||||
padding: 15px 8px; | |||||
border: 1px solid; | |||||
} | |||||
.tabTit { | |||||
background-color: #eee; | |||||
} | |||||
.label { | |||||
width: 150px; | |||||
} | |||||
.sealTd { | |||||
height: 200px; | |||||
position: relative; | |||||
} | |||||
.seal { | |||||
position: absolute; | |||||
right: 20px; | |||||
bottom: 30px; | |||||
width: 150px; | |||||
} | |||||
.seal > .time { | |||||
text-align: right; | |||||
} | |||||
.content { | |||||
height: 210px; | |||||
} | |||||
.textDiv{ | |||||
display: flex; | |||||
align-items: center; | |||||
height: 100%; | |||||
position: relative; | |||||
} | |||||
.textDiv > .right { | |||||
position: absolute; | |||||
bottom: 4px; | |||||
right: 4px; | |||||
} | |||||
.h-80{ | |||||
height: 80px; | |||||
} | |||||
.h-100{ | |||||
height: 100px; | |||||
} | |||||
.h-400{ | |||||
height: 400px; | |||||
} | |||||
.h-1200{ | |||||
height: 1200px; | |||||
} | |||||
</style> | |||||
</head> | |||||
<body> | |||||
<div class="pdf"> | |||||
<p class="title"> | |||||
<span class="tit">#title#</span> | |||||
</p> | |||||
<div class="tab"> | |||||
<p class="projectId"> | |||||
<span> | |||||
项目编号: | |||||
<span>#projectCode#</span> | |||||
</span> | |||||
<span class="time">#time#</span> | |||||
</p> | |||||
<table> | |||||
<tbody> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">项目基本信息</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">项目名称</td> | |||||
<td colspan="3" align="center">#projectName#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">是否临时增补</td> | |||||
<td align="center">#isTemporaryAugment#</td> | |||||
<td class="label">是否一地创新全省共享项目</td> | |||||
<td align="center">#isInnovateWholeProvinceShare#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">项目负责人</td> | |||||
<td align="center">#responsibleMan#</td> | |||||
<td class="label">负责人手机号</td> | |||||
<td align="center">#responsibleManMobile#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">项目联系人</td> | |||||
<td align="center">#contactName#</td> | |||||
<td class="label">项目联系人手机号</td> | |||||
<td align="center">#contactPhone#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">建设单位</td> | |||||
<td align="center">#buildOrgName#</td> | |||||
<td class="label">建设单位统一社会信用代码</td> | |||||
<td align="center">#orgCreditCode#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">项目类型</td> | |||||
<td align="center">#projectType#</td> | |||||
<td class="label">是否首次新建</td> | |||||
<td align="center">#isFirst#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">预算年度</td> | |||||
<td align="center">#projectYear#</td> | |||||
<td class="label">建设起止时间</td> | |||||
<td align="center">#beginAndEndTime#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">四大体系</td> | |||||
<td colspan="3" align="center">#fourSystems#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">是否数字化改革项目</td> | |||||
<td align="center">#isDigitalReform#</td> | |||||
<td class="label">综合业务领域</td> | |||||
<td align="center">#bizDomain#</td> | |||||
</tr> | |||||
<tr class="h-400"> | |||||
<td class="label">立项依据</td> | |||||
<td colspan="3" align="center">#buildBasisList#</td> | |||||
</tr> | |||||
<tr class="h-100"> | |||||
<td class="label">是否上云</td> | |||||
<td align="center">#isCloud#</td> | |||||
<td class="label">云类型</td> | |||||
<td align="center">#cloudType#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">项目简介</td> | |||||
<td colspan="3" align="center"> | |||||
<p class="h-1200">#projectIntroduction#</p> | |||||
</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">资金申报情况</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">申报金额</td> | |||||
<td colspan="3" align="center">#declareAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">自有资金</td> | |||||
<td align="center">#declareHaveAmount#</td> | |||||
<td class="label">政府投资-本级财政资金</td> | |||||
<td align="center">#declareGovOwnFinanceAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">政府投资-上级补助资金</td> | |||||
<td align="center">#declareGovSuperiorFinanceAmount#</td> | |||||
<td class="label">银行贷款</td> | |||||
<td align="center">#declareBankLendingAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">其他资金</td> | |||||
<td colspan="3" align="center">#declareOtherAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">本年计划投资(万元)</td> | |||||
<td colspan="3" align="center">#yearPlanInvest#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">资金分配情况</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">软件开发</td> | |||||
<td align="center">#softwareDevelopmentAmount#</td> | |||||
<td class="label">云资源、硬件购置</td> | |||||
<td align="center">#cloudHardwarePurchaseAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">第三方服务</td> | |||||
<td colspan="3" align="center">#thirdPartyAmount#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">年度支付计划</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">年度支付金额</td> | |||||
<td colspan="3" align="center">#annualPlanAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">自有资金</td> | |||||
<td align="center">#annualPlanHaveAmount#</td> | |||||
<td class="label">政府投资-本级财政资金</td> | |||||
<td align="center">#annualPlanGovOwnFinanceAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">政府投资-上级补助资金</td> | |||||
<td align="center">#annualPlanGovSuperiorFinanceAmount#</td> | |||||
<td class="label">银行贷款</td> | |||||
<td align="center">#annualPlanBankLendingAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">其他资金</td> | |||||
<td colspan="3" align="center">#annualPlanOtherAmount#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">备注</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">备注</td> | |||||
<td colspan="3" align="center"><p class="h-1200">#projectRemarks#</p></td> | |||||
</tr> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">单位意见</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">本级主管单位意见(盖章)</td> | |||||
<td colspan="3" class="text content"> | |||||
<div class="textDiv"> | |||||
<div class="left"> | |||||
<span>#superOrgOpinion#</span> | |||||
</div> | |||||
<div class="right"> | |||||
<span>#superOrgAuditDate#</span> | |||||
</div> | |||||
</div> | |||||
</td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
</div> | |||||
</div> | |||||
</body> | |||||
</html> |
@@ -0,0 +1,281 @@ | |||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | |||||
<html | |||||
xmlns="http://www.w3.org/1999/xhtml" | |||||
xmlns:font-family="http://www.w3.org/1999/xhtml" | |||||
> | |||||
<head> | |||||
<meta charset="UTF-8" /> | |||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |||||
<title>Document</title> | |||||
<style> | |||||
html, | |||||
body,p { | |||||
padding: 0; | |||||
margin: 0; | |||||
font-family: SimSun; | |||||
} | |||||
.pdf { | |||||
margin: 0 auto; | |||||
padding: 10px 0 30px; | |||||
text-align: center; | |||||
} | |||||
.title { | |||||
padding: 0 0 20px 0; | |||||
font-size: 34px; | |||||
margin: 0; | |||||
font-family: SimSun; | |||||
word-break: break-all; | |||||
height: 80px; | |||||
} | |||||
.tit { | |||||
word-break: break-all; | |||||
} | |||||
.tab { | |||||
padding: 0 20px; | |||||
} | |||||
.projectId { | |||||
color: #999999; | |||||
text-align: left; | |||||
margin-bottom: 8px; | |||||
margin-top: 0; | |||||
} | |||||
.projectId > .time { | |||||
float: right; | |||||
} | |||||
table { | |||||
width: 100%; | |||||
border-collapse: collapse; | |||||
font-size: 16px; | |||||
table-layout: fixed; | |||||
word-break: break-all; | |||||
word-wrap: break-word; | |||||
text-align: left; | |||||
} | |||||
td { | |||||
padding: 15px 8px; | |||||
border: 1px solid; | |||||
} | |||||
.tabTit { | |||||
background-color: #eee; | |||||
} | |||||
.label { | |||||
width: 150px; | |||||
} | |||||
.sealTd { | |||||
height: 200px; | |||||
position: relative; | |||||
} | |||||
.seal { | |||||
position: absolute; | |||||
right: 20px; | |||||
bottom: 30px; | |||||
width: 150px; | |||||
} | |||||
.seal > .time { | |||||
text-align: right; | |||||
} | |||||
.content { | |||||
height: 210px; | |||||
} | |||||
.textDiv{ | |||||
display: flex; | |||||
align-items: center; | |||||
height: 100%; | |||||
position: relative; | |||||
} | |||||
.textDiv > .right { | |||||
position: absolute; | |||||
bottom: 4px; | |||||
right: 4px; | |||||
} | |||||
.h-80{ | |||||
height: 80px; | |||||
} | |||||
.h-100{ | |||||
height: 100px; | |||||
} | |||||
.h-400{ | |||||
height: 400px; | |||||
} | |||||
.h-1200{ | |||||
height: 1200px; | |||||
} | |||||
</style> | |||||
</head> | |||||
<body> | |||||
<div class="pdf"> | |||||
<p class="title"> | |||||
<span class="tit">#title#</span> | |||||
</p> | |||||
<div class="tab"> | |||||
<p class="projectId"> | |||||
<span> | |||||
项目编号: | |||||
<span>#projectCode#</span> | |||||
</span> | |||||
<span class="time">#time#</span> | |||||
</p> | |||||
<table> | |||||
<tbody> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">项目基本信息</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">项目名称</td> | |||||
<td colspan="3" align="center">#projectName#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">是否临时增补</td> | |||||
<td align="center">#isTemporaryAugment#</td> | |||||
<td class="label">是否一地创新全省共享项目</td> | |||||
<td align="center">#isInnovateWholeProvinceShare#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">项目负责人</td> | |||||
<td align="center">#responsibleMan#</td> | |||||
<td class="label">负责人手机号</td> | |||||
<td align="center">#responsibleManMobile#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">项目联系人</td> | |||||
<td align="center">#contactName#</td> | |||||
<td class="label">项目联系人手机号</td> | |||||
<td align="center">#contactPhone#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">建设单位</td> | |||||
<td align="center">#buildOrgName#</td> | |||||
<td class="label">建设单位统一社会信用代码</td> | |||||
<td align="center">#orgCreditCode#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">项目类型</td> | |||||
<td align="center">#projectType#</td> | |||||
<td class="label">是否首次新建</td> | |||||
<td align="center">#isFirst#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">预算年度</td> | |||||
<td align="center">#projectYear#</td> | |||||
<td class="label">建设起止时间</td> | |||||
<td align="center">#beginAndEndTime#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">四大体系</td> | |||||
<td colspan="3" align="center">#fourSystems#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">是否数字化改革项目</td> | |||||
<td align="center">#isDigitalReform#</td> | |||||
<td class="label">综合业务领域</td> | |||||
<td align="center">#bizDomain#</td> | |||||
</tr> | |||||
<tr class="h-400"> | |||||
<td class="label">立项依据</td> | |||||
<td colspan="3" align="center">#buildBasisList#</td> | |||||
</tr> | |||||
<tr class="h-100"> | |||||
<td class="label">是否上云</td> | |||||
<td align="center">#isCloud#</td> | |||||
<td class="label">云类型</td> | |||||
<td align="center">#cloudType#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">项目简介</td> | |||||
<td colspan="3" align="center"> | |||||
<p class="h-1200">#projectIntroduction#</p> | |||||
</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">资金申报情况</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">申报金额</td> | |||||
<td colspan="3" align="center">#declareAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">自有资金</td> | |||||
<td align="center">#declareHaveAmount#</td> | |||||
<td class="label">政府投资-本级财政资金</td> | |||||
<td align="center">#declareGovOwnFinanceAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">政府投资-上级补助资金</td> | |||||
<td align="center">#declareGovSuperiorFinanceAmount#</td> | |||||
<td class="label">银行贷款</td> | |||||
<td align="center">#declareBankLendingAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">其他资金</td> | |||||
<td colspan="3" align="center">#declareOtherAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">本年计划投资(万元)</td> | |||||
<td colspan="3" align="center">#yearPlanInvest#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">资金分配情况</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">软件开发</td> | |||||
<td align="center">#softwareDevelopmentAmount#</td> | |||||
<td class="label">云资源、硬件购置</td> | |||||
<td align="center">#cloudHardwarePurchaseAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">第三方服务</td> | |||||
<td colspan="3" align="center">#thirdPartyAmount#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">年度支付计划</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">年度支付金额</td> | |||||
<td colspan="3" align="center">#annualPlanAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">自有资金</td> | |||||
<td align="center">#annualPlanHaveAmount#</td> | |||||
<td class="label">政府投资-本级财政资金</td> | |||||
<td align="center">#annualPlanGovOwnFinanceAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">政府投资-上级补助资金</td> | |||||
<td align="center">#annualPlanGovSuperiorFinanceAmount#</td> | |||||
<td class="label">银行贷款</td> | |||||
<td align="center">#annualPlanBankLendingAmount#</td> | |||||
</tr> | |||||
<tr class="h-80"> | |||||
<td class="label">其他资金</td> | |||||
<td colspan="3" align="center">#annualPlanOtherAmount#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">备注</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">备注</td> | |||||
<td colspan="3" align="center"><p class="h-1200">#projectRemarks#</p></td> | |||||
</tr> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">单位意见</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">大数据局主管单位意见(盖章)</td> | |||||
<td colspan="3" class="text content"> | |||||
<div class="textDiv"> | |||||
<div class="left"> | |||||
<span>#bigDataBureauOpinion#</span> | |||||
</div> | |||||
<div class="right"> | |||||
<span>#bigDataBureauAuditDate#</span> | |||||
</div> | |||||
</div> | |||||
</td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
</div> | |||||
</div> | |||||
</body> | |||||
</html> |
@@ -0,0 +1,19 @@ | |||||
package com.ningdatech.kqapi; | |||||
import org.junit.runner.RunWith; | |||||
import org.springframework.boot.test.context.SpringBootTest; | |||||
import org.springframework.test.context.junit4.SpringRunner; | |||||
/** | |||||
* <p> | |||||
* AppRunTests | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 19:27 2022/5/10 | |||||
*/ | |||||
@RunWith(SpringRunner.class) | |||||
@SpringBootTest(classes = App.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) | |||||
public class AppTests { | |||||
} |
@@ -0,0 +1,60 @@ | |||||
package com.ningdatech.kqapi.menu; | |||||
import org.apache.poi.ss.usermodel.*; | |||||
import org.apache.poi.ss.util.CellRangeAddress; | |||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook; | |||||
import java.io.FileInputStream; | |||||
import java.io.FileOutputStream; | |||||
import java.io.IOException; | |||||
public class ExcelSplitMergedCells { | |||||
public static void main(String[] args) throws IOException { | |||||
// 打开Excel文件 | |||||
FileInputStream fis = new FileInputStream("C:\\Users\\PoffyZhang\\Desktop\\8.8柯桥区企业综合服务中心政务服务事项清单.xlsx"); | |||||
Workbook workbook = new XSSFWorkbook(fis); | |||||
Sheet sheet = workbook.getSheetAt(0); | |||||
// 获取合并单元格的范围 | |||||
CellRangeAddress mergedRegion = sheet.getMergedRegion(0); // 0表示第一个合并的单元格 | |||||
int firstRow = mergedRegion.getFirstRow(); | |||||
int lastRow = mergedRegion.getLastRow(); | |||||
int firstCol = mergedRegion.getFirstColumn(); | |||||
int lastCol = mergedRegion.getLastColumn(); | |||||
// 取消合并单元格 | |||||
sheet.removeMergedRegion(0); | |||||
Integer num = 0; | |||||
// 创建新的单元格并复制内容 | |||||
for (int i = firstRow; i <= lastRow; i++) { | |||||
Row row = sheet.getRow(i); | |||||
for (int j = firstCol; j <= lastCol; j++) { | |||||
Cell oldCell = row.getCell(j); | |||||
Cell newCell = row.createCell(j); | |||||
newCell.setCellType(oldCell.getCellType()); | |||||
switch (oldCell.getCellType()) { | |||||
case STRING: | |||||
newCell.setCellValue(oldCell.getStringCellValue()); | |||||
break; | |||||
case NUMERIC: | |||||
newCell.setCellValue(oldCell.getNumericCellValue()); | |||||
break; | |||||
case BOOLEAN: | |||||
newCell.setCellValue(oldCell.getBooleanCellValue()); | |||||
break; | |||||
case FORMULA: | |||||
newCell.setCellFormula(oldCell.getCellFormula()); | |||||
break; | |||||
default: | |||||
newCell.setCellValue(""); | |||||
} | |||||
} | |||||
} | |||||
// 保存修改后的Excel文件 | |||||
fis.close(); | |||||
FileOutputStream fos = new FileOutputStream("C:\\Users\\PoffyZhang\\Desktop\\8.8柯桥区企业综合服务中心政务服务事项清单2.xlsx"); | |||||
workbook.write(fos); | |||||
fos.close(); | |||||
} | |||||
} |
@@ -0,0 +1,85 @@ | |||||
package com.ningdatech.kqapi.menu; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.ningdatech.kqapi.AppTests; | |||||
import com.ningdatech.kqapi.zzsfw.entity.entity.DscSxAdsShareItemQltQlsxCommonIDVKq; | |||||
import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwMenu; | |||||
import com.ningdatech.kqapi.zzsfw.service.IDscSxAdsShareItemQltQlsxCommonIDVKqService; | |||||
import com.ningdatech.kqapi.zzsfw.service.INdKqZzsfwMenuService; | |||||
import org.apache.poi.ss.usermodel.*; | |||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook; | |||||
import org.junit.Assert; | |||||
import org.junit.Test; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import java.io.FileInputStream; | |||||
import java.io.IOException; | |||||
import java.time.LocalDateTime; | |||||
import java.util.Objects; | |||||
/** | |||||
* @Classname MenuTest | |||||
* @Description | |||||
* @Date 2023/10/27 9:51 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
public class MenuTest extends AppTests { | |||||
@Autowired | |||||
private INdKqZzsfwMenuService menuService; | |||||
@Autowired | |||||
private IDscSxAdsShareItemQltQlsxCommonIDVKqService itemQltQlsxCommonIDVKqService; | |||||
@Test | |||||
public void test() throws IOException { | |||||
FileInputStream fis = new FileInputStream("C:\\Users\\PoffyZhang\\Desktop\\8.8柯桥区企业综合服务中心政务服务事项清单2.xlsx"); | |||||
Workbook workbook = new XSSFWorkbook(fis); | |||||
Assert.assertNotNull(workbook); | |||||
Row row; | |||||
if (workbook != null) { | |||||
//获取最大行数 | |||||
Sheet sheet = workbook.getSheetAt(0); | |||||
int rownum = sheet.getPhysicalNumberOfRows(); | |||||
//获取第一行 | |||||
row = sheet.getRow(0); | |||||
//获取最大列数 | |||||
Integer num = 1; | |||||
for (int i = 2; i < rownum; i++) { | |||||
row = sheet.getRow(i); | |||||
if(row.getZeroHeight()){ | |||||
continue; | |||||
} | |||||
System.out.println("记数:" + (num++)); | |||||
System.out.println(row.getCell(0).getStringCellValue()); | |||||
System.out.println(row.getCell(1).getStringCellValue()); | |||||
System.out.println(row.getCell(2).getStringCellValue()); | |||||
Double numericCellValue = row.getCell(3).getNumericCellValue(); | |||||
String itemName = row.getCell(4).getStringCellValue(); | |||||
System.out.println(itemName); | |||||
NdKqZzsfwMenu menu = new NdKqZzsfwMenu(); | |||||
menu.setItemName(itemName); | |||||
menu.setZoneName(row.getCell(0).getStringCellValue()); | |||||
menu.setWindow(row.getCell(1).getStringCellValue()); | |||||
menu.setCreateOn(LocalDateTime.now()); | |||||
menu.setDepartment(row.getCell(2).getStringCellValue()); | |||||
menu.setSort(numericCellValue.intValue()); | |||||
//去查询 url | |||||
DscSxAdsShareItemQltQlsxCommonIDVKq item = itemQltQlsxCommonIDVKqService.getOne(Wrappers.lambdaQuery(DscSxAdsShareItemQltQlsxCommonIDVKq.class) | |||||
.select(DscSxAdsShareItemQltQlsxCommonIDVKq::getRowguid, DscSxAdsShareItemQltQlsxCommonIDVKq::getWebapplyurl, DscSxAdsShareItemQltQlsxCommonIDVKq::getQlName) | |||||
.eq(DscSxAdsShareItemQltQlsxCommonIDVKq::getQlName, itemName) | |||||
.isNotNull(DscSxAdsShareItemQltQlsxCommonIDVKq::getWebapplyurl) | |||||
.last("limit 1")); | |||||
if(Objects.nonNull(item)){ | |||||
menu.setHasUrl(1); | |||||
menu.setWebapplyurl(item.getWebapplyurl()); | |||||
menu.setItemRowid(item.getRowguid()); | |||||
} | |||||
menuService.save(menu); | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,123 @@ | |||||
server: | |||||
port: 33060 | |||||
servlet: | |||||
context-path: /kq | |||||
spring: | |||||
mvc: | |||||
pathmatch: | |||||
matching-strategy: ant_path_matcher | |||||
session: | |||||
store-type: redis | |||||
redis: | |||||
namespace: "spring:session" | |||||
timeout: 864000 | |||||
redis: | |||||
timeout: 5000 | |||||
host: 47.98.125.47 | |||||
port: 26379 | |||||
database: 7 | |||||
password: Ndkj1234 | |||||
jedis: | |||||
pool: | |||||
max-active: 200 | |||||
max-idle: 500 | |||||
min-idle: 8 | |||||
max-wait: 10000 | |||||
application: | |||||
name: kq | |||||
jackson: | |||||
default-property-inclusion: non_null | |||||
time-zone: GMT+8 | |||||
date-format: yyyy-MM-dd HH:mm:ss | |||||
jpa: | |||||
properties: | |||||
hibernate: | |||||
default_schema: PUBLIC | |||||
hbm2ddl: | |||||
auto: update | |||||
show_sql: true | |||||
show-sql: true | |||||
hibernate: | |||||
ddl-auto: update | |||||
datasource: | |||||
type: com.zaxxer.hikari.HikariDataSource | |||||
driver-class-name: com.mysql.cj.jdbc.Driver | |||||
url: jdbc:mysql://47.98.125.47:3306/kqzzsfw?serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false | |||||
username: root | |||||
password: NingdaKeji123! | |||||
# 数据源 | |||||
hikari: | |||||
# 是客户端等待连接池连接的最大毫秒数 | |||||
connection-timeout: 30000 | |||||
# 是允许连接在连接池中空闲的最长时间 | |||||
minimum-idle: 5 | |||||
# 配置最大池大小 | |||||
maximum-pool-size: 300 | |||||
# 是允许连接在连接池中空闲的最长时间(以毫秒为单位) | |||||
idle-timeout: 60000 | |||||
# 池中连接关闭后的最长生命周期(以毫秒为单位) | |||||
max-lifetime: 600000 | |||||
# 配置从池返回的连接的默认自动提交行为。默认值为true。 | |||||
auto-commit: true | |||||
# 开启连接监测泄露 | |||||
leak-detection-threshold: 10000 | |||||
# 测试连接数据库 | |||||
connection-test-query: SELECT 1 | |||||
#设置上传 单个文件的大小 | |||||
servlet: | |||||
multipart: | |||||
max-file-size: 100MB | |||||
max-request-size: 150MB | |||||
mybatis-plus: | |||||
configuration: | |||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl | |||||
global-config: | |||||
db-config: | |||||
logic-delete-value: true | |||||
logic-not-delete-value: false | |||||
logging: | |||||
config: classpath:logback-spring.xml | |||||
#日志配置 | |||||
level: | |||||
root: info | |||||
file: | |||||
path: logs | |||||
nd: | |||||
cache: | |||||
type: REDIS | |||||
serializerType: ProtoStuff | |||||
cacheNullVal: true | |||||
def: | |||||
keyPrefix: kq | |||||
log: | |||||
enabled: true | |||||
type: DB | |||||
# 文件存储 | |||||
file: | |||||
storage-type: ALI_OSS | |||||
ali: | |||||
protocol: https:// | |||||
bucket: devplat | |||||
urlPrefix: oss-cn-hangzhou.aliyuncs.com | |||||
endpoint: oss-cn-hangzhou.aliyuncs.com | |||||
accessKeyId: LTAI4GL7uypycnBjiRn55rMG | |||||
accessKeySecret: qwYC7bW9bkStsko7qkLVnToAzj0Y98 | |||||
# 日志文件配置 | |||||
log: | |||||
path: ./logs | |||||
info: | |||||
file-size: 50MB | |||||
max-size: 5 | |||||
total-size: 200MB | |||||
error: | |||||
file-size: 10MB | |||||
max-size: 5 | |||||
total-size: 50MB | |||||
swagger: | |||||
enabled: true | |||||
hostname: iZbp13nwyvib53j4j1p2xoZ | |||||
@@ -0,0 +1,121 @@ | |||||
server: | |||||
port: 33060 | |||||
servlet: | |||||
context-path: /kq | |||||
spring: | |||||
mvc: | |||||
pathmatch: | |||||
matching-strategy: ant_path_matcher | |||||
session: | |||||
store-type: redis | |||||
redis: | |||||
namespace: "spring:session" | |||||
timeout: 864000 | |||||
redis: | |||||
timeout: 5000 | |||||
host: 47.98.125.47 | |||||
port: 26379 | |||||
database: 7 | |||||
password: Ndkj1234 | |||||
jedis: | |||||
pool: | |||||
max-active: 200 | |||||
max-idle: 500 | |||||
min-idle: 8 | |||||
max-wait: 10000 | |||||
application: | |||||
name: kq | |||||
jackson: | |||||
default-property-inclusion: non_null | |||||
time-zone: GMT+8 | |||||
date-format: yyyy-MM-dd HH:mm:ss | |||||
jpa: | |||||
properties: | |||||
hibernate: | |||||
default_schema: PUBLIC | |||||
hbm2ddl: | |||||
auto: update | |||||
show_sql: true | |||||
show-sql: true | |||||
hibernate: | |||||
ddl-auto: update | |||||
datasource: | |||||
type: com.zaxxer.hikari.HikariDataSource | |||||
driver-class-name: com.mysql.cj.jdbc.Driver | |||||
url: jdbc:mysql://47.98.125.47:3306/kqzzsfw?serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false | |||||
username: root | |||||
password: NingdaKeji123! | |||||
# 数据源 | |||||
hikari: | |||||
# 是客户端等待连接池连接的最大毫秒数 | |||||
connection-timeout: 30000 | |||||
# 是允许连接在连接池中空闲的最长时间 | |||||
minimum-idle: 5 | |||||
# 配置最大池大小 | |||||
maximum-pool-size: 300 | |||||
# 是允许连接在连接池中空闲的最长时间(以毫秒为单位) | |||||
idle-timeout: 60000 | |||||
# 池中连接关闭后的最长生命周期(以毫秒为单位) | |||||
max-lifetime: 600000 | |||||
# 配置从池返回的连接的默认自动提交行为。默认值为true。 | |||||
auto-commit: true | |||||
# 开启连接监测泄露 | |||||
leak-detection-threshold: 5000 | |||||
# 测试连接数据库 | |||||
connection-test-query: SELECT 1 | |||||
#设置上传 单个文件的大小 | |||||
servlet: | |||||
multipart: | |||||
max-file-size: 100MB | |||||
max-request-size: 150MB | |||||
mybatis-plus: | |||||
configuration: | |||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl | |||||
global-config: | |||||
db-config: | |||||
logic-delete-value: true | |||||
logic-not-delete-value: false | |||||
logging: | |||||
config: classpath:logback-spring.xml | |||||
#日志配置 | |||||
level: | |||||
root: info | |||||
file: | |||||
path: logs | |||||
nd: | |||||
cache: | |||||
type: REDIS | |||||
serializerType: ProtoStuff | |||||
cacheNullVal: true | |||||
def: | |||||
keyPrefix: kq | |||||
log: | |||||
enabled: true | |||||
type: DB | |||||
# 文件存储 | |||||
file: | |||||
storage-type: ALI_OSS | |||||
ali: | |||||
protocol: https:// | |||||
bucket: devplat | |||||
urlPrefix: oss-cn-hangzhou.aliyuncs.com | |||||
endpoint: oss-cn-hangzhou.aliyuncs.com | |||||
accessKeyId: LTAI4GL7uypycnBjiRn55rMG | |||||
accessKeySecret: qwYC7bW9bkStsko7qkLVnToAzj0Y98 | |||||
# 日志文件配置 | |||||
log: | |||||
path: ./logs | |||||
info: | |||||
file-size: 50MB | |||||
max-size: 5 | |||||
total-size: 200MB | |||||
error: | |||||
file-size: 10MB | |||||
max-size: 5 | |||||
total-size: 50MB | |||||
swagger: | |||||
enabled: true | |||||
hostname: iZbp13nwyvib53j4j1p2xoZ |
@@ -0,0 +1,123 @@ | |||||
server: | |||||
port: 33060 | |||||
servlet: | |||||
context-path: /kq | |||||
spring: | |||||
mvc: | |||||
pathmatch: | |||||
matching-strategy: ant_path_matcher | |||||
session: | |||||
store-type: redis | |||||
redis: | |||||
namespace: "spring:session" | |||||
timeout: 864000 | |||||
redis: | |||||
timeout: 5000 | |||||
host: 47.98.125.47 | |||||
port: 26379 | |||||
database: 7 | |||||
password: Ndkj1234 | |||||
jedis: | |||||
pool: | |||||
max-active: 200 | |||||
max-idle: 500 | |||||
min-idle: 8 | |||||
max-wait: 10000 | |||||
application: | |||||
name: kq | |||||
jackson: | |||||
default-property-inclusion: non_null | |||||
time-zone: GMT+8 | |||||
date-format: yyyy-MM-dd HH:mm:ss | |||||
jpa: | |||||
properties: | |||||
hibernate: | |||||
default_schema: PUBLIC | |||||
hbm2ddl: | |||||
auto: update | |||||
show_sql: true | |||||
show-sql: true | |||||
hibernate: | |||||
ddl-auto: update | |||||
datasource: | |||||
type: com.zaxxer.hikari.HikariDataSource | |||||
driver-class-name: com.mysql.cj.jdbc.Driver | |||||
url: jdbc:mysql://47.98.125.47:3306/kqzzsfw?serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false | |||||
username: root | |||||
password: NingdaKeji123! | |||||
# 数据源 | |||||
hikari: | |||||
# 是客户端等待连接池连接的最大毫秒数 | |||||
connection-timeout: 30000 | |||||
# 是允许连接在连接池中空闲的最长时间 | |||||
minimum-idle: 5 | |||||
# 配置最大池大小 | |||||
maximum-pool-size: 300 | |||||
# 是允许连接在连接池中空闲的最长时间(以毫秒为单位) | |||||
idle-timeout: 60000 | |||||
# 池中连接关闭后的最长生命周期(以毫秒为单位) | |||||
max-lifetime: 600000 | |||||
# 配置从池返回的连接的默认自动提交行为。默认值为true。 | |||||
auto-commit: true | |||||
# 开启连接监测泄露 | |||||
leak-detection-threshold: 5000 | |||||
# 测试连接数据库 | |||||
connection-test-query: SELECT 1 | |||||
#设置上传 单个文件的大小 | |||||
servlet: | |||||
multipart: | |||||
max-file-size: 100MB | |||||
max-request-size: 150MB | |||||
mybatis-plus: | |||||
configuration: | |||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl | |||||
global-config: | |||||
db-config: | |||||
logic-delete-value: true | |||||
logic-not-delete-value: false | |||||
logging: | |||||
config: classpath:logback-spring.xml | |||||
#日志配置 | |||||
level: | |||||
root: info | |||||
file: | |||||
path: logs | |||||
nd: | |||||
cache: | |||||
type: REDIS | |||||
serializerType: ProtoStuff | |||||
cacheNullVal: true | |||||
def: | |||||
keyPrefix: kq | |||||
log: | |||||
enabled: true | |||||
type: DB | |||||
# 文件存储 | |||||
file: | |||||
storage-type: ALI_OSS | |||||
ali: | |||||
protocol: https:// | |||||
bucket: devplat | |||||
urlPrefix: oss-cn-hangzhou.aliyuncs.com | |||||
endpoint: oss-cn-hangzhou.aliyuncs.com | |||||
accessKeyId: LTAI4GL7uypycnBjiRn55rMG | |||||
accessKeySecret: qwYC7bW9bkStsko7qkLVnToAzj0Y98 | |||||
# 日志文件配置 | |||||
log: | |||||
path: ./logs | |||||
info: | |||||
file-size: 50MB | |||||
max-size: 5 | |||||
total-size: 200MB | |||||
error: | |||||
file-size: 10MB | |||||
max-size: 5 | |||||
total-size: 50MB | |||||
swagger: | |||||
enabled: true | |||||
hostname: iZbp13nwyvib53j4j1p2xoZ | |||||
@@ -0,0 +1,3 @@ | |||||
spring: | |||||
profiles: | |||||
active: dev |
@@ -0,0 +1,12 @@ | |||||
#专有钉钉 | |||||
integration: | |||||
zwdd: | |||||
#扫码 | |||||
app-auth-key: ls-rebuild_dingoa-rgeWs3YVr26z | |||||
app-auth-secret: 37qCe6ylNMW0N8K2741z0c2b9vJP2gtuMRQQtZ9P | |||||
#免登/获取信息 | |||||
app-key: ls_rebuild-10c8n5X0707yFV7jURr | |||||
app-secret: gN8J3WazyXLMWKDuFmx6C4yaH5lFUY41x8rYLLo6 | |||||
#专有钉钉在开发管理工作台,右键查看网页源码realmId: '31141',浙政钉固定196729 | |||||
tenantId: 31141 | |||||
domain: openplatform.dg-work.cn |
@@ -0,0 +1,12 @@ | |||||
#浙政钉 | |||||
integration: | |||||
zwdd: | |||||
#扫码 | |||||
app-auth-key: ls_project_managment_din-b1Y3I1g7Rr94yX76KfFkpp18Uy4WHtU0b6rINJ3 | |||||
app-auth-secret: 75e8PMHv984KYF0Mcy6v4pxt480y73dbD7kB65dD | |||||
#免登/获取信息 | |||||
app-key: ls_project-c32LNu87v60UiANZVja | |||||
app-secret: R14QgbBr21751LTGml3Vt8oX9doPl4Lk1ROzZNfG | |||||
#专有钉钉在开发管理工作台,右键查看网页源码realmId: '31141',浙政钉固定196729 | |||||
tenantId: 196729 | |||||
domain: openplatform-pro.ding.zj.gov.cn |
@@ -0,0 +1,68 @@ | |||||
<configuration scan="true" scanPeriod="10 seconds"> | |||||
<springProperty name="logPath" scope="context" source="log.path" defaultValue="./logs"/> | |||||
<springProperty name="infoFileSize" scope="context" source="log.info.file-size"/> | |||||
<springProperty name="infoMaxSize" scope="context" source="log.info.max-size"/> | |||||
<springProperty name="infoTotalSize" scope="context" source="log.info.total-size"/> | |||||
<springProperty name="errorFileSize" scope="context" source="log.error.file-size"/> | |||||
<springProperty name="errorMaxSize" scope="context" source="log.error.max-size"/> | |||||
<springProperty name="errorTotalSize" scope="context" source="log.error.total-size"/> | |||||
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||||
<File>${logPath}/info.log</File> | |||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||||
<fileNamePattern>${logPath}/info-%d{yyyyMMdd}-%i.log</fileNamePattern> | |||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> | |||||
<maxFileSize>${infoFileSize}</maxFileSize> | |||||
</timeBasedFileNamingAndTriggeringPolicy> | |||||
<maxHistory>${infoMaxSize}</maxHistory> | |||||
<totalSizeCap>${infoTotalSize}</totalSizeCap> | |||||
</rollingPolicy> | |||||
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> | |||||
<layout class="ch.qos.logback.classic.PatternLayout"> | |||||
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n | |||||
</Pattern> | |||||
</layout> | |||||
<charset>UTF-8</charset> | |||||
</encoder> | |||||
</appender> | |||||
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||||
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> | |||||
<level>ERROR</level> | |||||
</filter> | |||||
<File>${logPath}/error.log</File> | |||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||||
<fileNamePattern>${logPath}/error-%d{yyyyMMdd}-%i.log</fileNamePattern> | |||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> | |||||
<maxFileSize>${errorFileSize}</maxFileSize> | |||||
</timeBasedFileNamingAndTriggeringPolicy> | |||||
<maxHistory>${errorMaxSize}</maxHistory> | |||||
<totalSizeCap>${errorTotalSize}</totalSizeCap> | |||||
</rollingPolicy> | |||||
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> | |||||
<layout class="ch.qos.logback.classic.PatternLayout"> | |||||
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n | |||||
</Pattern> | |||||
</layout> | |||||
<charset>UTF-8</charset> | |||||
</encoder> | |||||
</appender> | |||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> | |||||
<encoder> | |||||
<pattern> | |||||
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n | |||||
</pattern> | |||||
<charset>UTF-8</charset> | |||||
</encoder> | |||||
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> | |||||
<level>DEBUG</level> | |||||
</filter> | |||||
</appender> | |||||
<root level="INFO"> | |||||
<appender-ref ref="INFO_FILE"/> | |||||
<appender-ref ref="ERROR_FILE"/> | |||||
<appender-ref ref="STDOUT"/> | |||||
</root> | |||||
</configuration> |
@@ -0,0 +1,68 @@ | |||||
security: | |||||
auth: | |||||
auth-require-url: /api/v1/user/auth/auth-require | |||||
invalid-session-url: /api/v1/user/auth/invalid-session | |||||
password-login-url: /api/v1/user/auth/login | |||||
agent-login-url: /api/v1/user/auth/agent-login | |||||
logout-url: /api/v1/user/auth/logout | |||||
common-login-url: /api/v1/user/auth/common-login | |||||
ignore-auth-urls: | |||||
- /v2/api-docs | |||||
- /swagger-ui.html | |||||
- /webjars/** | |||||
- /swagger-resources/** | |||||
- /webjars/ | |||||
- /api/v1/user/auth/register | |||||
- /api/v1/user/auth/auth-require | |||||
- /api/v1/user/auth/invalid-session | |||||
- /api/v1/user/auth/login/password | |||||
- /api/v1/user/auth/forget-password | |||||
- /api/v1/user/auth/common-login | |||||
- /doc.html | |||||
- /ok.html | |||||
- /open/api/** | |||||
- /oa/** | |||||
- /wflow/** | |||||
- /sys/** | |||||
- /api/v1/verification/** | |||||
- /api/v1/expert/registration | |||||
- /api/v1/meta/dictionary/list | |||||
- /api/v1/meta/tag | |||||
- /api/v1/organization/tree-list | |||||
- /api/v1/organization/get-child-list | |||||
- /api/v1/region/tree | |||||
ignore-csrf-urls: | |||||
- /api/v1/user/auth/** | |||||
- /v2/api-docs | |||||
- /swagger-ui.html | |||||
- /webjars/** | |||||
- /swagger-resources/** | |||||
- /webjars/ | |||||
- /doc.html | |||||
- /ok.html | |||||
- /api/v1/** | |||||
- /file/** | |||||
- /optLog/** | |||||
- /dict/** | |||||
- /oa/** | |||||
- /wflow/** | |||||
- /sys/** | |||||
- /api/v1/verification/** | |||||
- /api/v1/expert/registration | |||||
- /api/v1/meta/dictionary/list | |||||
- /api/v1/meta/tag | |||||
- /api/v1/organization/tree-list | |||||
- /api/v1/organization/get-child-list | |||||
- /api/v1/region/tree | |||||
role-map: | |||||
"engineer": | |||||
"project_manager": | |||||
- /api/v1/user-info/kick-off/** | |||||
"enterprise_admin": | |||||
"regional_general_manager": | |||||
"driver": | |||||
"super_admin": | |||||
- /api/v1/user-info/save | |||||
- /api/v1/user-info/del | |||||
- /api/v1/user-info/kick-off/** | |||||
- /api/v1/user-info/password/mod |
@@ -0,0 +1,68 @@ | |||||
security: | |||||
auth: | |||||
auth-require-url: /api/v1/user/auth/auth-require | |||||
invalid-session-url: /api/v1/user/auth/invalid-session | |||||
password-login-url: /api/v1/user/auth/login | |||||
agent-login-url: /api/v1/user/auth/agent-login | |||||
logout-url: /api/v1/user/auth/logout | |||||
common-login-url: /api/v1/user/auth/common-login | |||||
ignore-auth-urls: | |||||
- /v2/api-docs | |||||
- /swagger-ui.html | |||||
- /webjars/** | |||||
- /swagger-resources/** | |||||
- /webjars/ | |||||
- /api/v1/user/auth/register | |||||
- /api/v1/user/auth/auth-require | |||||
- /api/v1/user/auth/invalid-session | |||||
- /api/v1/user/auth/login/password | |||||
- /api/v1/user/auth/forget-password | |||||
- /api/v1/user/auth/common-login | |||||
- /doc.html | |||||
- /ok.html | |||||
- /open/api/** | |||||
- /oa/** | |||||
- /wflow/** | |||||
- /sys/** | |||||
- /api/v1/verification/** | |||||
- /api/v1/expert/registration | |||||
- /api/v1/meta/dictionary/list | |||||
- /api/v1/meta/tag | |||||
- /api/v1/organization/tree-list | |||||
- /api/v1/organization/get-child-list | |||||
- /api/v1/region/tree | |||||
ignore-csrf-urls: | |||||
- /api/v1/user/auth/** | |||||
- /v2/api-docs | |||||
- /swagger-ui.html | |||||
- /webjars/** | |||||
- /swagger-resources/** | |||||
- /webjars/ | |||||
- /doc.html | |||||
- /ok.html | |||||
- /api/v1/** | |||||
- /file/** | |||||
- /optLog/** | |||||
- /dict/** | |||||
- /oa/** | |||||
- /wflow/** | |||||
- /sys/** | |||||
- /api/v1/verification/** | |||||
- /api/v1/expert/registration | |||||
- /api/v1/meta/dictionary/list | |||||
- /api/v1/meta/tag | |||||
- /api/v1/organization/tree-list | |||||
- /api/v1/organization/get-child-list | |||||
- /api/v1/region/tree | |||||
role-map: | |||||
"engineer": | |||||
"project_manager": | |||||
- /api/v1/user-info/kick-off/** | |||||
"enterprise_admin": | |||||
"regional_general_manager": | |||||
"driver": | |||||
"super_admin": | |||||
- /api/v1/user-info/save | |||||
- /api/v1/user-info/del | |||||
- /api/v1/user-info/kick-off/** | |||||
- /api/v1/user-info/password/mod |
@@ -0,0 +1,286 @@ | |||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | |||||
<html | |||||
xmlns="http://www.w3.org/1999/xhtml" | |||||
xmlns:font-family="http://www.w3.org/1999/xhtml" | |||||
> | |||||
<head> | |||||
<meta charset="UTF-8" /> | |||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |||||
<title>Document</title> | |||||
<style> | |||||
html, | |||||
body { | |||||
padding: 0; | |||||
margin: 0; | |||||
font-family: SimSun; | |||||
} | |||||
.pdf { | |||||
margin: 0 auto; | |||||
padding: 10px 0 30px; | |||||
text-align: center; | |||||
} | |||||
.title { | |||||
padding: 0 0 40px 0; | |||||
font-size: 34px; | |||||
margin: 40px 0 0 0; | |||||
font-family: SimSun; | |||||
} | |||||
.tab { | |||||
padding: 0 20px; | |||||
} | |||||
.projectId { | |||||
color: #999999; | |||||
text-align: left; | |||||
margin-bottom: 8px; | |||||
} | |||||
.projectId > .time { | |||||
float: right; | |||||
} | |||||
table { | |||||
width: 100%; | |||||
border-collapse: collapse; | |||||
font-size: 16px; | |||||
table-layout: fixed; | |||||
word-break: break-all; | |||||
word-wrap: break-word; | |||||
text-align: left; | |||||
} | |||||
td { | |||||
padding: 15px 8px; | |||||
border: 1px solid; | |||||
} | |||||
.tabTit { | |||||
background-color: #eee; | |||||
} | |||||
.label { | |||||
width: 150px; | |||||
} | |||||
.sealTd { | |||||
height: 200px; | |||||
position: relative; | |||||
} | |||||
.seal { | |||||
position: absolute; | |||||
right: 20px; | |||||
bottom: 30px; | |||||
width: 150px; | |||||
} | |||||
.seal > .time { | |||||
text-align: right; | |||||
} | |||||
.content { | |||||
height: 150px; | |||||
} | |||||
.text { | |||||
min-height: 150px; | |||||
} | |||||
.content > .right { | |||||
float: right; | |||||
margin-right: 10px; | |||||
} | |||||
</style> | |||||
</head> | |||||
<body> | |||||
<div class="pdf"> | |||||
<p class="title"> | |||||
<span>#title#</span> | |||||
</p> | |||||
<div class="tab"> | |||||
<p class="projectId"> | |||||
<span> | |||||
项目编号: | |||||
<span>#projectNo#</span> | |||||
</span> | |||||
<span class="time">#time#</span> | |||||
</p> | |||||
<table> | |||||
<tbody> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">项目基本信息</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">项目名称</td> | |||||
<td colspan="3" align="center">#projectName#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">是否临时增补</td> | |||||
<td align="center">#isTemporaryAugment#</td> | |||||
<td class="label">是否一地创新全省共享项目</td> | |||||
<td align="center">#isInnovateWholeProvinceShare#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">项目负责人</td> | |||||
<td align="center">#responsibleMan#</td> | |||||
<td class="label">负责人手机号</td> | |||||
<td align="center">#responsibleManMobile#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">项目联系人</td> | |||||
<td align="center">#contactName#</td> | |||||
<td class="label">项目联系人手机号</td> | |||||
<td align="center">#contactPhone#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">建设单位</td> | |||||
<td align="center">#buildOrgName#</td> | |||||
<td class="label">建设单位统一社会信用代码</td> | |||||
<td align="center">#orgCreditCode#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">项目类型</td> | |||||
<td align="center">#projectType#</td> | |||||
<td class="label">是否首次新建</td> | |||||
<td align="center">#isFirst#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">预算年度</td> | |||||
<td align="center">#projectYear#</td> | |||||
<td class="label">建设起止时间</td> | |||||
<td align="center">#beginAndEndTime#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">四大体系</td> | |||||
<td colspan="3" align="center">#fourSystems#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">是否数字化改革项目</td> | |||||
<td align="center">#isDigitalReform#</td> | |||||
<td class="label">综合业务领域</td> | |||||
<td align="center">#bizDomain#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">立项依据</td> | |||||
<td colspan="3" align="center">#buildBasisList#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">是否上云</td> | |||||
<td align="center">#isCloud#</td> | |||||
<td class="label">云类型</td> | |||||
<td align="center">#cloudType#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">项目简介</td> | |||||
<td colspan="3" align="center">#projectIntroduction#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">资金申报情况</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">申报金额</td> | |||||
<td colspan="3" align="center">#declareAmount#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">自有资金</td> | |||||
<td align="center">#declareHaveAmount#</td> | |||||
<td class="label">政府投资-本级财政资金</td> | |||||
<td align="center">#declareGovOwnFinanceAmount#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">政府投资-上级补助资金</td> | |||||
<td align="center">#declareGovSuperiorFinanceAmount#</td> | |||||
<td class="label">银行贷款</td> | |||||
<td align="center">#declareBankLendingAmount#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">其他资金</td> | |||||
<td colspan="3" align="center">#declareOtherAmount#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">本年计划投资(万元)</td> | |||||
<td colspan="3" align="center">#yearPlanInvest#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">资金分配情况</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">软件开发</td> | |||||
<td align="center">#softwareDevelopmentAmount#</td> | |||||
<td class="label">云资源、硬件购置</td> | |||||
<td align="center">#cloudHardwarePurchaseAmount#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">第三方服务</td> | |||||
<td colspan="3" align="center">#thirdPartyAmount#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">年度支付计划</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">年度支付金额</td> | |||||
<td colspan="3" align="center">#annualPlanAmount#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">自有资金</td> | |||||
<td align="center">#annualPlanHaveAmount#</td> | |||||
<td class="label">政府投资-本级财政资金</td> | |||||
<td align="center">#annualPlanGovOwnFinanceAmount#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">政府投资-上级补助资金</td> | |||||
<td align="center">#annualPlanGovSuperiorFinanceAmount#</td> | |||||
<td class="label">银行贷款</td> | |||||
<td align="center">#annualPlanBankLendingAmount#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">其他资金</td> | |||||
<td colspan="3" align="center">#annualPlanOtherAmount#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">备注</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">备注</td> | |||||
<td colspan="3" align="center">#projectRemarks#</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="tabTit" colspan="4">单位意见</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">本级主管单位意见(盖章)</td> | |||||
<td colspan="3" class="text content"> | |||||
<div class="right"> | |||||
<p> | |||||
<span>#superOrgOpinion#</span> | |||||
</p> | |||||
<p> | |||||
<span>#superOrgAuditDate#</span> | |||||
</p> | |||||
</div> | |||||
</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label">上级主管单位意见(盖章)</td> | |||||
<td colspan="3" class="text content"> | |||||
<div class="right"> | |||||
<p> | |||||
<span>#higherOrgOpinion#</span> | |||||
</p> | |||||
<p> | |||||
<span>#higherOrgAuditDate#</span> | |||||
</p> | |||||
</div> | |||||
</td> | |||||
</tr> | |||||
<tr> | |||||
<td class="label"> | |||||
<span>#bigDataBureauName#</span> | |||||
意见(盖章) | |||||
</td> | |||||
<td colspan="3" class="text content"> | |||||
<div class="right"> | |||||
<p> | |||||
<span>#bigDataBureauOpinion#</span> | |||||
</p> | |||||
<p> | |||||
<span>#bigDataBureauAuditDate#</span> | |||||
</p> | |||||
</div> | |||||
</td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
</div> | |||||
</div> | |||||
</body> | |||||
</html> |
@@ -0,0 +1,120 @@ | |||||
<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://impl.v1.ws.api.service.yxt.gooben.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns2="http://schemas.xmlsoap.org/soap/http" xmlns:ns1="http://v1.ws.api.service.yxt.gooben.com/" name="WsItfTask" targetNamespace="http://impl.v1.ws.api.service.yxt.gooben.com/"> | |||||
<wsdl:import location="http://60.188.225.145:9501/ws/v1?wsdl=WsItfTask.wsdl" namespace="http://v1.ws.api.service.yxt.gooben.com/"> | |||||
</wsdl:import> | |||||
<wsdl:binding name="WsItfTaskSoapBinding" type="ns1:WsItfTask"> | |||||
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> | |||||
<wsdl:operation name="getSentResultCall"> | |||||
<soap:operation soapAction="" style="document"/> | |||||
<wsdl:input name="getSentResultCall"> | |||||
<soap:header message="ns1:getSentResultCall" part="token" use="literal"> | |||||
</soap:header> | |||||
<soap:body parts="parameters" use="literal"/> | |||||
</wsdl:input> | |||||
<wsdl:output name="getSentResultCallResponse"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:output> | |||||
</wsdl:operation> | |||||
<wsdl:operation name="getSubmitResult"> | |||||
<soap:operation soapAction="" style="document"/> | |||||
<wsdl:input name="getSubmitResult"> | |||||
<soap:header message="ns1:getSubmitResult" part="token" use="literal"> | |||||
</soap:header> | |||||
<soap:body parts="parameters" use="literal"/> | |||||
</wsdl:input> | |||||
<wsdl:output name="getSubmitResultResponse"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:output> | |||||
</wsdl:operation> | |||||
<wsdl:operation name="addFile"> | |||||
<soap:operation soapAction="" style="document"/> | |||||
<wsdl:input name="addFile"> | |||||
<soap:header message="ns1:addFile" part="token" use="literal"> | |||||
</soap:header> | |||||
<soap:body parts="parameters" use="literal"/> | |||||
</wsdl:input> | |||||
<wsdl:output name="addFileResponse"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:output> | |||||
</wsdl:operation> | |||||
<wsdl:operation name="submitMCLZTask"> | |||||
<soap:operation soapAction="" style="document"/> | |||||
<wsdl:input name="submitMCLZTask"> | |||||
<soap:header message="ns1:submitMCLZTask" part="token" use="literal"> | |||||
</soap:header> | |||||
<soap:body parts="parameters" use="literal"/> | |||||
</wsdl:input> | |||||
<wsdl:output name="submitMCLZTaskResponse"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:output> | |||||
</wsdl:operation> | |||||
<wsdl:operation name="getSentTaskResultCall"> | |||||
<soap:operation soapAction="" style="document"/> | |||||
<wsdl:input name="getSentTaskResultCall"> | |||||
<soap:header message="ns1:getSentTaskResultCall" part="token" use="literal"> | |||||
</soap:header> | |||||
<soap:body parts="parameters" use="literal"/> | |||||
</wsdl:input> | |||||
<wsdl:output name="getSentTaskResultCallResponse"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:output> | |||||
</wsdl:operation> | |||||
<wsdl:operation name="getSentTaskResultSms"> | |||||
<soap:operation soapAction="" style="document"/> | |||||
<wsdl:input name="getSentTaskResultSms"> | |||||
<soap:header message="ns1:getSentTaskResultSms" part="token" use="literal"> | |||||
</soap:header> | |||||
<soap:body parts="parameters" use="literal"/> | |||||
</wsdl:input> | |||||
<wsdl:output name="getSentTaskResultSmsResponse"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:output> | |||||
</wsdl:operation> | |||||
<wsdl:operation name="submitTask"> | |||||
<soap:operation soapAction="" style="document"/> | |||||
<wsdl:input name="submitTask"> | |||||
<soap:header message="ns1:submitTask" part="token" use="literal"> | |||||
</soap:header> | |||||
<soap:body parts="parameters" use="literal"/> | |||||
</wsdl:input> | |||||
<wsdl:output name="submitTaskResponse"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:output> | |||||
</wsdl:operation> | |||||
<wsdl:operation name="getSentResultSms"> | |||||
<soap:operation soapAction="" style="document"/> | |||||
<wsdl:input name="getSentResultSms"> | |||||
<soap:header message="ns1:getSentResultSms" part="token" use="literal"> | |||||
</soap:header> | |||||
<soap:body parts="parameters" use="literal"/> | |||||
</wsdl:input> | |||||
<wsdl:output name="getSentResultSmsResponse"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:output> | |||||
</wsdl:operation> | |||||
<wsdl:operation name="authorization"> | |||||
<soap:operation soapAction="" style="document"/> | |||||
<wsdl:input name="authorization"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:input> | |||||
<wsdl:output name="authorizationResponse"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:output> | |||||
</wsdl:operation> | |||||
<wsdl:operation name="getSmsReceive"> | |||||
<soap:operation soapAction="" style="document"/> | |||||
<wsdl:input name="getSmsReceive"> | |||||
<soap:header message="ns1:getSmsReceive" part="token" use="literal"> | |||||
</soap:header> | |||||
<soap:body parts="parameters" use="literal"/> | |||||
</wsdl:input> | |||||
<wsdl:output name="getSmsReceiveResponse"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:output> | |||||
</wsdl:operation> | |||||
</wsdl:binding> | |||||
<wsdl:service name="WsItfTask"> | |||||
<wsdl:port binding="tns:WsItfTaskSoapBinding" name="WsItfTaskImplPort"> | |||||
<soap:address location="http://60.188.225.145:9501/ws/v1"/> | |||||
</wsdl:port> | |||||
</wsdl:service> | |||||
</wsdl:definitions> |
@@ -0,0 +1,120 @@ | |||||
<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://impl.v1.ws.api.service.yxt.gooben.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns2="http://schemas.xmlsoap.org/soap/http" xmlns:ns1="http://v1.ws.api.service.yxt.gooben.com/" name="WsItfTask" targetNamespace="http://impl.v1.ws.api.service.yxt.gooben.com/"> | |||||
<wsdl:import location="http://120.26.44.207:9501/ws/v1?wsdl=WsItfTask.wsdl" namespace="http://v1.ws.api.service.yxt.gooben.com/"> | |||||
</wsdl:import> | |||||
<wsdl:binding name="WsItfTaskSoapBinding" type="ns1:WsItfTask"> | |||||
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> | |||||
<wsdl:operation name="getSentResultCall"> | |||||
<soap:operation soapAction="" style="document"/> | |||||
<wsdl:input name="getSentResultCall"> | |||||
<soap:header message="ns1:getSentResultCall" part="token" use="literal"> | |||||
</soap:header> | |||||
<soap:body parts="parameters" use="literal"/> | |||||
</wsdl:input> | |||||
<wsdl:output name="getSentResultCallResponse"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:output> | |||||
</wsdl:operation> | |||||
<wsdl:operation name="getSubmitResult"> | |||||
<soap:operation soapAction="" style="document"/> | |||||
<wsdl:input name="getSubmitResult"> | |||||
<soap:header message="ns1:getSubmitResult" part="token" use="literal"> | |||||
</soap:header> | |||||
<soap:body parts="parameters" use="literal"/> | |||||
</wsdl:input> | |||||
<wsdl:output name="getSubmitResultResponse"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:output> | |||||
</wsdl:operation> | |||||
<wsdl:operation name="addFile"> | |||||
<soap:operation soapAction="" style="document"/> | |||||
<wsdl:input name="addFile"> | |||||
<soap:header message="ns1:addFile" part="token" use="literal"> | |||||
</soap:header> | |||||
<soap:body parts="parameters" use="literal"/> | |||||
</wsdl:input> | |||||
<wsdl:output name="addFileResponse"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:output> | |||||
</wsdl:operation> | |||||
<wsdl:operation name="submitMCLZTask"> | |||||
<soap:operation soapAction="" style="document"/> | |||||
<wsdl:input name="submitMCLZTask"> | |||||
<soap:header message="ns1:submitMCLZTask" part="token" use="literal"> | |||||
</soap:header> | |||||
<soap:body parts="parameters" use="literal"/> | |||||
</wsdl:input> | |||||
<wsdl:output name="submitMCLZTaskResponse"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:output> | |||||
</wsdl:operation> | |||||
<wsdl:operation name="getSentTaskResultCall"> | |||||
<soap:operation soapAction="" style="document"/> | |||||
<wsdl:input name="getSentTaskResultCall"> | |||||
<soap:header message="ns1:getSentTaskResultCall" part="token" use="literal"> | |||||
</soap:header> | |||||
<soap:body parts="parameters" use="literal"/> | |||||
</wsdl:input> | |||||
<wsdl:output name="getSentTaskResultCallResponse"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:output> | |||||
</wsdl:operation> | |||||
<wsdl:operation name="getSentTaskResultSms"> | |||||
<soap:operation soapAction="" style="document"/> | |||||
<wsdl:input name="getSentTaskResultSms"> | |||||
<soap:header message="ns1:getSentTaskResultSms" part="token" use="literal"> | |||||
</soap:header> | |||||
<soap:body parts="parameters" use="literal"/> | |||||
</wsdl:input> | |||||
<wsdl:output name="getSentTaskResultSmsResponse"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:output> | |||||
</wsdl:operation> | |||||
<wsdl:operation name="submitTask"> | |||||
<soap:operation soapAction="" style="document"/> | |||||
<wsdl:input name="submitTask"> | |||||
<soap:header message="ns1:submitTask" part="token" use="literal"> | |||||
</soap:header> | |||||
<soap:body parts="parameters" use="literal"/> | |||||
</wsdl:input> | |||||
<wsdl:output name="submitTaskResponse"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:output> | |||||
</wsdl:operation> | |||||
<wsdl:operation name="getSentResultSms"> | |||||
<soap:operation soapAction="" style="document"/> | |||||
<wsdl:input name="getSentResultSms"> | |||||
<soap:header message="ns1:getSentResultSms" part="token" use="literal"> | |||||
</soap:header> | |||||
<soap:body parts="parameters" use="literal"/> | |||||
</wsdl:input> | |||||
<wsdl:output name="getSentResultSmsResponse"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:output> | |||||
</wsdl:operation> | |||||
<wsdl:operation name="authorization"> | |||||
<soap:operation soapAction="" style="document"/> | |||||
<wsdl:input name="authorization"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:input> | |||||
<wsdl:output name="authorizationResponse"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:output> | |||||
</wsdl:operation> | |||||
<wsdl:operation name="getSmsReceive"> | |||||
<soap:operation soapAction="" style="document"/> | |||||
<wsdl:input name="getSmsReceive"> | |||||
<soap:header message="ns1:getSmsReceive" part="token" use="literal"> | |||||
</soap:header> | |||||
<soap:body parts="parameters" use="literal"/> | |||||
</wsdl:input> | |||||
<wsdl:output name="getSmsReceiveResponse"> | |||||
<soap:body use="literal"/> | |||||
</wsdl:output> | |||||
</wsdl:operation> | |||||
</wsdl:binding> | |||||
<wsdl:service name="WsItfTask"> | |||||
<wsdl:port binding="tns:WsItfTaskSoapBinding" name="WsItfTaskImplPort"> | |||||
<soap:address location="http://120.26.44.207:9501/ws/v1"/> | |||||
</wsdl:port> | |||||
</wsdl:service> | |||||
</wsdl:definitions> |
@@ -0,0 +1,66 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<project xmlns="http://maven.apache.org/POM/4.0.0" | |||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||||
<parent> | |||||
<artifactId>kq-value-added-project</artifactId> | |||||
<groupId>com.ningdatech</groupId> | |||||
<version>1.0.0</version> | |||||
</parent> | |||||
<modelVersion>4.0.0</modelVersion> | |||||
<artifactId>ningda-generator</artifactId> | |||||
<dependencies> | |||||
<dependency> | |||||
<groupId>com.baomidou</groupId> | |||||
<artifactId>mybatis-plus-boot-starter</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.baomidou</groupId> | |||||
<artifactId>mybatis-plus-generator</artifactId> | |||||
<version>${mybatis.plus.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.freemarker</groupId> | |||||
<artifactId>freemarker</artifactId> | |||||
</dependency> | |||||
<!--Mysql数据库驱动--> | |||||
<dependency> | |||||
<groupId>mysql</groupId> | |||||
<artifactId>mysql-connector-java</artifactId> | |||||
</dependency> | |||||
<!-- https://mvnrepository.com/artifact/org.apache.directory.studio/org.apache.commons.codec --> | |||||
<dependency> | |||||
<groupId>org.apache.directory.studio</groupId> | |||||
<artifactId>org.apache.commons.codec</artifactId> | |||||
<version>1.8</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>junit</groupId> | |||||
<artifactId>junit</artifactId> | |||||
<version>4.12</version> | |||||
<scope>test</scope> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-test</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-test</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.ningdatech</groupId> | |||||
<artifactId>ningda-car-api</artifactId> | |||||
<version>1.0.0</version> | |||||
</dependency> | |||||
</dependencies> | |||||
</project> |
@@ -0,0 +1,63 @@ | |||||
package com.ningdatech.generator.config; | |||||
import com.baomidou.mybatisplus.generator.FastAutoGenerator; | |||||
import com.baomidou.mybatisplus.generator.config.OutputFile; | |||||
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; | |||||
import java.util.Collections; | |||||
/** | |||||
* @description: 自动生成code代码 | |||||
* @author: zpf | |||||
* @date: 2023/01/03 09:20 | |||||
*/ | |||||
public class GeneratorCodeKingbaseConfig { | |||||
private static final String PATH_LXX = "/Users/liuxinxin/IdeaProjects/project-management/pmapi/src/main/java"; | |||||
private static final String PATH_YYD = "/Users/wendy/code project/java/project-management/pmapi/src/main/java"; | |||||
private static final String PATH_LS = ""; | |||||
private static final String PATH_ZPF = "D:\\ningda\\kq-value-added-project\\kqapi\\src\\main\\java"; | |||||
private static final String PATH_CMM = "D:\\work\\project-management\\project-management\\pmapi\\src\\main\\java"; | |||||
private static final String URL = "jdbc:mysql://47.98.125.47:3306/kqzzsfw?serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false"; | |||||
private static final String USER_NAME = "root"; | |||||
private static final String PASSWORD = "NingdaKeji123!"; | |||||
private static void generate(String author, String packageName, String path, String... tableNames) { | |||||
FastAutoGenerator.create(URL, USER_NAME, PASSWORD) | |||||
.globalConfig(builder -> { | |||||
// 设置作者 | |||||
builder.author(author) | |||||
// 开启 swagger 模式 | |||||
.enableSwagger() | |||||
// 覆盖已生成文件 | |||||
.fileOverride() | |||||
// 指定输出目录 | |||||
.outputDir(path); | |||||
}) | |||||
.packageConfig(builder -> { | |||||
// 设置父包名 | |||||
builder.parent("com.ningdatech") | |||||
// 设置父包模块名 | |||||
.moduleName("kqapi." + packageName) | |||||
// 设置mapperXml生成路径 | |||||
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, | |||||
//设置自己的生成路径 | |||||
path + "/com/ningdatech/kqapi/" + packageName + "/mapper")); | |||||
}) | |||||
.strategyConfig(builder -> { | |||||
builder.addTablePrefix(""); | |||||
// 设置需要生成的表名 | |||||
builder.addInclude(tableNames); | |||||
}) | |||||
// 使用Freemarker引擎模板,默认的是Velocity引擎模板 | |||||
.templateEngine(new FreemarkerTemplateEngine()) | |||||
.execute(); | |||||
} | |||||
public static void main(String[] args) { | |||||
//generate("Liuxinxin", "expert", PATH_LXX, "expert_gov_business_strip"); | |||||
generate("ZPF", "zzsfw", PATH_ZPF, "nd_kq_zzsfw_menu"); | |||||
} | |||||
} |
@@ -0,0 +1,153 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||||
<modelVersion>4.0.0</modelVersion> | |||||
<groupId>com.ningdatech</groupId> | |||||
<artifactId>kq-value-added-project</artifactId> | |||||
<packaging>pom</packaging> | |||||
<version>1.0.0</version> | |||||
<name>kq-value-added-project</name> | |||||
<description>柯桥增值式服务项目</description> | |||||
<properties> | |||||
<skipTests>true</skipTests> | |||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | |||||
<spring-boot.version>2.6.11</spring-boot.version> | |||||
<maven.compiler.source>1.8</maven.compiler.source> | |||||
<maven.compiler.target>1.8</maven.compiler.target> | |||||
<jwt.version>3.7.0</jwt.version> | |||||
<mybatis.plus.version>3.5.1</mybatis.plus.version> | |||||
<io.springfox-swagger2.version>3.0.0</io.springfox-swagger2.version> | |||||
<swagger-knife.version>3.0.3</swagger-knife.version> | |||||
<fastjson.version>1.2.83</fastjson.version> | |||||
<guava.version>31.1-jre</guava.version> | |||||
<commons-pool2.version>2.11.1</commons-pool2.version> | |||||
</properties> | |||||
<dependencyManagement> | |||||
<dependencies> | |||||
<dependency> | |||||
<groupId>org.apache.poi</groupId> | |||||
<artifactId>poi</artifactId> | |||||
<version>5.2.2</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.poi</groupId> | |||||
<artifactId>poi-ooxml</artifactId> | |||||
<version>5.2.2</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.alibaba</groupId> | |||||
<artifactId>fastjson</artifactId> | |||||
<version>${fastjson.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-dependencies</artifactId> | |||||
<version>${spring-boot.version}</version> | |||||
<type>pom</type> | |||||
<scope>import</scope> | |||||
</dependency> | |||||
<!-- mybatis plus --> | |||||
<dependency> | |||||
<groupId>com.baomidou</groupId> | |||||
<artifactId>mybatis-plus-boot-starter</artifactId> | |||||
<version>${mybatis.plus.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.google.guava</groupId> | |||||
<artifactId>guava</artifactId> | |||||
<version>${guava.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.ningdatech</groupId> | |||||
<artifactId>nd-basic</artifactId> | |||||
<version>1.0.0</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.baomidou</groupId> | |||||
<artifactId>mybatis-plus-extension</artifactId> | |||||
<version>${mybatis.plus.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.ningdatech</groupId> | |||||
<artifactId>nd-swagger2-starter</artifactId> | |||||
<version>1.0.0</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.alibaba</groupId> | |||||
<artifactId>easyexcel-core</artifactId> | |||||
<version>3.1.2</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.ningdatech</groupId> | |||||
<artifactId>nd-file-starter</artifactId> | |||||
<version>1.0.0</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.ningdatech</groupId> | |||||
<artifactId>nd-zwdd-starter</artifactId> | |||||
<version>1.0.0</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.ningdatech</groupId> | |||||
<artifactId>nd-cache-starter</artifactId> | |||||
<version>1.0.0</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.ningdatech</groupId> | |||||
<artifactId>nd-log-starter</artifactId> | |||||
<version>1.0.0</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.ningdatech</groupId> | |||||
<artifactId>nd-irs-starter</artifactId> | |||||
<version>1.0.0</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>joda-time</groupId> | |||||
<artifactId>joda-time</artifactId> | |||||
<version>2.10.6</version> | |||||
</dependency> | |||||
</dependencies> | |||||
</dependencyManagement> | |||||
<repositories> | |||||
<!--阿里云主仓库,代理了maven central和jcenter仓库--> | |||||
<repository> | |||||
<id>aliyun</id> | |||||
<name>aliyun</name> | |||||
<url>https://maven.aliyun.com/repository/public</url> | |||||
<releases> | |||||
<enabled>true</enabled> | |||||
</releases> | |||||
<snapshots> | |||||
<enabled>false</enabled> | |||||
</snapshots> | |||||
</repository> | |||||
</repositories> | |||||
<pluginRepositories> | |||||
<!--阿里云代理Spring 插件仓库--> | |||||
<pluginRepository> | |||||
<id>spring-plugin</id> | |||||
<name>spring-plugin</name> | |||||
<url>https://maven.aliyun.com/repository/spring-plugin</url> | |||||
<releases> | |||||
<enabled>true</enabled> | |||||
</releases> | |||||
<snapshots> | |||||
<enabled>false</enabled> | |||||
</snapshots> | |||||
</pluginRepository> | |||||
</pluginRepositories> | |||||
<modules> | |||||
<module>kqapi</module> | |||||
<module>ningda-generator</module> | |||||
</modules> | |||||
</project> |