@@ -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> |