@@ -1,8 +0,0 @@ | |||||
### IDEA ### | |||||
*.iml | |||||
*/target/* | |||||
*/*.iml | |||||
/.gradle/ | |||||
*.pid | |||||
logs | |||||
/.idea/ |
@@ -0,0 +1 @@ | |||||
FROM irsfactoryrepository.zj.gov.cn/base/base_image:1.0 |
@@ -1 +1,2 @@ | |||||
# README | |||||
柯桥增值式服务 | 柯桥增值式服务 |
@@ -0,0 +1,2 @@ | |||||
artifactType=1 | |||||
artifactFile=kqapi/target/kqapi.jar |
@@ -0,0 +1,446 @@ | |||||
2023-10-27 11:11:07.300 [main] ERROR o.s.boot.SpringApplication -Application run failed | |||||
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqController' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\controller\DscSxAdsShareItemQltQlsxCommonIDVKqController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'matterManage' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\manage\MatterManage.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) | |||||
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) | |||||
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) | |||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) | |||||
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:745) | |||||
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:420) | |||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) | |||||
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:144) | |||||
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) | |||||
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) | |||||
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124) | |||||
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:118) | |||||
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) | |||||
at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.prepareTestInstance(SpringBootDependencyInjectionTestExecutionListener.java:43) | |||||
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:248) | |||||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227) | |||||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) | |||||
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) | |||||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) | |||||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246) | |||||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) | |||||
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) | |||||
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) | |||||
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) | |||||
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) | |||||
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) | |||||
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) | |||||
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) | |||||
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) | |||||
at org.junit.runners.ParentRunner.run(ParentRunner.java:413) | |||||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) | |||||
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) | |||||
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) | |||||
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) | |||||
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) | |||||
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) | |||||
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) | |||||
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54) | |||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'matterManage' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\manage\MatterManage.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) | |||||
... 47 common frames omitted | |||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659) | |||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:639) | |||||
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) | |||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) | |||||
... 61 common frames omitted | |||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1534) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1417) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:656) | |||||
... 76 common frames omitted | |||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:541) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1519) | |||||
... 87 common frames omitted | |||||
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) | |||||
... 100 common frames omitted | |||||
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) | |||||
... 114 common frames omitted | |||||
Caused by: java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.util.Assert.state(Assert.java:97) | |||||
at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.determineDriverClassName(DataSourceProperties.java:241) | |||||
at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.initializeDataSourceBuilder(DataSourceProperties.java:193) | |||||
at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource(DataSourceConfiguration.java:48) | |||||
at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari.dataSource(DataSourceConfiguration.java:90) | |||||
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) | |||||
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) | |||||
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) | |||||
at java.lang.reflect.Method.invoke(Method.java:498) | |||||
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) | |||||
... 115 common frames omitted | |||||
2023-10-27 11:11:08.114 [main] ERROR o.s.boot.SpringApplication -Application run failed | |||||
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqController' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\controller\DscSxAdsShareItemQltQlsxCommonIDVKqController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'matterManage' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\manage\MatterManage.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) | |||||
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) | |||||
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) | |||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) | |||||
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:745) | |||||
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:420) | |||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) | |||||
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:144) | |||||
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) | |||||
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) | |||||
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124) | |||||
at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.outputConditionEvaluationReport(SpringBootDependencyInjectionTestExecutionListener.java:53) | |||||
at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.prepareTestInstance(SpringBootDependencyInjectionTestExecutionListener.java:46) | |||||
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:248) | |||||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227) | |||||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) | |||||
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) | |||||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) | |||||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246) | |||||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) | |||||
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) | |||||
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) | |||||
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) | |||||
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) | |||||
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) | |||||
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) | |||||
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) | |||||
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) | |||||
at org.junit.runners.ParentRunner.run(ParentRunner.java:413) | |||||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) | |||||
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) | |||||
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) | |||||
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) | |||||
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) | |||||
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) | |||||
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) | |||||
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54) | |||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'matterManage' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\manage\MatterManage.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) | |||||
... 46 common frames omitted | |||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659) | |||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:639) | |||||
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) | |||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) | |||||
... 60 common frames omitted | |||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1534) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1417) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:656) | |||||
... 75 common frames omitted | |||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:541) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1519) | |||||
... 86 common frames omitted | |||||
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) | |||||
... 99 common frames omitted | |||||
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) | |||||
... 113 common frames omitted | |||||
Caused by: java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.util.Assert.state(Assert.java:97) | |||||
at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.determineDriverClassName(DataSourceProperties.java:241) | |||||
at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.initializeDataSourceBuilder(DataSourceProperties.java:193) | |||||
at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource(DataSourceConfiguration.java:48) | |||||
at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari.dataSource(DataSourceConfiguration.java:90) | |||||
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) | |||||
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) | |||||
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) | |||||
at java.lang.reflect.Method.invoke(Method.java:498) | |||||
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) | |||||
... 114 common frames omitted | |||||
2023-10-27 11:11:08.118 [main] ERROR o.s.test.context.TestContextManager -Caught exception while allowing TestExecutionListener [org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener@54504ecd] to prepare test instance [com.ningdatech.kqapi.menu.MenuTest@2ef14fe] | |||||
java.lang.IllegalStateException: Failed to load ApplicationContext | |||||
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132) | |||||
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124) | |||||
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:118) | |||||
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) | |||||
at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.prepareTestInstance(SpringBootDependencyInjectionTestExecutionListener.java:43) | |||||
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:248) | |||||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227) | |||||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) | |||||
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) | |||||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) | |||||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246) | |||||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) | |||||
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) | |||||
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) | |||||
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) | |||||
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) | |||||
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) | |||||
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) | |||||
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) | |||||
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) | |||||
at org.junit.runners.ParentRunner.run(ParentRunner.java:413) | |||||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) | |||||
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) | |||||
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) | |||||
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) | |||||
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) | |||||
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) | |||||
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) | |||||
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54) | |||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqController' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\controller\DscSxAdsShareItemQltQlsxCommonIDVKqController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'matterManage' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\manage\MatterManage.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) | |||||
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) | |||||
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) | |||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) | |||||
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:745) | |||||
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:420) | |||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) | |||||
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:144) | |||||
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) | |||||
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) | |||||
... 28 common frames omitted | |||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'matterManage' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\manage\MatterManage.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) | |||||
... 47 common frames omitted | |||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659) | |||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:639) | |||||
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) | |||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) | |||||
... 61 common frames omitted | |||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1534) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1417) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:656) | |||||
... 76 common frames omitted | |||||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:541) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1519) | |||||
... 87 common frames omitted | |||||
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) | |||||
... 100 common frames omitted | |||||
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) | |||||
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) | |||||
... 114 common frames omitted | |||||
Caused by: java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||||
at org.springframework.util.Assert.state(Assert.java:97) | |||||
at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.determineDriverClassName(DataSourceProperties.java:241) | |||||
at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.initializeDataSourceBuilder(DataSourceProperties.java:193) | |||||
at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource(DataSourceConfiguration.java:48) | |||||
at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari.dataSource(DataSourceConfiguration.java:90) | |||||
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) | |||||
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) | |||||
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) | |||||
at java.lang.reflect.Method.invoke(Method.java:498) | |||||
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) | |||||
... 115 common frames omitted |
@@ -0,0 +1,92 @@ | |||||
2023-11-17 10:49:40.856 [background-preinit] INFO o.h.validator.internal.util.Version -HV000001: Hibernate Validator 6.2.4.Final | |||||
2023-11-17 10:49:40.871 [main] INFO c.n.kqapi.menu.DuplicationTest -Starting DuplicationTest using Java 1.8.0_131 on LAPTOP-NQGEQP03 with PID 1660 (started by PoffyZhang in D:\ningda\kq-value-added-project\kqapi) | |||||
2023-11-17 10:49:40.872 [main] INFO c.n.kqapi.menu.DuplicationTest -The following 1 profile is active: "dev" | |||||
2023-11-17 10:49:43.409 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer -Tomcat initialized with port(s): 0 (http) | |||||
2023-11-17 10:49:43.422 [main] INFO o.a.coyote.http11.Http11NioProtocol -Initializing ProtocolHandler ["http-nio-auto-1"] | |||||
2023-11-17 10:49:43.422 [main] INFO o.a.catalina.core.StandardService -Starting service [Tomcat] | |||||
2023-11-17 10:49:43.423 [main] INFO o.a.catalina.core.StandardEngine -Starting Servlet engine: [Apache Tomcat/9.0.65] | |||||
2023-11-17 10:49:43.548 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/kq] -Initializing Spring embedded WebApplicationContext | |||||
2023-11-17 10:49:43.548 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext -Root WebApplicationContext: initialization completed in 2619 ms | |||||
2023-11-17 10:49:45.799 [main] INFO com.ningdatech.swagger.SwaggerConfig -swagger文档加载…… | |||||
2023-11-17 10:49:46.978 [main] INFO c.n.kqapi.common.config.BeanConfig ------restTemplate-----初始化完成 | |||||
2023-11-17 10:49:47.437 [main] INFO s.d.s.w.WebMvcPropertySourcedRequestMappingHandlerMapping -Mapped URL path [/v2/api-docs] onto method [springfox.documentation.swagger2.web.Swagger2ControllerWebMvc#getDocumentation(String, HttpServletRequest)] | |||||
2023-11-17 10:49:47.819 [main] WARN o.s.b.a.f.FreeMarkerAutoConfiguration -Cannot find template location(s): [classpath:/templates/] (please add some templates, check your FreeMarker configuration, or set spring.freemarker.checkTemplateLocation=false) | |||||
2023-11-17 10:49:48.370 [main] INFO o.a.coyote.http11.Http11NioProtocol -Starting ProtocolHandler ["http-nio-auto-1"] | |||||
2023-11-17 10:49:48.405 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer -Tomcat started on port(s): 8882 (http) with context path '/kq' | |||||
2023-11-17 10:49:48.406 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper -Documentation plugins bootstrapped | |||||
2023-11-17 10:49:48.412 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper -Found 1 custom documentation plugin(s) | |||||
2023-11-17 10:49:48.459 [main] INFO s.d.s.w.s.ApiListingReferenceScanner -Scanning for api listing references | |||||
2023-11-17 10:49:48.662 [main] INFO c.n.kqapi.menu.DuplicationTest -Started DuplicationTest in 8.343 seconds (JVM running for 9.853) | |||||
2023-11-17 10:49:50.027 [main] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Starting... | |||||
2023-11-17 10:49:50.550 [main] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Start completed. | |||||
2023-11-17 10:50:09.079 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Shutdown initiated... | |||||
2023-11-17 10:50:09.088 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Shutdown completed. | |||||
2023-11-17 10:53:13.468 [background-preinit] INFO o.h.validator.internal.util.Version -HV000001: Hibernate Validator 6.2.4.Final | |||||
2023-11-17 10:53:13.482 [main] INFO c.n.kqapi.menu.DuplicationTest -Starting DuplicationTest using Java 1.8.0_131 on LAPTOP-NQGEQP03 with PID 25504 (started by PoffyZhang in D:\ningda\kq-value-added-project\kqapi) | |||||
2023-11-17 10:53:13.483 [main] INFO c.n.kqapi.menu.DuplicationTest -The following 1 profile is active: "dev" | |||||
2023-11-17 10:53:15.962 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer -Tomcat initialized with port(s): 0 (http) | |||||
2023-11-17 10:53:15.973 [main] INFO o.a.coyote.http11.Http11NioProtocol -Initializing ProtocolHandler ["http-nio-auto-1"] | |||||
2023-11-17 10:53:15.973 [main] INFO o.a.catalina.core.StandardService -Starting service [Tomcat] | |||||
2023-11-17 10:53:15.973 [main] INFO o.a.catalina.core.StandardEngine -Starting Servlet engine: [Apache Tomcat/9.0.65] | |||||
2023-11-17 10:53:16.096 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/kq] -Initializing Spring embedded WebApplicationContext | |||||
2023-11-17 10:53:16.097 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext -Root WebApplicationContext: initialization completed in 2552 ms | |||||
2023-11-17 10:53:18.302 [main] INFO com.ningdatech.swagger.SwaggerConfig -swagger文档加载…… | |||||
2023-11-17 10:53:19.393 [main] INFO c.n.kqapi.common.config.BeanConfig ------restTemplate-----初始化完成 | |||||
2023-11-17 10:53:19.765 [main] INFO s.d.s.w.WebMvcPropertySourcedRequestMappingHandlerMapping -Mapped URL path [/v2/api-docs] onto method [springfox.documentation.swagger2.web.Swagger2ControllerWebMvc#getDocumentation(String, HttpServletRequest)] | |||||
2023-11-17 10:53:19.992 [main] WARN o.s.b.a.f.FreeMarkerAutoConfiguration -Cannot find template location(s): [classpath:/templates/] (please add some templates, check your FreeMarker configuration, or set spring.freemarker.checkTemplateLocation=false) | |||||
2023-11-17 10:53:20.272 [main] INFO o.a.coyote.http11.Http11NioProtocol -Starting ProtocolHandler ["http-nio-auto-1"] | |||||
2023-11-17 10:53:20.303 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer -Tomcat started on port(s): 9130 (http) with context path '/kq' | |||||
2023-11-17 10:53:20.304 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper -Documentation plugins bootstrapped | |||||
2023-11-17 10:53:20.309 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper -Found 1 custom documentation plugin(s) | |||||
2023-11-17 10:53:20.357 [main] INFO s.d.s.w.s.ApiListingReferenceScanner -Scanning for api listing references | |||||
2023-11-17 10:53:20.526 [main] INFO c.n.kqapi.menu.DuplicationTest -Started DuplicationTest in 7.616 seconds (JVM running for 8.671) | |||||
2023-11-17 10:53:21.705 [main] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Starting... | |||||
2023-11-17 10:53:22.183 [main] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Start completed. | |||||
2023-11-17 10:58:52.050 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Shutdown initiated... | |||||
2023-11-17 10:58:52.057 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Shutdown completed. | |||||
2023-11-17 11:21:22.316 [background-preinit] INFO o.h.validator.internal.util.Version -HV000001: Hibernate Validator 6.2.4.Final | |||||
2023-11-17 11:21:22.329 [main] INFO c.n.kqapi.menu.DuplicationTest -Starting DuplicationTest using Java 1.8.0_131 on LAPTOP-NQGEQP03 with PID 31264 (started by PoffyZhang in D:\ningda\kq-value-added-project\kqapi) | |||||
2023-11-17 11:21:22.329 [main] INFO c.n.kqapi.menu.DuplicationTest -The following 1 profile is active: "dev" | |||||
2023-11-17 11:21:24.781 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer -Tomcat initialized with port(s): 0 (http) | |||||
2023-11-17 11:21:24.801 [main] INFO o.a.coyote.http11.Http11NioProtocol -Initializing ProtocolHandler ["http-nio-auto-1"] | |||||
2023-11-17 11:21:24.802 [main] INFO o.a.catalina.core.StandardService -Starting service [Tomcat] | |||||
2023-11-17 11:21:24.802 [main] INFO o.a.catalina.core.StandardEngine -Starting Servlet engine: [Apache Tomcat/9.0.65] | |||||
2023-11-17 11:21:24.953 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/kq] -Initializing Spring embedded WebApplicationContext | |||||
2023-11-17 11:21:24.954 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext -Root WebApplicationContext: initialization completed in 2564 ms | |||||
2023-11-17 11:21:27.791 [main] INFO com.ningdatech.swagger.SwaggerConfig -swagger文档加载…… | |||||
2023-11-17 11:21:28.932 [main] INFO c.n.kqapi.common.config.BeanConfig ------restTemplate-----初始化完成 | |||||
2023-11-17 11:21:29.324 [main] INFO s.d.s.w.WebMvcPropertySourcedRequestMappingHandlerMapping -Mapped URL path [/v2/api-docs] onto method [springfox.documentation.swagger2.web.Swagger2ControllerWebMvc#getDocumentation(String, HttpServletRequest)] | |||||
2023-11-17 11:21:29.572 [main] WARN o.s.b.a.f.FreeMarkerAutoConfiguration -Cannot find template location(s): [classpath:/templates/] (please add some templates, check your FreeMarker configuration, or set spring.freemarker.checkTemplateLocation=false) | |||||
2023-11-17 11:21:29.847 [main] INFO o.a.coyote.http11.Http11NioProtocol -Starting ProtocolHandler ["http-nio-auto-1"] | |||||
2023-11-17 11:21:29.873 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer -Tomcat started on port(s): 1891 (http) with context path '/kq' | |||||
2023-11-17 11:21:29.875 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper -Documentation plugins bootstrapped | |||||
2023-11-17 11:21:29.879 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper -Found 1 custom documentation plugin(s) | |||||
2023-11-17 11:21:29.915 [main] INFO s.d.s.w.s.ApiListingReferenceScanner -Scanning for api listing references | |||||
2023-11-17 11:21:30.057 [main] INFO c.n.kqapi.menu.DuplicationTest -Started DuplicationTest in 8.307 seconds (JVM running for 9.268) | |||||
2023-11-17 11:21:30.482 [main] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Starting... | |||||
2023-11-17 11:21:30.894 [main] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Start completed. | |||||
2023-11-17 11:21:34.814 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Shutdown initiated... | |||||
2023-11-17 11:21:34.821 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Shutdown completed. | |||||
2023-11-17 11:22:30.687 [background-preinit] INFO o.h.validator.internal.util.Version -HV000001: Hibernate Validator 6.2.4.Final | |||||
2023-11-17 11:22:30.699 [main] INFO c.n.kqapi.menu.DuplicationTest -Starting DuplicationTest using Java 1.8.0_131 on LAPTOP-NQGEQP03 with PID 33544 (started by PoffyZhang in D:\ningda\kq-value-added-project\kqapi) | |||||
2023-11-17 11:22:30.700 [main] INFO c.n.kqapi.menu.DuplicationTest -The following 1 profile is active: "dev" | |||||
2023-11-17 11:22:33.079 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer -Tomcat initialized with port(s): 0 (http) | |||||
2023-11-17 11:22:33.094 [main] INFO o.a.coyote.http11.Http11NioProtocol -Initializing ProtocolHandler ["http-nio-auto-1"] | |||||
2023-11-17 11:22:33.095 [main] INFO o.a.catalina.core.StandardService -Starting service [Tomcat] | |||||
2023-11-17 11:22:33.096 [main] INFO o.a.catalina.core.StandardEngine -Starting Servlet engine: [Apache Tomcat/9.0.65] | |||||
2023-11-17 11:22:33.228 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/kq] -Initializing Spring embedded WebApplicationContext | |||||
2023-11-17 11:22:33.228 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext -Root WebApplicationContext: initialization completed in 2476 ms | |||||
2023-11-17 11:22:35.478 [main] INFO com.ningdatech.swagger.SwaggerConfig -swagger文档加载…… | |||||
2023-11-17 11:22:36.643 [main] INFO c.n.kqapi.common.config.BeanConfig ------restTemplate-----初始化完成 | |||||
2023-11-17 11:22:37.045 [main] INFO s.d.s.w.WebMvcPropertySourcedRequestMappingHandlerMapping -Mapped URL path [/v2/api-docs] onto method [springfox.documentation.swagger2.web.Swagger2ControllerWebMvc#getDocumentation(String, HttpServletRequest)] | |||||
2023-11-17 11:22:37.263 [main] WARN o.s.b.a.f.FreeMarkerAutoConfiguration -Cannot find template location(s): [classpath:/templates/] (please add some templates, check your FreeMarker configuration, or set spring.freemarker.checkTemplateLocation=false) | |||||
2023-11-17 11:22:37.506 [main] INFO o.a.coyote.http11.Http11NioProtocol -Starting ProtocolHandler ["http-nio-auto-1"] | |||||
2023-11-17 11:22:37.532 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer -Tomcat started on port(s): 1929 (http) with context path '/kq' | |||||
2023-11-17 11:22:37.533 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper -Documentation plugins bootstrapped | |||||
2023-11-17 11:22:37.536 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper -Found 1 custom documentation plugin(s) | |||||
2023-11-17 11:22:37.572 [main] INFO s.d.s.w.s.ApiListingReferenceScanner -Scanning for api listing references | |||||
2023-11-17 11:22:37.707 [main] INFO c.n.kqapi.menu.DuplicationTest -Started DuplicationTest in 7.587 seconds (JVM running for 8.526) | |||||
2023-11-17 11:22:38.105 [main] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Starting... | |||||
2023-11-17 11:22:38.584 [main] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Start completed. | |||||
2023-11-17 11:23:16.073 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Shutdown initiated... | |||||
2023-11-17 11:23:16.081 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Shutdown completed. |
@@ -0,0 +1,23 @@ | |||||
2023-11-22 16:34:54.722 [background-preinit] INFO o.h.validator.internal.util.Version -HV000001: Hibernate Validator 6.2.4.Final | |||||
2023-11-22 16:34:54.736 [main] INFO c.n.kqapi.menu.DuplicationTest -Starting DuplicationTest using Java 1.8.0_131 on LAPTOP-NQGEQP03 with PID 7560 (started by PoffyZhang in D:\ningda\kq-value-added-project\kqapi) | |||||
2023-11-22 16:34:54.736 [main] INFO c.n.kqapi.menu.DuplicationTest -The following 1 profile is active: "dev" | |||||
2023-11-22 16:34:57.112 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer -Tomcat initialized with port(s): 0 (http) | |||||
2023-11-22 16:34:57.123 [main] INFO o.a.coyote.http11.Http11NioProtocol -Initializing ProtocolHandler ["http-nio-auto-1"] | |||||
2023-11-22 16:34:57.124 [main] INFO o.a.catalina.core.StandardService -Starting service [Tomcat] | |||||
2023-11-22 16:34:57.124 [main] INFO o.a.catalina.core.StandardEngine -Starting Servlet engine: [Apache Tomcat/9.0.65] | |||||
2023-11-22 16:34:57.241 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/kq] -Initializing Spring embedded WebApplicationContext | |||||
2023-11-22 16:34:57.241 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext -Root WebApplicationContext: initialization completed in 2454 ms | |||||
2023-11-22 16:34:59.543 [main] INFO com.ningdatech.swagger.SwaggerConfig -swagger文档加载…… | |||||
2023-11-22 16:35:00.675 [main] INFO c.n.kqapi.common.config.BeanConfig ------restTemplate-----初始化完成 | |||||
2023-11-22 16:35:01.087 [main] INFO s.d.s.w.WebMvcPropertySourcedRequestMappingHandlerMapping -Mapped URL path [/v2/api-docs] onto method [springfox.documentation.swagger2.web.Swagger2ControllerWebMvc#getDocumentation(String, HttpServletRequest)] | |||||
2023-11-22 16:35:01.309 [main] WARN o.s.b.a.f.FreeMarkerAutoConfiguration -Cannot find template location(s): [classpath:/templates/] (please add some templates, check your FreeMarker configuration, or set spring.freemarker.checkTemplateLocation=false) | |||||
2023-11-22 16:35:01.562 [main] INFO o.a.coyote.http11.Http11NioProtocol -Starting ProtocolHandler ["http-nio-auto-1"] | |||||
2023-11-22 16:35:01.588 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer -Tomcat started on port(s): 32509 (http) with context path '/kq' | |||||
2023-11-22 16:35:01.589 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper -Documentation plugins bootstrapped | |||||
2023-11-22 16:35:01.592 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper -Found 1 custom documentation plugin(s) | |||||
2023-11-22 16:35:01.629 [main] INFO s.d.s.w.s.ApiListingReferenceScanner -Scanning for api listing references | |||||
2023-11-22 16:35:01.772 [main] INFO c.n.kqapi.menu.DuplicationTest -Started DuplicationTest in 7.554 seconds (JVM running for 8.94) | |||||
2023-11-22 16:35:02.189 [main] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Starting... | |||||
2023-11-22 16:35:02.677 [main] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Start completed. | |||||
2023-11-22 16:35:46.625 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Shutdown initiated... | |||||
2023-11-22 16:35:46.634 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Shutdown completed. |
@@ -122,36 +122,24 @@ | |||||
<groupId>org.springframework.boot</groupId> | <groupId>org.springframework.boot</groupId> | ||||
<artifactId>spring-boot-configuration-processor</artifactId> | <artifactId>spring-boot-configuration-processor</artifactId> | ||||
</dependency> | </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 --> | <!-- MYSQL --> | ||||
<dependency> | <dependency> | ||||
<groupId>mysql</groupId> | <groupId>mysql</groupId> | ||||
<artifactId>mysql-connector-java</artifactId> | <artifactId>mysql-connector-java</artifactId> | ||||
</dependency> | </dependency> | ||||
<dependency> | |||||
<groupId>io.swagger</groupId> | |||||
<artifactId>swagger-models</artifactId> | |||||
<version>1.6.5</version> | |||||
</dependency> | |||||
<!--配置文件加密--> | |||||
<dependency> | |||||
<groupId>com.github.ulisesbocchio</groupId> | |||||
<artifactId>jasypt-spring-boot-starter</artifactId> | |||||
<version>3.0.4</version> | |||||
</dependency> | |||||
</dependencies> | </dependencies> | ||||
<!-- 打包 --> | <!-- 打包 --> | ||||
<!--配置环境的profile--> | <!--配置环境的profile--> | ||||
@@ -1,7 +1,7 @@ | |||||
package com.ningdatech.kqapi; | package com.ningdatech.kqapi; | ||||
import com.ningdatech.basic.util.SpringUtils; | |||||
import com.ningdatech.kqapi.common.util.SpringContextHolder; | import com.ningdatech.kqapi.common.util.SpringContextHolder; | ||||
import com.ningdatech.kqapi.common.util.SpringUtils; | |||||
import org.mybatis.spring.annotation.MapperScan; | import org.mybatis.spring.annotation.MapperScan; | ||||
import org.springframework.boot.SpringApplication; | import org.springframework.boot.SpringApplication; | ||||
import org.springframework.boot.autoconfigure.SpringBootApplication; | import org.springframework.boot.autoconfigure.SpringBootApplication; | ||||
@@ -1,5 +1,13 @@ | |||||
package com.ningdatech.kqapi.common.config; | package com.ningdatech.kqapi.common.config; | ||||
import com.fasterxml.jackson.core.JsonParser; | |||||
import com.fasterxml.jackson.core.json.JsonReadFeature; | |||||
import com.fasterxml.jackson.databind.DeserializationFeature; | |||||
import com.fasterxml.jackson.databind.ObjectMapper; | |||||
import com.fasterxml.jackson.databind.SerializationFeature; | |||||
import com.ningdatech.kqapi.common.util.NdDateUtils; | |||||
import com.ningdatech.kqapi.common.util.NdJacksonModule; | |||||
import com.ningdatech.kqapi.common.util.SpringUtils; | |||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.apache.http.Header; | import org.apache.http.Header; | ||||
import org.apache.http.client.HttpClient; | import org.apache.http.client.HttpClient; | ||||
@@ -9,20 +17,34 @@ import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; | |||||
import org.apache.http.impl.client.HttpClientBuilder; | import org.apache.http.impl.client.HttpClientBuilder; | ||||
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; | import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; | ||||
import org.apache.http.message.BasicHeader; | import org.apache.http.message.BasicHeader; | ||||
import org.springframework.boot.autoconfigure.AutoConfigureBefore; | |||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; | |||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; | |||||
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; | |||||
import org.springframework.context.ApplicationContext; | |||||
import org.springframework.context.annotation.Bean; | import org.springframework.context.annotation.Bean; | ||||
import org.springframework.context.annotation.Configuration; | import org.springframework.context.annotation.Configuration; | ||||
import org.springframework.context.annotation.Primary; | |||||
import org.springframework.core.convert.converter.Converter; | |||||
import org.springframework.http.MediaType; | import org.springframework.http.MediaType; | ||||
import org.springframework.http.client.ClientHttpRequestFactory; | import org.springframework.http.client.ClientHttpRequestFactory; | ||||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; | import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; | ||||
import org.springframework.http.converter.HttpMessageConverter; | import org.springframework.http.converter.HttpMessageConverter; | ||||
import org.springframework.http.converter.StringHttpMessageConverter; | import org.springframework.http.converter.StringHttpMessageConverter; | ||||
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; | |||||
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; | import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; | ||||
import org.springframework.lang.NonNull; | |||||
import org.springframework.web.client.RestTemplate; | import org.springframework.web.client.RestTemplate; | ||||
import org.springframework.web.servlet.config.annotation.CorsRegistry; | |||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; | |||||
import java.nio.charset.StandardCharsets; | import java.nio.charset.StandardCharsets; | ||||
import java.util.ArrayList; | |||||
import java.util.Arrays; | |||||
import java.util.List; | |||||
import java.text.SimpleDateFormat; | |||||
import java.time.LocalDate; | |||||
import java.time.LocalDateTime; | |||||
import java.time.LocalTime; | |||||
import java.time.ZoneId; | |||||
import java.util.*; | |||||
import java.util.concurrent.TimeUnit; | import java.util.concurrent.TimeUnit; | ||||
/** | /** | ||||
@@ -31,9 +53,10 @@ import java.util.concurrent.TimeUnit; | |||||
* @Date 2023/3/2 9:42 | * @Date 2023/3/2 9:42 | ||||
* @Created by PoffyZhang | * @Created by PoffyZhang | ||||
*/ | */ | ||||
@AutoConfigureBefore(JacksonAutoConfiguration.class) | |||||
@Configuration | @Configuration | ||||
@Slf4j | @Slf4j | ||||
public class BeanConfig { | |||||
public class BeanConfig implements WebMvcConfigurer { | |||||
@Bean | @Bean | ||||
@@ -106,4 +129,67 @@ public class BeanConfig { | |||||
.setRetryHandler(new DefaultHttpRequestRetryHandler(2, true)) | .setRetryHandler(new DefaultHttpRequestRetryHandler(2, true)) | ||||
.build(); | .build(); | ||||
} | } | ||||
/** | |||||
* 全局配置 序列化和反序列化规则 | |||||
* addSerializer:序列化 (Controller 返回 给前端的json) | |||||
* 1. Long -> string | |||||
* 2. BigInteger -> string | |||||
* 3. BigDecimal -> string | |||||
* 4. date -> string | |||||
* 5. LocalDateTime -> "yyyy-MM-dd HH:mm:ss" | |||||
* 6. LocalDate -> "yyyy-MM-dd" | |||||
* 7. LocalTime -> "HH:mm:ss" | |||||
* 8. BaseEnum -> {"code": "xxx", "desc": "xxx"} | |||||
* | |||||
* <p> | |||||
* addDeserializer: 反序列化 (前端调用接口时,传递到后台的json) | |||||
* 1. {"code": "xxx"} -> BaseEnum | |||||
* 2. "yyyy-MM-dd HH:mm:ss" -> LocalDateTime | |||||
* 3. "yyyy-MM-dd" -> LocalDate | |||||
* 4. "HH:mm:ss" -> LocalTime | |||||
* | |||||
* @param builder 构造器 | |||||
* @return 全局 ObjectMapper | |||||
*/ | |||||
@Bean | |||||
@Primary | |||||
@ConditionalOnClass(ObjectMapper.class) | |||||
@ConditionalOnMissingBean | |||||
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { | |||||
ObjectMapper objectMapper = builder.createXmlMapper(false).build(); | |||||
objectMapper.setLocale(Locale.CHINA) | |||||
//去掉默认的时间戳格式 | |||||
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false) | |||||
// 时区 | |||||
.setTimeZone(TimeZone.getTimeZone(ZoneId.systemDefault())) | |||||
//Date参数日期格式 | |||||
.setDateFormat(new SimpleDateFormat(NdDateUtils.DEFAULT_DATE_TIME_FORMAT, Locale.CHINA)) | |||||
//该特性决定parser是否允许JSON字符串包含非引号控制字符(值小于32的ASCII字符,包含制表符和换行符)。 如果该属性关闭,则如果遇到这些字符,则会抛出异常。JSON标准说明书要求所有控制符必须使用引号,因此这是一个非标准的特性 | |||||
.configure(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature(), true) | |||||
// 忽略不能转义的字符 | |||||
.configure(JsonReadFeature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER.mappedFeature(), true) | |||||
//在使用spring boot + jpa/hibernate,如果实体字段上加有FetchType.LAZY,并使用jackson序列化为json串时,会遇到SerializationFeature.FAIL_ON_EMPTY_BEANS异常 | |||||
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false) | |||||
//忽略未知字段 | |||||
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) | |||||
//单引号处理 | |||||
.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); | |||||
// 注册自定义模块 | |||||
objectMapper.registerModule(new NdJacksonModule()).findAndRegisterModules(); | |||||
return objectMapper; | |||||
} | |||||
//解决跨域方式二 | |||||
static final String ORIGINS[] = new String[]{"GET", "POST", "PUT", "DELETE","OPTIONS"}; | |||||
@Override | |||||
public void addCorsMappings(CorsRegistry registry) { | |||||
registry.addMapping("/**") // 所有的当前站点的请求地址,都支持跨域访问。 | |||||
.allowedOriginPatterns("*") // 所有的外部域都可跨域访问。 如果是localhost则很难配置,因为在跨域请求的时候,外部域的解析可能是localhost、127.0.0.1、主机名 | |||||
.allowCredentials(true) // 是否支持跨域用户凭证 | |||||
.allowedMethods(ORIGINS) // 当前站点支持的跨域请求类型是什么 | |||||
.maxAge(3600); // 超时时长设置为1小时。 时间单位是秒。 | |||||
} | |||||
} | } |
@@ -1,6 +1,6 @@ | |||||
package com.ningdatech.kqapi.common.constant; | package com.ningdatech.kqapi.common.constant; | ||||
import com.ningdatech.basic.model.ApiResponse; | |||||
import com.ningdatech.kqapi.common.model.ApiResponse; | |||||
import java.math.BigDecimal; | import java.math.BigDecimal; | ||||
@@ -1,7 +1,7 @@ | |||||
package com.ningdatech.kqapi.common.constant; | package com.ningdatech.kqapi.common.constant; | ||||
import com.ningdatech.basic.util.StrPool; | |||||
import cn.hutool.core.text.StrPool; | |||||
/** | /** | ||||
* 默认值 | * 默认值 | ||||
@@ -0,0 +1,42 @@ | |||||
package com.ningdatech.kqapi.common.converter; | |||||
import java.util.Map; | |||||
import java.util.Set; | |||||
import java.util.function.Function; | |||||
/** | |||||
* 解决入参为 Date类型 | |||||
* | |||||
* @author WendyYang | |||||
* @date 2019-04-30 | |||||
*/ | |||||
public abstract class BaseDateConverter<T> { | |||||
/** | |||||
* 值转换 | |||||
* | |||||
* @param source 源数据 | |||||
* @param function 回调 | |||||
* @return 转换后的数据 | |||||
*/ | |||||
public T convert(String source, Function<String, T> function) { | |||||
if (source == null || source.isEmpty()) { | |||||
return null; | |||||
} | |||||
String sourceTrim = source.trim(); | |||||
Set<Map.Entry<String, String>> entries = getFormat().entrySet(); | |||||
for (Map.Entry<String, String> entry : entries) { | |||||
if (sourceTrim.matches(entry.getValue())) { | |||||
return function.apply(entry.getKey()); | |||||
} | |||||
} | |||||
throw new IllegalArgumentException("无效的日期参数格式:'" + sourceTrim + "'"); | |||||
} | |||||
/** | |||||
* 获取子类 具体的格式化表达式 | |||||
* | |||||
* @return 格式化 | |||||
*/ | |||||
protected abstract Map<String, String> getFormat(); | |||||
} |
@@ -0,0 +1,185 @@ | |||||
package com.ningdatech.kqapi.common.converter; | |||||
import com.fasterxml.jackson.annotation.JsonFormat; | |||||
import com.fasterxml.jackson.core.JsonParser; | |||||
import com.fasterxml.jackson.core.JsonToken; | |||||
import com.fasterxml.jackson.core.JsonTokenId; | |||||
import com.fasterxml.jackson.databind.DeserializationContext; | |||||
import com.fasterxml.jackson.databind.DeserializationFeature; | |||||
import com.fasterxml.jackson.datatype.jsr310.deser.JSR310DateTimeDeserializerBase; | |||||
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; | |||||
import java.io.IOException; | |||||
import java.time.*; | |||||
import java.time.format.DateTimeFormatter; | |||||
import static com.ningdatech.kqapi.common.util.NdDateUtils.*; | |||||
/** | |||||
* 字段类型是LocalDateTime时,可以按照以下6种格式反序列化: | |||||
* 1. yyyy-MM-dd | |||||
* 2. yyyy年MM月dd日 | |||||
* 3. yyyy/MM/dd | |||||
* 4. yyyy-MM-dd HH:mm:ss | |||||
* 5. yyyy年MM月dd日HH时mm分ss秒 | |||||
* 6. yyyy/MM/dd HH:mm:ss | |||||
* | |||||
* @author WendyYang | |||||
* @date 2020/6/18 上午10:50 | |||||
*/ | |||||
@SuppressWarnings("ALL") | |||||
public class NdLocalDateTimeDeserializer extends JSR310DateTimeDeserializerBase<LocalDateTime> { | |||||
public static final NdLocalDateTimeDeserializer INSTANCE = new NdLocalDateTimeDeserializer(); | |||||
private static final long serialVersionUID = 1L; | |||||
private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME; | |||||
/** | |||||
* 以下是支持的6种参数格式 | |||||
*/ | |||||
private static final DateTimeFormatter DEFAULT_DATE_FORMAT_DTF = DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT); | |||||
private static final DateTimeFormatter DEFAULT_DATE_FORMAT_EN_DTF = DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT_EN); | |||||
private static final DateTimeFormatter SLASH_DATE_FORMAT_DTF = DateTimeFormatter.ofPattern(SLASH_DATE_FORMAT); | |||||
private static final DateTimeFormatter DEFAULT_DATE_TIME_FORMAT_DTF = DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT); | |||||
private static final DateTimeFormatter DEFAULT_DATE_TIME_FORMAT_EN_DTF = DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT_EN); | |||||
private static final DateTimeFormatter SLASH_DATE_TIME_FORMAT_DTF = DateTimeFormatter.ofPattern(SLASH_DATE_TIME_FORMAT); | |||||
@Override | |||||
protected JSR310DateTimeDeserializerBase<LocalDateTime> withShape(JsonFormat.Shape shape) { | |||||
return this; | |||||
} | |||||
private NdLocalDateTimeDeserializer() { | |||||
this(DEFAULT_FORMATTER); | |||||
} | |||||
public NdLocalDateTimeDeserializer(DateTimeFormatter formatter) { | |||||
super(LocalDateTime.class, formatter); | |||||
} | |||||
protected NdLocalDateTimeDeserializer(NdLocalDateTimeDeserializer base, Boolean leniency) { | |||||
super(base, leniency); | |||||
} | |||||
@Override | |||||
protected NdLocalDateTimeDeserializer withLeniency(Boolean leniency) { | |||||
return new NdLocalDateTimeDeserializer(this, leniency); | |||||
} | |||||
@Override | |||||
protected JSR310DateTimeDeserializerBase<LocalDateTime> withDateFormat(DateTimeFormatter formatter) { | |||||
return new LocalDateTimeDeserializer(formatter); | |||||
} | |||||
private LocalDateTime convert(String source) { | |||||
if (source.matches(DEFAULT_DATE_FORMAT_MATCHES)) { | |||||
return LocalDateTime.of(LocalDate.parse(source, DEFAULT_DATE_FORMAT_DTF), LocalTime.MIN); | |||||
} | |||||
if (source.matches(DEFAULT_DATE_FORMAT_EN_MATCHES)) { | |||||
return LocalDateTime.of(LocalDate.parse(source, DEFAULT_DATE_FORMAT_EN_DTF), LocalTime.MIN); | |||||
} | |||||
if (source.matches(SLASH_DATE_FORMAT_MATCHES)) { | |||||
return LocalDateTime.of(LocalDate.parse(source, SLASH_DATE_FORMAT_DTF), LocalTime.MIN); | |||||
} | |||||
if (source.matches(DEFAULT_DATE_TIME_FORMAT_MATCHES)) { | |||||
return LocalDateTime.parse(source, DEFAULT_DATE_TIME_FORMAT_DTF); | |||||
} | |||||
if (source.matches(DEFAULT_DATE_TIME_FORMAT_EN_MATCHES)) { | |||||
return LocalDateTime.parse(source, DEFAULT_DATE_TIME_FORMAT_EN_DTF); | |||||
} | |||||
if (source.matches(SLASH_DATE_TIME_FORMAT_MATCHES)) { | |||||
return LocalDateTime.parse(source, SLASH_DATE_TIME_FORMAT_DTF); | |||||
} | |||||
return null; | |||||
} | |||||
@Override | |||||
public LocalDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException { | |||||
// 字符串 | |||||
if (parser.hasTokenId(JsonTokenId.ID_STRING)) { | |||||
String string = parser.getText().trim(); | |||||
if (string.length() == 0) { | |||||
return null; | |||||
} | |||||
try { | |||||
if (_formatter == null) { | |||||
return convert(string); | |||||
} | |||||
if (_formatter == DEFAULT_FORMATTER) { | |||||
// JavaScript by default includes time and zone in JSON serialized Dates (UTC/ISO instant format). | |||||
if (string.length() > 10 && string.charAt(10) == 'T') { | |||||
if (string.endsWith("Z")) { | |||||
return LocalDateTime.ofInstant(Instant.parse(string), ZoneOffset.UTC); | |||||
} else { | |||||
return LocalDateTime.parse(string, DEFAULT_FORMATTER); | |||||
} | |||||
} | |||||
return convert(string); | |||||
} | |||||
return LocalDateTime.parse(string, this._formatter); | |||||
} catch (DateTimeException e) { | |||||
return _handleDateTimeException(context, e, string); | |||||
} | |||||
} | |||||
// 数组 | |||||
if (parser.isExpectedStartArrayToken()) { | |||||
JsonToken t = parser.nextToken(); | |||||
if (t == JsonToken.END_ARRAY) { | |||||
return null; | |||||
} | |||||
if ((t == JsonToken.VALUE_STRING || t == JsonToken.VALUE_EMBEDDED_OBJECT) | |||||
&& context.isEnabled(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS)) { | |||||
final LocalDateTime parsed = deserialize(parser, context); | |||||
if (parser.nextToken() != JsonToken.END_ARRAY) { | |||||
handleMissingEndArrayForSingle(parser, context); | |||||
} | |||||
return parsed; | |||||
} | |||||
if (t == JsonToken.VALUE_NUMBER_INT) { | |||||
LocalDateTime result; | |||||
int year = parser.getIntValue(); | |||||
int month = parser.nextIntValue(-1); | |||||
int day = parser.nextIntValue(-1); | |||||
int hour = parser.nextIntValue(-1); | |||||
int minute = parser.nextIntValue(-1); | |||||
t = parser.nextToken(); | |||||
if (t == JsonToken.END_ARRAY) { | |||||
result = LocalDateTime.of(year, month, day, hour, minute); | |||||
} else { | |||||
int second = parser.getIntValue(); | |||||
t = parser.nextToken(); | |||||
if (t == JsonToken.END_ARRAY) { | |||||
result = LocalDateTime.of(year, month, day, hour, minute, second); | |||||
} else { | |||||
int partialSecond = parser.getIntValue(); | |||||
if (partialSecond < 1_000 && | |||||
!context.isEnabled(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS)) { | |||||
// value is milliseconds, convert it to nanoseconds | |||||
partialSecond *= 1_000_000; | |||||
} | |||||
if (parser.nextToken() != JsonToken.END_ARRAY) { | |||||
throw context.wrongTokenException(parser, handledType(), JsonToken.END_ARRAY, "Expected array to end"); | |||||
} | |||||
result = LocalDateTime.of(year, month, day, hour, minute, second, partialSecond); | |||||
} | |||||
} | |||||
return result; | |||||
} | |||||
context.reportInputMismatch(handledType(), "Unexpected token (%s) within Array, expected VALUE_NUMBER_INT", t); | |||||
} | |||||
// 数字 | |||||
if (parser.hasToken(JsonToken.VALUE_NUMBER_INT)) { | |||||
return Instant.ofEpochMilli(parser.getLongValue()).atZone(ZoneOffset.ofHours(8)).toLocalDateTime(); | |||||
} | |||||
// 没看懂这个是啥 | |||||
if (parser.hasToken(JsonToken.VALUE_EMBEDDED_OBJECT)) { | |||||
return (LocalDateTime) parser.getEmbeddedObject(); | |||||
} | |||||
return _handleUnexpectedToken(context, parser, "当前参数需要数组、字符串、时间戳。"); | |||||
} | |||||
} |
@@ -0,0 +1,77 @@ | |||||
package com.ningdatech.kqapi.common.converter; | |||||
import com.ningdatech.kqapi.common.exception.BizException; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.core.convert.converter.Converter; | |||||
import org.springframework.lang.NonNull; | |||||
import org.springframework.lang.Nullable; | |||||
import java.text.DateFormat; | |||||
import java.text.ParseException; | |||||
import java.text.SimpleDateFormat; | |||||
import java.util.Date; | |||||
import java.util.LinkedHashMap; | |||||
import java.util.Map; | |||||
import static com.ningdatech.kqapi.common.exception.BaseException.BASE_VALID_PARAM; | |||||
import static com.ningdatech.kqapi.common.util.NdDateUtils.*; | |||||
/** | |||||
* 解决入参为 Date类型 | |||||
* | |||||
* @author WendyYang | |||||
* @date 2019-04-30 | |||||
*/ | |||||
@Slf4j | |||||
public class String2DateConverter extends BaseDateConverter<Date> implements Converter<String, Date> { | |||||
protected static final Map<String, String> FORMAT = new LinkedHashMap<>(15); | |||||
static { | |||||
FORMAT.put(DEFAULT_YEAR_FORMAT, "^\\d{4}"); | |||||
FORMAT.put(DEFAULT_MONTH_FORMAT, "^\\d{4}-\\d{1,2}$"); | |||||
FORMAT.put(DEFAULT_DATE_FORMAT, DEFAULT_DATE_FORMAT_MATCHES); | |||||
FORMAT.put("yyyy-MM-dd HH", "^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}"); | |||||
FORMAT.put("yyyy-MM-dd HH:mm", "^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$"); | |||||
FORMAT.put(DEFAULT_DATE_TIME_FORMAT, DEFAULT_DATE_TIME_FORMAT_MATCHES); | |||||
FORMAT.put(DEFAULT_MONTH_FORMAT_SLASH, "^\\d{4}/\\d{1,2}$"); | |||||
FORMAT.put(SLASH_DATE_FORMAT, SLASH_DATE_FORMAT_MATCHES); | |||||
FORMAT.put("yyyy/MM/dd HH", "^\\d{4}/\\d{1,2}/\\d{1,2} {1}\\d{1,2}"); | |||||
FORMAT.put("yyyy/MM/dd HH:mm", "^\\d{4}/\\d{1,2}/\\d{1,2} {1}\\d{1,2}:\\d{1,2}$"); | |||||
FORMAT.put(SLASH_DATE_TIME_FORMAT, SLASH_DATE_TIME_FORMAT_MATCHES); | |||||
FORMAT.put(DEFAULT_DATE_FORMAT_EN, DEFAULT_DATE_FORMAT_EN_MATCHES); | |||||
FORMAT.put(DEFAULT_DATE_TIME_FORMAT_EN, DEFAULT_DATE_TIME_FORMAT_EN_MATCHES); | |||||
} | |||||
/** | |||||
* 格式化日期 | |||||
* | |||||
* @param dateStr String 字符型日期 | |||||
* @param format String 格式 | |||||
* @return Date 日期 | |||||
*/ | |||||
protected static Date parseDate(String dateStr, String format) { | |||||
try { | |||||
DateFormat dateFormat = new SimpleDateFormat(format); | |||||
//严格模式 | |||||
dateFormat.setLenient(false); | |||||
return dateFormat.parse(dateStr); | |||||
} catch (ParseException e) { | |||||
log.info("转换日期失败, date={}, format={}", dateStr, format, e); | |||||
throw new BizException(BASE_VALID_PARAM, e.getMessage(), e); | |||||
} | |||||
} | |||||
@Override | |||||
protected Map<String, String> getFormat() { | |||||
return FORMAT; | |||||
} | |||||
@Override | |||||
@Nullable | |||||
public Date convert(@NonNull String source) { | |||||
return super.convert(source, key -> parseDate(source, key)); | |||||
} | |||||
} |
@@ -0,0 +1,40 @@ | |||||
package com.ningdatech.kqapi.common.converter; | |||||
import org.springframework.core.convert.converter.Converter; | |||||
import org.springframework.lang.NonNull; | |||||
import java.time.LocalDate; | |||||
import java.time.format.DateTimeFormatter; | |||||
import java.util.LinkedHashMap; | |||||
import java.util.Map; | |||||
import static com.ningdatech.kqapi.common.util.NdDateUtils.*; | |||||
/** | |||||
* 解决入参为 Date类型 | |||||
* | |||||
* @author WendyYang | |||||
* @date 2019-04-30 | |||||
*/ | |||||
public class String2LocalDateConverter extends BaseDateConverter<LocalDate> implements Converter<String, LocalDate> { | |||||
protected static final Map<String, String> FORMAT = new LinkedHashMap<>(5); | |||||
static { | |||||
FORMAT.put(DEFAULT_DATE_FORMAT, DEFAULT_DATE_FORMAT_MATCHES); | |||||
FORMAT.put(SLASH_DATE_FORMAT, SLASH_DATE_FORMAT_MATCHES); | |||||
FORMAT.put(DEFAULT_DATE_FORMAT_EN, DEFAULT_DATE_FORMAT_EN_MATCHES); | |||||
} | |||||
@Override | |||||
protected Map<String, String> getFormat() { | |||||
return FORMAT; | |||||
} | |||||
@Override | |||||
public LocalDate convert(@NonNull String source) { | |||||
return super.convert(source, (key) -> LocalDate.parse(source, DateTimeFormatter.ofPattern(key))); | |||||
} | |||||
} | |||||
@@ -0,0 +1,38 @@ | |||||
package com.ningdatech.kqapi.common.converter; | |||||
import org.springframework.core.convert.converter.Converter; | |||||
import org.springframework.lang.NonNull; | |||||
import java.time.LocalDateTime; | |||||
import java.time.format.DateTimeFormatter; | |||||
import java.util.LinkedHashMap; | |||||
import java.util.Map; | |||||
import static com.ningdatech.kqapi.common.util.NdDateUtils.*; | |||||
/** | |||||
* 解决入参为 Date类型 | |||||
* | |||||
* @author WendyYang | |||||
* @date 2019-04-30 | |||||
*/ | |||||
public class String2LocalDateTimeConverter extends BaseDateConverter<LocalDateTime> implements Converter<String, LocalDateTime> { | |||||
protected static final Map<String, String> FORMAT = new LinkedHashMap<>(5); | |||||
static { | |||||
FORMAT.put(DEFAULT_DATE_TIME_FORMAT, DEFAULT_DATE_TIME_FORMAT_MATCHES); | |||||
FORMAT.put(SLASH_DATE_TIME_FORMAT, SLASH_DATE_TIME_FORMAT_MATCHES); | |||||
FORMAT.put(DEFAULT_DATE_TIME_FORMAT_EN, DEFAULT_DATE_TIME_FORMAT_EN_MATCHES); | |||||
} | |||||
@Override | |||||
protected Map<String, String> getFormat() { | |||||
return FORMAT; | |||||
} | |||||
@Override | |||||
public LocalDateTime convert(@NonNull String source) { | |||||
return super.convert(source, (key) -> LocalDateTime.parse(source, DateTimeFormatter.ofPattern(key))); | |||||
} | |||||
} |
@@ -0,0 +1,36 @@ | |||||
package com.ningdatech.kqapi.common.converter; | |||||
import org.springframework.core.convert.converter.Converter; | |||||
import java.time.LocalTime; | |||||
import java.time.format.DateTimeFormatter; | |||||
import java.util.LinkedHashMap; | |||||
import java.util.Map; | |||||
import static com.ningdatech.kqapi.common.util.NdDateUtils.DEFAULT_TIME_FORMAT; | |||||
/** | |||||
* 解决入参为 Date类型 | |||||
* | |||||
* @author WendyYang | |||||
* @date 2019-04-30 | |||||
*/ | |||||
@SuppressWarnings("all") | |||||
public class String2LocalTimeConverter extends BaseDateConverter<LocalTime> implements Converter<String, LocalTime> { | |||||
protected static final Map<String, String> FORMAT = new LinkedHashMap<>(5); | |||||
static { | |||||
FORMAT.put(DEFAULT_TIME_FORMAT, "^\\d{1,2}:\\d{1,2}:\\d{1,2}$"); | |||||
} | |||||
@Override | |||||
protected Map<String, String> getFormat() { | |||||
return FORMAT; | |||||
} | |||||
@Override | |||||
public LocalTime convert(String source) { | |||||
return super.convert(source, (key) -> LocalTime.parse(source, DateTimeFormatter.ofPattern(key))); | |||||
} | |||||
} |
@@ -0,0 +1,38 @@ | |||||
package com.ningdatech.kqapi.common.exception; | |||||
import com.ningdatech.kqapi.common.exception.code.ExceptionCode; | |||||
/** | |||||
* 业务参数异常 | |||||
* 用于在业务中,检测到非法参数时,进行抛出的异常。 | |||||
* | |||||
* @author WendyYang | |||||
* @version 3.5.0 | |||||
*/ | |||||
public class ArgumentException extends BaseUncheckedException { | |||||
private static final long serialVersionUID = -3843907364558373817L; | |||||
public ArgumentException(Throwable cause) { | |||||
super(cause); | |||||
} | |||||
public ArgumentException(String message) { | |||||
super(ExceptionCode.BASE_VALID_PARAM.getCode(), message); | |||||
} | |||||
public ArgumentException(String message, Throwable cause) { | |||||
super(ExceptionCode.BASE_VALID_PARAM.getCode(), message, cause); | |||||
} | |||||
public ArgumentException(final String format, Object... args) { | |||||
super(ExceptionCode.BASE_VALID_PARAM.getCode(), format, args); | |||||
} | |||||
@Override | |||||
public String toString() { | |||||
return "ArgumentException [message=" + getMessage() + ", code=" + getCode() + "]"; | |||||
} | |||||
} |
@@ -0,0 +1,57 @@ | |||||
package com.ningdatech.kqapi.common.exception; | |||||
/** | |||||
* 运行期异常基类 | |||||
* | |||||
* @author WendyYang | |||||
* @version 1.0 | |||||
*/ | |||||
public abstract class BaseCheckedException extends Exception implements BaseException { | |||||
private static final long serialVersionUID = 2706069899924648586L; | |||||
/** | |||||
* 异常信息 | |||||
*/ | |||||
private String message; | |||||
/** | |||||
* 具体异常码 | |||||
*/ | |||||
private int code; | |||||
public BaseCheckedException(final int code, final String message) { | |||||
super(message); | |||||
this.code = code; | |||||
this.message = message; | |||||
} | |||||
public BaseCheckedException(final int code, final String format, Object... args) { | |||||
super(String.format(format, args)); | |||||
this.code = code; | |||||
this.message = String.format(format, args); | |||||
} | |||||
/** | |||||
* 获取 异常消息 | |||||
* | |||||
* @return 异常消息 | |||||
*/ | |||||
@Override | |||||
public String getMessage() { | |||||
return message; | |||||
} | |||||
/** | |||||
* 获取 错误码 | |||||
* | |||||
* @return 错误码 | |||||
*/ | |||||
@Override | |||||
public int getCode() { | |||||
return code; | |||||
} | |||||
} |
@@ -0,0 +1,30 @@ | |||||
package com.ningdatech.kqapi.common.exception; | |||||
/** | |||||
* 异常接口类 | |||||
* | |||||
* @author WendyYang | |||||
* @version 1.0 | |||||
*/ | |||||
public interface BaseException { | |||||
/** | |||||
* 统一参数验证异常码 | |||||
*/ | |||||
int BASE_VALID_PARAM = -9; | |||||
/** | |||||
* 返回异常信息 | |||||
* | |||||
* @return 异常信息 | |||||
*/ | |||||
String getMessage(); | |||||
/** | |||||
* 返回异常编码 | |||||
* | |||||
* @return 异常编码 | |||||
*/ | |||||
int getCode(); | |||||
} |
@@ -0,0 +1,65 @@ | |||||
package com.ningdatech.kqapi.common.exception; | |||||
import cn.hutool.core.util.StrUtil; | |||||
import com.ningdatech.kqapi.common.util.StrPool; | |||||
/** | |||||
* 非运行期异常基类,所有自定义非运行时异常继承该类 | |||||
* | |||||
* @author WendyYang | |||||
* @version 1.0 | |||||
* @see RuntimeException | |||||
*/ | |||||
public class BaseUncheckedException extends RuntimeException implements BaseException { | |||||
private static final long serialVersionUID = -778887391066124051L; | |||||
/** | |||||
* 异常信息 | |||||
*/ | |||||
private String message; | |||||
/** | |||||
* 具体异常码 | |||||
*/ | |||||
private int code; | |||||
public BaseUncheckedException(Throwable cause) { | |||||
super(cause); | |||||
} | |||||
public BaseUncheckedException(final int code, Throwable cause) { | |||||
super(cause); | |||||
this.code = code; | |||||
} | |||||
public BaseUncheckedException(final int code, final String message) { | |||||
super(message); | |||||
this.code = code; | |||||
this.message = message; | |||||
} | |||||
public BaseUncheckedException(final int code, final String message, Throwable cause) { | |||||
super(cause); | |||||
this.code = code; | |||||
this.message = message; | |||||
} | |||||
public BaseUncheckedException(final int code, final String format, Object... args) { | |||||
super(StrUtil.contains(format, StrPool.BRACE) ? StrUtil.format(format, args) : String.format(format, args)); | |||||
this.code = code; | |||||
this.message = StrUtil.contains(format, StrPool.BRACE) ? StrUtil.format(format, args) : String.format(format, args); | |||||
} | |||||
@Override | |||||
public String getMessage() { | |||||
return message; | |||||
} | |||||
@Override | |||||
public int getCode() { | |||||
return code; | |||||
} | |||||
} |
@@ -0,0 +1,78 @@ | |||||
package com.ningdatech.kqapi.common.exception; | |||||
import com.ningdatech.kqapi.common.exception.code.BaseExceptionCode; | |||||
/** | |||||
* 业务异常 | |||||
* 用于在处理业务逻辑时,进行抛出的异常。 | |||||
* | |||||
* @author WendyYang | |||||
* @version 1.0 | |||||
*/ | |||||
public class BizException extends BaseUncheckedException { | |||||
private static final long serialVersionUID = -3843907364558373817L; | |||||
public BizException(Throwable cause) { | |||||
super(cause); | |||||
} | |||||
public BizException(int code, Throwable cause) { | |||||
super(code, cause); | |||||
} | |||||
public BizException(String message) { | |||||
super(-1, message); | |||||
} | |||||
public BizException(String message, Throwable cause) { | |||||
super(-1, message, cause); | |||||
} | |||||
public BizException(int code, String message) { | |||||
super(code, message); | |||||
} | |||||
public BizException(int code, String message, Throwable cause) { | |||||
super(code, message, cause); | |||||
} | |||||
public BizException(int code, String message, Object... args) { | |||||
super(code, message, args); | |||||
} | |||||
/** | |||||
* 实例化异常 | |||||
* | |||||
* @param code 自定义异常编码 | |||||
* @param message 自定义异常消息 | |||||
* @param args 已定义异常参数 | |||||
* @return 异常实例 | |||||
*/ | |||||
public static BizException wrap(int code, String message, Object... args) { | |||||
return new BizException(code, message, args); | |||||
} | |||||
public static BizException wrap(String message, Object... args) { | |||||
return new BizException(-1, message, args); | |||||
} | |||||
public static BizException validFail(String message, Object... args) { | |||||
return new BizException(-9, message, args); | |||||
} | |||||
public static BizException wrap(BaseExceptionCode ex) { | |||||
return new BizException(ex.getCode(), ex.getMsg()); | |||||
} | |||||
public static BizException wrap(BaseExceptionCode ex, Throwable cause) { | |||||
return new BizException(ex.getCode(), ex.getMsg(), cause); | |||||
} | |||||
@Override | |||||
public String toString() { | |||||
return "BizException [message=" + getMessage() + ", code=" + getCode() + "]"; | |||||
} | |||||
} |
@@ -0,0 +1,30 @@ | |||||
package com.ningdatech.kqapi.common.exception; | |||||
/** | |||||
* 非业务异常 | |||||
* 用于在处理非业务逻辑时,进行抛出的异常。 | |||||
* | |||||
* @author WendyYang | |||||
* @version 1.0 | |||||
* @see Exception | |||||
*/ | |||||
public class CommonException extends BaseCheckedException { | |||||
public CommonException(int code, String message) { | |||||
super(code, message); | |||||
} | |||||
public CommonException(int code, String format, Object... args) { | |||||
super(code, format, args); | |||||
} | |||||
public CommonException wrap(int code, String format, Object... args) { | |||||
return new CommonException(code, format, args); | |||||
} | |||||
@Override | |||||
public String toString() { | |||||
return "BizException [message=" + getMessage() + ", code=" + getCode() + "]"; | |||||
} | |||||
} |
@@ -0,0 +1,27 @@ | |||||
package com.ningdatech.kqapi.common.exception; | |||||
import com.ningdatech.kqapi.common.exception.code.ExceptionCode; | |||||
/** | |||||
* <p> | |||||
* DownloadException | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 16:02 2024/1/8 | |||||
*/ | |||||
public class DownloadException extends BaseUncheckedException { | |||||
public DownloadException(Throwable cause) { | |||||
super(cause); | |||||
} | |||||
public DownloadException(String message, Object... args) { | |||||
super(ExceptionCode.BAD_REQUEST.getCode(), message, args); | |||||
} | |||||
public static DownloadException wrap(String message, Object... args) { | |||||
return new DownloadException(message, args); | |||||
} | |||||
} |
@@ -0,0 +1,28 @@ | |||||
package com.ningdatech.kqapi.common.exception; | |||||
import com.ningdatech.kqapi.common.exception.code.ExceptionCode; | |||||
/** | |||||
* <p> | |||||
* ExportException | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 16:02 2024/1/8 | |||||
*/ | |||||
public class ExportException extends BaseUncheckedException { | |||||
public ExportException(Throwable cause) { | |||||
super(cause); | |||||
} | |||||
public ExportException(String message, Object... args) { | |||||
super(ExceptionCode.BAD_REQUEST.getCode(), message, args); | |||||
} | |||||
public static ExportException wrap(String message, Object... args) { | |||||
return new ExportException(message, args); | |||||
} | |||||
} |
@@ -0,0 +1,33 @@ | |||||
package com.ningdatech.kqapi.common.exception; | |||||
import com.ningdatech.kqapi.common.exception.code.BaseExceptionCode; | |||||
import com.ningdatech.kqapi.common.exception.code.ExceptionCode; | |||||
/** | |||||
* 403 禁止访问 | |||||
* | |||||
* @author WendyYang | |||||
* @version 1.0 | |||||
*/ | |||||
public class ForbiddenException extends BaseUncheckedException { | |||||
private static final long serialVersionUID = 1L; | |||||
public ForbiddenException(int code, String message) { | |||||
super(code, message); | |||||
} | |||||
public static ForbiddenException wrap(BaseExceptionCode ex) { | |||||
return new ForbiddenException(ex.getCode(), ex.getMsg()); | |||||
} | |||||
public static ForbiddenException wrap(String msg) { | |||||
return new ForbiddenException(ExceptionCode.FORBIDDEN.getCode(), msg); | |||||
} | |||||
@Override | |||||
public String toString() { | |||||
return "ForbiddenException [message=" + getMessage() + ", code=" + getCode() + "]"; | |||||
} | |||||
} |
@@ -0,0 +1,33 @@ | |||||
package com.ningdatech.kqapi.common.exception; | |||||
import com.ningdatech.kqapi.common.exception.code.ExceptionCode; | |||||
/** | |||||
* 401 未认证 未登录 | |||||
* | |||||
* @author WendyYang | |||||
* @version 1.0 | |||||
*/ | |||||
public class UnauthorizedException extends BaseUncheckedException { | |||||
private static final long serialVersionUID = 1L; | |||||
public UnauthorizedException(int code, String message) { | |||||
super(code, message); | |||||
} | |||||
public UnauthorizedException(int code, String message, Throwable cause) { | |||||
super(code, message, cause); | |||||
} | |||||
public static UnauthorizedException wrap(String msg) { | |||||
return new UnauthorizedException(ExceptionCode.UNAUTHORIZED.getCode(), msg); | |||||
} | |||||
@Override | |||||
public String toString() { | |||||
return "UnauthorizedException [message=" + getMessage() + ", code=" + getCode() + "]"; | |||||
} | |||||
} |
@@ -0,0 +1,23 @@ | |||||
package com.ningdatech.kqapi.common.exception.code; | |||||
/** | |||||
* 异常编码 | |||||
* | |||||
* @author WendyYang | |||||
* @date 2017-12-25 13:46 | |||||
*/ | |||||
public interface BaseExceptionCode { | |||||
/** | |||||
* 异常编码 | |||||
* | |||||
* @return 异常编码 | |||||
*/ | |||||
int getCode(); | |||||
/** | |||||
* 异常消息 | |||||
* | |||||
* @return 异常消息 | |||||
*/ | |||||
String getMsg(); | |||||
} |
@@ -0,0 +1,103 @@ | |||||
package com.ningdatech.kqapi.common.exception.code; | |||||
/** | |||||
* 异常编码 | |||||
* | |||||
* @author WendyYang | |||||
* @date 2017-12-13 16:22 | |||||
*/ | |||||
public enum ExceptionCode implements BaseExceptionCode { | |||||
//系统相关 start | |||||
SUCCESS(0, "成功"), | |||||
SYSTEM_BUSY(-1, "系统繁忙~请稍后再试~"), | |||||
SYSTEM_TIMEOUT(-2, "系统维护中~请稍后再试~"), | |||||
PARAM_EX(-3, "参数类型解析异常"), | |||||
SQL_EX(-4, "运行SQL出现异常"), | |||||
NULL_POINT_EX(-5, "空指针异常"), | |||||
ILLEGAL_ARGUMENT_EX(-6, "无效参数异常"), | |||||
MEDIA_TYPE_EX(-7, "请求类型异常"), | |||||
LOAD_RESOURCES_ERROR(-8, "加载资源出错"), | |||||
BASE_VALID_PARAM(-9, "统一验证参数异常"), | |||||
OPERATION_EX(-10, "操作异常"), | |||||
SERVICE_MAPPER_ERROR(-11, "Mapper类转换异常"), | |||||
CAPTCHA_ERROR(-12, "验证码校验失败"), | |||||
JSON_PARSE_ERROR(-13, "JSON解析异常"), | |||||
OK(200, "OK"), | |||||
BAD_REQUEST(400, "错误的请求"), | |||||
/** | |||||
* {@code 401 Unauthorized}. 需要重新登录。 | |||||
* 该HTTP状态码表示认证错误,它是为了认证设计的,而不是为了授权设计的。收到401响应,表示请求没有被认证—压根没有认证或者认证不正确—但是请重新认证和重试。(一般在响应头部包含一个WWW-Authenticate来描述如何认证)。通常由web服务器返回,而不是web应用。从性质上来说是临时的东西。(服务器要求客户端重试) | |||||
* | |||||
* @see <a href="http://tools.ietf.org/html/rfc7235#section-3.1">HTTP/1.1: Authentication, section 3.1</a> | |||||
*/ | |||||
UNAUTHORIZED(401, "未认证"), | |||||
/** 该HTTP状态码是关于授权方面的。从性质上来说是永久的东西,和应用的业务逻辑相关联。它比401更具体,更实际。收到403响应表示服务器完成认证过程,但是客户端请求没有权限去访问要求的资源。 */ | |||||
FORBIDDEN(403, "禁止访问"), | |||||
/** | |||||
* {@code 404 Not Found}. | |||||
* | |||||
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.4">HTTP/1.1: Semantics and Content, section 6.5.4</a> | |||||
*/ | |||||
NOT_FOUND(404, "没有找到资源"), | |||||
METHOD_NOT_ALLOWED(405, "不支持当前请求类型"), | |||||
TOO_MANY_REQUESTS(429, "请求超过次数限制"), | |||||
INTERNAL_SERVER_ERROR(500, "内部服务错误"), | |||||
BAD_GATEWAY(502, "网关错误"), | |||||
GATEWAY_TIMEOUT(504, "网关超时"), | |||||
//系统相关 end | |||||
REQUIRED_FILE_PARAM_EX(1001, "请求中必须至少包含一个有效文件"), | |||||
DATA_SAVE_ERROR(2000, "新增数据失败"), | |||||
DATA_UPDATE_ERROR(2001, "修改数据失败"), | |||||
TOO_MUCH_DATA_ERROR(2002, "批量新增数据过多"), | |||||
//jwt token 相关 start | |||||
JWT_BASIC_INVALID(40000, "无效的基本身份验证令牌"), | |||||
JWT_TOKEN_EXPIRED(40001, "会话超时,请重新登录"), | |||||
JWT_SIGNATURE(40002, "不合法的token,请认真比对 token 的签名"), | |||||
JWT_ILLEGAL_ARGUMENT(40003, "缺少token参数"), | |||||
JWT_GEN_TOKEN_FAIL(40004, "生成token失败"), | |||||
JWT_PARSER_TOKEN_FAIL(40005, "解析用户身份错误,请重新登录!"), | |||||
JWT_USER_INVALID(40006, "用户名或密码错误"), | |||||
JWT_USER_ENABLED(40007, "用户已经被禁用!"), | |||||
JWT_OFFLINE(40008, "您已在另一个设备登录!"), | |||||
JWT_NOT_LOGIN(40009, "登录超时,请重新登录!"), | |||||
//jwt token 相关 end | |||||
; | |||||
private final int code; | |||||
private String msg; | |||||
ExceptionCode(int code, String msg) { | |||||
this.code = code; | |||||
this.msg = msg; | |||||
} | |||||
@Override | |||||
public int getCode() { | |||||
return code; | |||||
} | |||||
@Override | |||||
public String getMsg() { | |||||
return msg; | |||||
} | |||||
public ExceptionCode build(String msg, Object... param) { | |||||
this.msg = String.format(msg, param); | |||||
return this; | |||||
} | |||||
public ExceptionCode param(Object... param) { | |||||
msg = String.format(msg, param); | |||||
return this; | |||||
} | |||||
} |
@@ -1,7 +1,7 @@ | |||||
package com.ningdatech.kqapi.common.handler; | package com.ningdatech.kqapi.common.handler; | ||||
import com.ningdatech.basic.enumeration.Status; | |||||
import com.ningdatech.basic.model.ApiResponse; | |||||
import com.ningdatech.kqapi.common.model.ApiResponse; | |||||
import com.ningdatech.kqapi.common.model.Status; | |||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.springframework.context.support.DefaultMessageSourceResolvable; | import org.springframework.context.support.DefaultMessageSourceResolvable; | ||||
import org.springframework.http.HttpStatus; | import org.springframework.http.HttpStatus; | ||||
@@ -1,6 +1,6 @@ | |||||
package com.ningdatech.kqapi.common.handler; | package com.ningdatech.kqapi.common.handler; | ||||
import com.ningdatech.basic.model.ApiResponse; | |||||
import com.ningdatech.kqapi.common.model.ApiResponse; | |||||
import org.springframework.core.MethodParameter; | import org.springframework.core.MethodParameter; | ||||
import org.springframework.http.MediaType; | import org.springframework.http.MediaType; | ||||
import org.springframework.http.converter.HttpMessageConverter; | import org.springframework.http.converter.HttpMessageConverter; | ||||
@@ -0,0 +1,123 @@ | |||||
package com.ningdatech.kqapi.common.model; | |||||
import lombok.Data; | |||||
import lombok.NoArgsConstructor; | |||||
import java.io.Serializable; | |||||
/** | |||||
* <p> | |||||
* ApiResponse - 统一的接口返回值封装 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 14:29 2022/9/29 | |||||
*/ | |||||
@Data | |||||
@NoArgsConstructor | |||||
public class ApiResponse<T> implements Serializable { | |||||
private static final long serialVersionUID = 532384723325394156L; | |||||
public static final int SUCCESS_CODE = 200; | |||||
public static final String SUCCESS_MSG = "success"; | |||||
public static final int ERROR_CODE = 500; | |||||
public static final String ERROR_MSG = "Internal server error"; | |||||
/** | |||||
* 状态码 | |||||
*/ | |||||
private Integer code; | |||||
/** | |||||
* 返回内容 | |||||
*/ | |||||
private String message; | |||||
/** | |||||
* 返回数据 | |||||
*/ | |||||
private T data; | |||||
/** | |||||
* 全参构造函数 | |||||
* | |||||
* @param code 状态码 | |||||
* @param message 返回内容 | |||||
* @param data 返回数据 | |||||
*/ | |||||
private ApiResponse(Integer code, String message, T data) { | |||||
this.code = code; | |||||
this.message = message; | |||||
this.data = data; | |||||
} | |||||
/** | |||||
* 构造一个自定义的API返回 | |||||
* | |||||
* @param code 状态码 | |||||
* @param message 返回内容 | |||||
* @param data 返回数据 | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> ApiResponse<T> of(Integer code, String message, T data) { | |||||
return new ApiResponse<T>(code, message, data); | |||||
} | |||||
public static <T> ApiResponse<T> of(Integer code, String message) { | |||||
return of(code, message, null); | |||||
} | |||||
/** | |||||
* 构造一个成功且不带数据的API返回 | |||||
* | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> ApiResponse<T> ofSuccess() { | |||||
return ofSuccess(null); | |||||
} | |||||
/** | |||||
* 构造一个成功且带数据的API返回 | |||||
* | |||||
* @param data 返回数据 | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> ApiResponse<T> ofSuccess(T data) { | |||||
return ofStatus(Status.OK, data); | |||||
} | |||||
/** | |||||
* 构造一个成功且自定义消息的API返回 | |||||
* | |||||
* @param message 返回内容 | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> ApiResponse<T> ofMessage(String message) { | |||||
return of(Status.OK.getCode(), message, null); | |||||
} | |||||
/** | |||||
* 构造一个有状态的API返回 | |||||
* | |||||
* @param status 状态 {@link Status} | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> ApiResponse<T> ofStatus(ApiStatus status) { | |||||
return ofStatus(status, null); | |||||
} | |||||
/** | |||||
* 构造一个有状态且带数据的API返回 | |||||
* | |||||
* @param status 状态 {@link Status} | |||||
* @param data 返回数据 | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> ApiResponse<T> ofStatus(ApiStatus status, T data) { | |||||
return of(status.getCode(), status.getReasonPhrase(), data); | |||||
} | |||||
} |
@@ -0,0 +1,26 @@ | |||||
package com.ningdatech.kqapi.common.model; | |||||
/** | |||||
* <p> | |||||
* ApiStatus - 通用api状态 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 14:44 2022/9/29 | |||||
*/ | |||||
public interface ApiStatus { | |||||
/** | |||||
* 获取code | |||||
* | |||||
* @return code | |||||
*/ | |||||
Integer getCode(); | |||||
/** | |||||
* 获取短语 | |||||
* | |||||
* @return 短语 | |||||
*/ | |||||
String getReasonPhrase(); | |||||
} |
@@ -0,0 +1,30 @@ | |||||
package com.ningdatech.kqapi.common.model; | |||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |||||
import lombok.Data; | |||||
/** | |||||
* <p> | |||||
* PagePo - 分页请求参数类 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 16:29 2022/9/14 | |||||
*/ | |||||
@Data | |||||
public class PagePo { | |||||
private Integer pageNumber = 1; | |||||
private Integer pageSize = 10; | |||||
public void page(Integer pageNumber, Integer pageSize) { | |||||
this.pageNumber = pageNumber; | |||||
this.pageSize = pageSize; | |||||
} | |||||
public <T> Page<T> page() { | |||||
return Page.of(pageNumber, pageSize); | |||||
} | |||||
} |
@@ -0,0 +1,63 @@ | |||||
package com.ningdatech.kqapi.common.model; | |||||
import lombok.Data; | |||||
import lombok.NoArgsConstructor; | |||||
import java.util.Collection; | |||||
import java.util.Collections; | |||||
/** | |||||
* <p> | |||||
* PageVo - 分页返回的包装对象 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 14:43 2022/9/29 | |||||
*/ | |||||
@Data | |||||
@NoArgsConstructor | |||||
public class PageVo<T> { | |||||
private Collection<T> records; | |||||
private Long total; | |||||
private Boolean hasNextPage; | |||||
public PageVo(Collection<T> records, Boolean hasNextPage) { | |||||
this.records = records; | |||||
this.hasNextPage = hasNextPage; | |||||
} | |||||
public PageVo(Collection<T> records, Long total) { | |||||
this.records = records; | |||||
this.total = total; | |||||
} | |||||
public void setTotal(Long total) { | |||||
this.total = total; | |||||
} | |||||
public static <T> PageVo<T> of(Collection<T> data, Long total) { | |||||
return new PageVo<>(data, total); | |||||
} | |||||
public static <T> PageVo<T> of(Collection<T> data, Integer total) { | |||||
return new PageVo<>(data, (long) total); | |||||
} | |||||
/** | |||||
* 移动端无需展示总页码使用 | |||||
* | |||||
* @param data 分页数据 | |||||
* @param hasNextPage 是否有下一页 | |||||
* @author WendyYang | |||||
**/ | |||||
public static <T> PageVo<T> of(Collection<T> data, Boolean hasNextPage) { | |||||
return new PageVo<>(data, hasNextPage); | |||||
} | |||||
public static <T> PageVo<T> empty() { | |||||
return new PageVo<>(Collections.emptyList(), 0L); | |||||
} | |||||
} |
@@ -0,0 +1,123 @@ | |||||
package com.ningdatech.kqapi.common.model; | |||||
import lombok.Getter; | |||||
/** | |||||
* @description: | |||||
* @author: liushuai | |||||
* @date: 2022/3/25 11:31 | |||||
*/ | |||||
@Getter | |||||
public enum Status implements ApiStatus { | |||||
/** | |||||
* 正常 | |||||
*/ | |||||
OK(200, "正常"), | |||||
/** | |||||
* 请求错误 | |||||
*/ | |||||
BAD_REQUEST(400, "请求错误"), | |||||
/** | |||||
* Unauthorized | |||||
*/ | |||||
NO_AUTHORIZATION(401, "未经授权的"), | |||||
/** | |||||
* 服务器解析不到用户请求的服务名称 | |||||
*/ | |||||
REQUEST_NOT_FOUND(404, "服务不存在"), | |||||
/** | |||||
* 未知异常 | |||||
*/ | |||||
UNKNOWN_ERROR(500, "服务器内部错误"), | |||||
/** | |||||
* 未定义异常 | |||||
*/ | |||||
UNDEFINED(501, "未定义"), | |||||
/** | |||||
* 未定义异常 | |||||
*/ | |||||
ERROR_PARAM(502, "您输入的参数有非法字符,请输入正确的参数"), | |||||
/** | |||||
* 该服务已下线 | |||||
*/ | |||||
SERVICES_DISABLED(1, "服务未启用"), | |||||
/** | |||||
* 请求参数不能为空 | |||||
*/ | |||||
PARAM_NOT_NULL(101, "请求参数不能为空"), | |||||
/** | |||||
* 字段名重复 | |||||
*/ | |||||
COLUMN_REPEAT(112, "字段名重复,请重新填写"), | |||||
/** | |||||
* 参数不匹配 | |||||
*/ | |||||
PARAM_NOT_MATCH(102, "参数不匹配"), | |||||
/** | |||||
* 权限认证参数 | |||||
*/ | |||||
NO_AUT_PARAM(103, "权限参数不存在"), | |||||
/** | |||||
* 日期格式错误 | |||||
*/ | |||||
DATE_FORMAT_EXCEPTION(104, "日期格式错误"), | |||||
/** | |||||
* 网络连接异常 | |||||
*/ | |||||
CONNECTION_REFUSED(105, "连接拒绝"), | |||||
/** | |||||
* 登录失败 | |||||
*/ | |||||
LOGIN_BAD(107, "用户登录失败,请确认用户信息"), | |||||
/** | |||||
* 流程删除失败 | |||||
*/ | |||||
BAD_DELETE_PROCESS(106,"文件已进入流转流程,删除失败"), | |||||
/** | |||||
* 无可用端口 | |||||
*/ | |||||
NO_PORT_AVAILABLE(111, "无可用端口"), | |||||
/** | |||||
* 文件下载异常 | |||||
*/ | |||||
FILE_DOWNLOAD_EXCEPTION(607, "文件下载异常"), | |||||
/** | |||||
* 文件传输异常 | |||||
*/ | |||||
FILE_TRANS_EXCEPTION(608, "文件传输异常"), | |||||
/** | |||||
* 文件名不存在 | |||||
*/ | |||||
FILE_NAME_EXCEPTION(609, "文件名不存在"), | |||||
/** | |||||
* 文件名不存在 | |||||
*/ | |||||
FILE_NAME_REPEAT(610, "文件名重复,请重新上传"), | |||||
/** | |||||
* 文件名不存在 | |||||
*/ | |||||
FILE_DELETE_FAIL(611, "文件删除异常"), | |||||
/** | |||||
* 文件名不存在 | |||||
*/ | |||||
FILE_NOT_SUPPORT(612, "不支持的文件类型,请重新上传"), | |||||
/** | |||||
* 文件名不存在 | |||||
*/ | |||||
FILE_NOT_EXIT(613, "业务文件未上传,请上传业务文件"); | |||||
/** | |||||
* 状态码 | |||||
*/ | |||||
private final Integer code; | |||||
/** | |||||
* 内容 | |||||
*/ | |||||
private final String reasonPhrase; | |||||
Status(Integer code, String reasonPhrase) { | |||||
this.code = code; | |||||
this.reasonPhrase = reasonPhrase; | |||||
} | |||||
} |
@@ -1,7 +1,7 @@ | |||||
package com.ningdatech.kqapi.common.util; | package com.ningdatech.kqapi.common.util; | ||||
import cn.hutool.core.text.StrPool; | |||||
import cn.hutool.core.util.StrUtil; | import cn.hutool.core.util.StrUtil; | ||||
import com.ningdatech.basic.util.StrPool; | |||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import org.springframework.util.NumberUtils; | import org.springframework.util.NumberUtils; | ||||
@@ -109,10 +109,6 @@ public class BizUtils { | |||||
}))); | }))); | ||||
} | } | ||||
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) { | public static LocalDateTime convertDate(Date date) { | ||||
if (Objects.nonNull(date)) { | if (Objects.nonNull(date)) { | ||||
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); | return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); | ||||
@@ -1,6 +1,6 @@ | |||||
package com.ningdatech.kqapi.common.util; | package com.ningdatech.kqapi.common.util; | ||||
import com.ningdatech.basic.util.StrPool; | |||||
import cn.hutool.core.text.StrPool; | |||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
@@ -1,104 +0,0 @@ | |||||
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); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -1,89 +0,0 @@ | |||||
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; | |||||
} | |||||
} |
@@ -8,23 +8,15 @@ import org.apache.http.client.methods.CloseableHttpResponse; | |||||
import org.apache.http.client.methods.HttpGet; | import org.apache.http.client.methods.HttpGet; | ||||
import org.apache.http.client.methods.HttpPost; | import org.apache.http.client.methods.HttpPost; | ||||
import org.apache.http.conn.ssl.DefaultHostnameVerifier; | 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.PublicSuffixMatcher; | ||||
import org.apache.http.conn.util.PublicSuffixMatcherLoader; | import org.apache.http.conn.util.PublicSuffixMatcherLoader; | ||||
import org.apache.http.entity.StringEntity; | import org.apache.http.entity.StringEntity; | ||||
import org.apache.http.impl.client.CloseableHttpClient; | 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.impl.client.HttpClients; | ||||
import org.apache.http.message.BasicNameValuePair; | import org.apache.http.message.BasicNameValuePair; | ||||
import org.apache.http.ssl.SSLContexts; | |||||
import org.apache.http.util.EntityUtils; | import org.apache.http.util.EntityUtils; | ||||
import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; | |||||
import javax.net.ssl.SSLContext; | |||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.net.URL; | import java.net.URL; | ||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
@@ -51,7 +43,7 @@ public class HttpUtil { | |||||
* 发送 post 请求 | * 发送 post 请求 | ||||
* @param httpUrl 地址 | * @param httpUrl 地址 | ||||
*/ | */ | ||||
public String sendHttpPost(String httpUrl) { | |||||
public String sendHttpPost(String httpUrl) throws IOException { | |||||
HttpPost httpPost= new HttpPost(httpUrl);// 创建 httpPost | HttpPost httpPost= new HttpPost(httpUrl);// 创建 httpPost | ||||
return sendHttpPost(httpPost); | return sendHttpPost(httpPost); | ||||
} | } | ||||
@@ -61,7 +53,7 @@ public class HttpUtil { | |||||
* @param httpUrl 地址 | * @param httpUrl 地址 | ||||
* @param params 参数(格式:key1=value1&key2=value2) | * @param params 参数(格式:key1=value1&key2=value2) | ||||
*/ | */ | ||||
public String sendHttpPost(String httpUrl, String params) { | |||||
public String sendHttpPost(String httpUrl, String params) throws IOException { | |||||
HttpPost httpPost= new HttpPost(httpUrl);// 创建 httpPost | HttpPost httpPost= new HttpPost(httpUrl);// 创建 httpPost | ||||
try { | try { | ||||
//设置参数 | //设置参数 | ||||
@@ -69,7 +61,7 @@ public class HttpUtil { | |||||
stringEntity.setContentType("application/x-www-form-urlencoded"); | stringEntity.setContentType("application/x-www-form-urlencoded"); | ||||
httpPost.setEntity(stringEntity); | httpPost.setEntity(stringEntity); | ||||
} catch (Exception e) { | } catch (Exception e) { | ||||
logger.error(e.getMessage(),e); | |||||
logger.error(e.getMessage()); | |||||
} | } | ||||
return sendHttpPost(httpPost); | return sendHttpPost(httpPost); | ||||
} | } | ||||
@@ -79,7 +71,7 @@ public class HttpUtil { | |||||
* @param httpUrl 地址 | * @param httpUrl 地址 | ||||
* @param maps 参数 | * @param maps 参数 | ||||
*/ | */ | ||||
public String sendHttpPost(String httpUrl, Map<String, String> maps) { | |||||
public String sendHttpPost(String httpUrl, Map<String, String> maps) throws IOException { | |||||
HttpPost httpPost= new HttpPost(httpUrl);// 创建 httpPost | HttpPost httpPost= new HttpPost(httpUrl);// 创建 httpPost | ||||
// 创建参数队列 | // 创建参数队列 | ||||
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); | List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); | ||||
@@ -89,7 +81,7 @@ public class HttpUtil { | |||||
try { | try { | ||||
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8")); | httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8")); | ||||
} catch (Exception e) { | } catch (Exception e) { | ||||
logger.error(e.getMessage(),e); | |||||
logger.error(e.getMessage()); | |||||
} | } | ||||
return sendHttpPost(httpPost); | return sendHttpPost(httpPost); | ||||
} | } | ||||
@@ -99,7 +91,7 @@ public class HttpUtil { | |||||
* @param httpPost | * @param httpPost | ||||
*@return | *@return | ||||
*/ | */ | ||||
private String sendHttpPost(HttpPost httpPost) { | |||||
private String sendHttpPost(HttpPost httpPost) throws IOException { | |||||
CloseableHttpClient httpClient = null; | CloseableHttpClient httpClient = null; | ||||
CloseableHttpResponse response = null; | CloseableHttpResponse response = null; | ||||
HttpEntity entity = null; | HttpEntity entity = null; | ||||
@@ -113,18 +105,19 @@ public class HttpUtil { | |||||
entity = response.getEntity(); | entity = response.getEntity(); | ||||
responseContent = EntityUtils.toString(entity, "UTF-8"); | responseContent = EntityUtils.toString(entity, "UTF-8"); | ||||
} catch (Exception e) { | } catch (Exception e) { | ||||
logger.error(e.getMessage(),e); | |||||
logger.error(e.getMessage()); | |||||
} finally { | } finally { | ||||
httpClient.close(); | |||||
try { | try { | ||||
// 关闭连接,释放资源 | // 关闭连接,释放资源 | ||||
if (response != null) { | if (response != null) { | ||||
response.close(); | |||||
response.close(); | |||||
} | } | ||||
if (httpClient != null) { | if (httpClient != null) { | ||||
httpClient.close(); | |||||
httpClient.close(); | |||||
} | } | ||||
} catch (IOException e) { | } catch (IOException e) { | ||||
logger.error(e.getMessage(),e); | |||||
logger.error(e.getMessage()); | |||||
} | } | ||||
} | } | ||||
return responseContent; | return responseContent; | ||||
@@ -134,7 +127,7 @@ public class HttpUtil { | |||||
* 发送 get 请求 | * 发送 get 请求 | ||||
* @param httpUrl | * @param httpUrl | ||||
*/ | */ | ||||
public String sendHttpGet(String httpUrl) { | |||||
public String sendHttpGet(String httpUrl) throws IOException { | |||||
HttpGet httpGet = new HttpGet(httpUrl);// 创建 get 请求 | HttpGet httpGet = new HttpGet(httpUrl);// 创建 get 请求 | ||||
return sendHttpGet(httpGet); | return sendHttpGet(httpGet); | ||||
} | } | ||||
@@ -153,7 +146,7 @@ public class HttpUtil { | |||||
* @param httpGet | * @param httpGet | ||||
*@return | *@return | ||||
*/ | */ | ||||
private String sendHttpGet(HttpGet httpGet) { | |||||
private String sendHttpGet(HttpGet httpGet) throws IOException { | |||||
CloseableHttpClient httpClient = null; | CloseableHttpClient httpClient = null; | ||||
CloseableHttpResponse response = null; | CloseableHttpResponse response = null; | ||||
HttpEntity entity = null; | HttpEntity entity = null; | ||||
@@ -167,8 +160,9 @@ public class HttpUtil { | |||||
entity = response.getEntity(); | entity = response.getEntity(); | ||||
responseContent = EntityUtils.toString(entity, "UTF-8"); | responseContent = EntityUtils.toString(entity, "UTF-8"); | ||||
} catch (Exception e) { | } catch (Exception e) { | ||||
logger.error(e.getMessage(),e); | |||||
logger.error(e.getMessage()); | |||||
} finally { | } finally { | ||||
httpClient.close(); | |||||
try { | try { | ||||
// 关闭连接,释放资源 | // 关闭连接,释放资源 | ||||
if (response != null) { | if (response != null) { | ||||
@@ -178,7 +172,7 @@ public class HttpUtil { | |||||
httpClient.close(); | httpClient.close(); | ||||
} | } | ||||
} catch (IOException e) { | } catch (IOException e) { | ||||
logger.error(e.getMessage(),e); | |||||
logger.error(e.getMessage()); | |||||
} | } | ||||
} | } | ||||
return responseContent; | return responseContent; | ||||
@@ -205,7 +199,7 @@ public class HttpUtil { | |||||
entity = response.getEntity(); | entity = response.getEntity(); | ||||
responseContent = EntityUtils.toString(entity, "UTF-8"); | responseContent = EntityUtils.toString(entity, "UTF-8"); | ||||
} catch (Exception e) { | } catch (Exception e) { | ||||
logger.error(e.getMessage(),e); | |||||
logger.error(e.getMessage()); | |||||
} finally { | } finally { | ||||
try { | try { | ||||
// 关闭连接,释放资源 | // 关闭连接,释放资源 | ||||
@@ -216,31 +210,9 @@ public class HttpUtil { | |||||
httpClient.close(); | httpClient.close(); | ||||
} | } | ||||
} catch (IOException e) { | } catch (IOException e) { | ||||
logger.error(e.getMessage(),e); | |||||
logger.error(e.getMessage()); | |||||
} | } | ||||
} | } | ||||
return responseContent; | 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; | |||||
} | |||||
} | } |
@@ -17,7 +17,7 @@ public class Md5Utils { | |||||
algorithm.update(s.getBytes(StandardCharsets.UTF_8)); | algorithm.update(s.getBytes(StandardCharsets.UTF_8)); | ||||
return algorithm.digest(); | return algorithm.digest(); | ||||
} catch (Exception e) { | } catch (Exception e) { | ||||
LOGGER.error("MD5 Error...", e); | |||||
LOGGER.error("MD5 Error...",e.getMessage()); | |||||
} | } | ||||
return null; | return null; | ||||
} | } | ||||
@@ -45,7 +45,7 @@ public class Md5Utils { | |||||
} | } | ||||
return new String(hex.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8); | return new String(hex.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8); | ||||
} catch (Exception e) { | } catch (Exception e) { | ||||
LOGGER.error("not supported charset:", e); | |||||
LOGGER.error("not supported charset:", e.getMessage()); | |||||
return s; | return s; | ||||
} | } | ||||
} | } |
@@ -0,0 +1,898 @@ | |||||
package com.ningdatech.kqapi.common.util; | |||||
import cn.hutool.core.convert.Convert; | |||||
import cn.hutool.core.date.LocalDateTimeUtil; | |||||
import cn.hutool.core.util.StrUtil; | |||||
import com.ningdatech.kqapi.common.exception.BizException; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import java.text.ParseException; | |||||
import java.text.SimpleDateFormat; | |||||
import java.time.*; | |||||
import java.time.format.DateTimeFormatter; | |||||
import java.time.temporal.ChronoUnit; | |||||
import java.util.*; | |||||
import java.util.stream.Stream; | |||||
import static cn.hutool.core.date.DatePattern.*; | |||||
/** | |||||
* 描述:日期工具类 | |||||
* | |||||
* @author WendyYang | |||||
* 修改时间:2018/4/24 | |||||
*/ | |||||
@Slf4j | |||||
public final class NdDateUtils { | |||||
public static final String DEFAULT_YEAR_FORMAT = "yyyy"; | |||||
public static final String DEFAULT_MONTH_FORMAT = "yyyy-MM"; | |||||
public static final String DEFAULT_MONTH_FORMAT_SLASH = "yyyy/MM"; | |||||
public static final String DEFAULT_MONTH_FORMAT_EN = "yyyy年MM月"; | |||||
public static final String DEFAULT_WEEK_FORMAT = "yyyy-ww"; | |||||
public static final String DEFAULT_WEEK_FORMAT_EN = "yyyy年ww周"; | |||||
public static final String DEFAULT_DATE_FORMAT = NORM_DATE_PATTERN; | |||||
public static final String DEFAULT_DATE_FORMAT_EN = CHINESE_DATE_PATTERN; | |||||
public static final String DEFAULT_DATE_TIME_FORMAT = NORM_DATETIME_PATTERN; | |||||
public static final String DEFAULT_DATE_TIME_START_FORMAT = "yyyy-MM-dd 00:00:00"; | |||||
public static final String DEFAULT_DATE_TIME_END_FORMAT = "yyyy-MM-dd 23:59:59"; | |||||
public static final String DEFAULT_DATE_TIME_FORMAT_EN = CHINESE_DATE_TIME_PATTERN; | |||||
public static final String DEFAULT_TIME_FORMAT = NORM_TIME_PATTERN; | |||||
public static final String DAY = "DAY"; | |||||
public static final String MONTH = "MONTH"; | |||||
public static final String WEEK = "WEEK"; | |||||
public static final String DEFAULT_DATE_FORMAT_MATCHES = "^\\d{4}-\\d{1,2}-\\d{1,2}$"; | |||||
public static final String DEFAULT_DATE_TIME_FORMAT_MATCHES = "^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$"; | |||||
public static final String DEFAULT_DATE_FORMAT_EN_MATCHES = "^\\d{4}年\\d{1,2}月\\d{1,2}日$"; | |||||
public static final String DEFAULT_DATE_TIME_FORMAT_EN_MATCHES = "^\\d{4}年\\d{1,2}月\\d{1,2}日\\d{1,2}时\\d{1,2}分\\d{1,2}秒$"; | |||||
public static final String SLASH_DATE_FORMAT_MATCHES = "^\\d{4}/\\d{1,2}/\\d{1,2}$"; | |||||
public static final String SLASH_DATE_TIME_FORMAT_MATCHES = "^\\d{4}/\\d{1,2}/\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$"; | |||||
public static final String SLASH_DATE_FORMAT = "yyyy/MM/dd"; | |||||
public static final String SLASH_DATE_TIME_FORMAT = "yyyy/MM/dd HH:mm:ss"; | |||||
public static final String CRON_FORMAT = "ss mm HH dd MM ? yyyy"; | |||||
/** | |||||
* 一个月平均天数 | |||||
*/ | |||||
public static final long MAX_MONTH_DAY = 30; | |||||
/** | |||||
* 3个月平均天数 | |||||
*/ | |||||
public static final long MAX_3_MONTH_DAY = 90; | |||||
/** | |||||
* 一年平均天数 | |||||
*/ | |||||
public static final long MAX_YEAR_DAY = 365; | |||||
private static final Map<String, String> DATE_FORMAT = new LinkedHashMap<>(5); | |||||
//---------------------------------------------------格式化日期start------------------------------------------------- | |||||
static { | |||||
DATE_FORMAT.put(DEFAULT_DATE_FORMAT, DEFAULT_DATE_FORMAT_MATCHES); | |||||
DATE_FORMAT.put(SLASH_DATE_FORMAT, SLASH_DATE_FORMAT_MATCHES); | |||||
DATE_FORMAT.put(DEFAULT_DATE_FORMAT_EN, DEFAULT_DATE_FORMAT_EN_MATCHES); | |||||
} | |||||
private NdDateUtils() { | |||||
} | |||||
/** | |||||
* 将字符串解析LocalDate | |||||
* | |||||
* @param source 源参数 | |||||
* 支持以下格式: | |||||
* yyyy-MM-dd | |||||
* yyyy/MM/dd | |||||
* yyyy年MM月dd日 | |||||
* @return 日期 | |||||
*/ | |||||
public static LocalDate parse(String source) { | |||||
String sourceTrim = source.trim(); | |||||
Set<Map.Entry<String, String>> entries = DATE_FORMAT.entrySet(); | |||||
for (Map.Entry<String, String> entry : entries) { | |||||
if (sourceTrim.matches(entry.getValue())) { | |||||
return LocalDate.parse(source, DateTimeFormatter.ofPattern(entry.getKey())); | |||||
} | |||||
} | |||||
throw BizException.wrap("解析日期失败, 请传递正确的日期格式"); | |||||
} | |||||
/** | |||||
* 转换 Date 为 cron , eg: "0 07 10 15 1 ? 2016" | |||||
* | |||||
* @param date 时间点 | |||||
* @return cron 表达式 | |||||
*/ | |||||
public static String getCron(Date date) { | |||||
return format(date, CRON_FORMAT); | |||||
} | |||||
/** | |||||
* 转换 LocalDateTime 为 cron , eg. "0 07 10 15 1 ? 2016" | |||||
* | |||||
* @param date 时间点 | |||||
* @return cron 表达式 | |||||
*/ | |||||
public static String getCron(LocalDateTime date) { | |||||
return format(date, CRON_FORMAT); | |||||
} | |||||
/** | |||||
* 格式化日期,返回格式为 yyyy-MM | |||||
* | |||||
* @param date 日期 | |||||
* @return 格式化后的字符串 | |||||
*/ | |||||
public static String format(LocalDateTime date, String pattern) { | |||||
if (date == null) { | |||||
date = LocalDateTime.now(); | |||||
} | |||||
if (pattern == null) { | |||||
pattern = DEFAULT_MONTH_FORMAT; | |||||
} | |||||
return date.format(DateTimeFormatter.ofPattern(pattern)); | |||||
} | |||||
public static String format(LocalDate date, String pattern) { | |||||
if (date == null) { | |||||
date = LocalDate.now(); | |||||
} | |||||
if (pattern == null) { | |||||
pattern = DEFAULT_MONTH_FORMAT; | |||||
} | |||||
return date.format(DateTimeFormatter.ofPattern(pattern)); | |||||
} | |||||
/** | |||||
* 根据传入的格式格式化日期.默认格式为MM月dd日 | |||||
* | |||||
* @param d 日期 | |||||
* @param f 格式 | |||||
* @return 格式化后的字符串 | |||||
*/ | |||||
public static String format(Date d, String f) { | |||||
Date date = d; | |||||
String format = f; | |||||
if (date == null) { | |||||
date = new Date(); | |||||
} | |||||
if (format == null) { | |||||
format = DEFAULT_DATE_TIME_FORMAT; | |||||
} | |||||
SimpleDateFormat df = new SimpleDateFormat(format); | |||||
return df.format(date); | |||||
} | |||||
/** | |||||
* 格式化日期,返回格式为 yyyy-MM-dd | |||||
* | |||||
* @param date 日期 | |||||
* @return 格式化后的字符串 | |||||
*/ | |||||
public static String formatAsDate(LocalDateTime date) { | |||||
return format(date, DEFAULT_DATE_FORMAT); | |||||
} | |||||
public static String formatAsDate(LocalDate date) { | |||||
return format(date, DEFAULT_DATE_FORMAT); | |||||
} | |||||
public static String formatAsDateEn(LocalDateTime date) { | |||||
return format(date, DEFAULT_DATE_FORMAT_EN); | |||||
} | |||||
public static String formatAsYearMonth(LocalDateTime date) { | |||||
return format(date, DEFAULT_MONTH_FORMAT); | |||||
} | |||||
public static String formatAsYearMonthEn(LocalDateTime date) { | |||||
return format(date, DEFAULT_MONTH_FORMAT_EN); | |||||
} | |||||
/** | |||||
* 格式化日期,返回格式为 yyyy-ww | |||||
* | |||||
* @param date 日期 | |||||
* @return 格式化后的字符串 | |||||
*/ | |||||
public static String formatAsYearWeek(LocalDateTime date) { | |||||
return format(date, DEFAULT_WEEK_FORMAT); | |||||
} | |||||
public static String formatAsYearWeekEn(LocalDateTime date) { | |||||
return format(date, DEFAULT_WEEK_FORMAT_EN); | |||||
} | |||||
/** | |||||
* 格式化日期,返回格式为 yyyy-MM | |||||
* | |||||
* @param date 日期 | |||||
* @return 格式化后的字符串 | |||||
*/ | |||||
public static String formatAsYearMonth(Date date) { | |||||
SimpleDateFormat df = new SimpleDateFormat(DEFAULT_MONTH_FORMAT); | |||||
return df.format(date); | |||||
} | |||||
/** | |||||
* 格式化日期,返回格式为 yyyy-ww | |||||
* | |||||
* @param date 日期 | |||||
* @return 格式化后的字符串 | |||||
*/ | |||||
public static String formatAsYearWeek(Date date) { | |||||
SimpleDateFormat df = new SimpleDateFormat(DEFAULT_WEEK_FORMAT); | |||||
return df.format(date); | |||||
} | |||||
/** | |||||
* 格式化日期,返回格式为 HH:mm:ss 例:12:24:24 | |||||
* | |||||
* @param date 日期 | |||||
* @return 格式化后的字符串 | |||||
*/ | |||||
public static String formatAsTime(Date date) { | |||||
SimpleDateFormat df = new SimpleDateFormat(DEFAULT_TIME_FORMAT); | |||||
return df.format(date); | |||||
} | |||||
/** | |||||
* 格式化日期,返回格式为 yyyy-MM-dd | |||||
* | |||||
* @param date 日期 | |||||
* @return 格式化后的字符串 | |||||
*/ | |||||
public static String formatAsDate(Date date) { | |||||
SimpleDateFormat df = new SimpleDateFormat(DEFAULT_DATE_FORMAT); | |||||
return df.format(date); | |||||
} | |||||
/** | |||||
* 格式化日期,返回格式为 yyyy-MM-dd HH:mm:ss | |||||
* | |||||
* @param date 日期 | |||||
* @return 格式化后的字符串 | |||||
*/ | |||||
public static String formatAsDateTime(Date date) { | |||||
SimpleDateFormat df = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT); | |||||
return df.format(date); | |||||
} | |||||
/** | |||||
* 格式化日期,返回格式为 dd ,即对应的天数. | |||||
* | |||||
* @param date 日期 | |||||
* @return 格式化后的字符串 | |||||
*/ | |||||
public static String formatAsDay(Date date) { | |||||
SimpleDateFormat df = new SimpleDateFormat("dd"); | |||||
return df.format(date); | |||||
} | |||||
//--格式化日期end----------------------------------------- | |||||
//--解析日期start----------------------------------------- | |||||
/** | |||||
* 将字符转换成日期 | |||||
* | |||||
* @param dateStr 日期字符串 | |||||
* @param format 解析格式 | |||||
* @return 解析后的日期 | |||||
*/ | |||||
public static Date parse(String dateStr, String format) { | |||||
Date date = null; | |||||
SimpleDateFormat dateFormat = new SimpleDateFormat(format); | |||||
dateFormat.setLenient(false); | |||||
try { | |||||
date = dateFormat.parse(dateStr); | |||||
} catch (Exception e) { | |||||
log.info("DateUtils error", e); | |||||
} | |||||
return date; | |||||
} | |||||
/** | |||||
* 获取当月最后一天 | |||||
* | |||||
* @param date 日期 | |||||
* @return 当月最后一天 | |||||
*/ | |||||
public static Date getLastDateOfMonth(Date date) { | |||||
Calendar calendar = Calendar.getInstance(); | |||||
calendar.setTime(date); | |||||
calendar.add(Calendar.MONTH, 1); | |||||
calendar.set(Calendar.DAY_OF_MONTH, 0); | |||||
return calendar.getTime(); | |||||
} | |||||
/** | |||||
* 根据传入的String返回对应的date | |||||
* | |||||
* @param source 日期字符串 | |||||
* @return 日期 | |||||
*/ | |||||
public static Date parseAsDate(String source) { | |||||
String sourceTrim = source.trim(); | |||||
Set<Map.Entry<String, String>> entries = DATE_FORMAT.entrySet(); | |||||
try { | |||||
for (Map.Entry<String, String> entry : entries) { | |||||
if (sourceTrim.matches(entry.getValue())) { | |||||
return new SimpleDateFormat(entry.getKey()).parse(source); | |||||
} | |||||
} | |||||
} catch (ParseException e) { | |||||
throw BizException.wrap("解析日期失败, 请传递正确的日期格式"); | |||||
} | |||||
throw BizException.wrap("解析日期失败, 请传递正确的日期格式"); | |||||
} | |||||
/** | |||||
* 按给定参数返回Date对象 | |||||
* | |||||
* @param dateTime 时间对象格式为("yyyy-MM-dd HH:mm:ss"); | |||||
* @return 解析后的日期 | |||||
*/ | |||||
public static Date parseAsDateTime(String dateTime) { | |||||
SimpleDateFormat simpledateformat = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT); | |||||
try { | |||||
return simpledateformat.parse(dateTime); | |||||
} catch (ParseException e) { | |||||
return null; | |||||
} | |||||
} | |||||
/** | |||||
* 获取指定日期的开始时间 | |||||
* 如:00:00:00 | |||||
* | |||||
* @param value 日期 | |||||
* @return 解析后的日期 | |||||
*/ | |||||
public static Date getDate0000(LocalDateTime value) { | |||||
return getDate0000(value.toLocalDate()); | |||||
} | |||||
/** | |||||
* 获取指定日期的开始时间 | |||||
* 如:00:00:00 | |||||
* | |||||
* @param value 日期 | |||||
* @return 解析后的日期 | |||||
*/ | |||||
public static Date getDate0000(Date value) { | |||||
return getDate0000(NdDateUtils.date2LocalDate(value)); | |||||
} | |||||
/** | |||||
* 获取指定日期的开始时间 | |||||
* 如:00:00:00 | |||||
* | |||||
* @param value 日期 | |||||
* @return 解析后的日期 | |||||
*/ | |||||
public static Date getDate0000(LocalDate value) { | |||||
LocalDateTime todayStart = LocalDateTime.of(value, LocalTime.MIN); | |||||
return NdDateUtils.localDateTime2Date(todayStart); | |||||
} | |||||
/** | |||||
* 获取指定日期的结束时间 | |||||
* 如:23:59:59 | |||||
* | |||||
* @param value 日期 | |||||
* @return 解析后的日期 | |||||
*/ | |||||
public static Date getDate2359(LocalDateTime value) { | |||||
return getDate2359(value.toLocalDate()); | |||||
} | |||||
/** | |||||
* 获取指定日期的结束时间 | |||||
* 如:23:59:59 | |||||
* | |||||
* @param value 日期 | |||||
* @return 解析后的日期 | |||||
*/ | |||||
public static Date getDate2359(Date value) { | |||||
return getDate2359(NdDateUtils.date2LocalDate(value)); | |||||
} | |||||
/** | |||||
* 获取指定日期的结束时间 | |||||
* 如:23:59:59 | |||||
* | |||||
* @param value 日期 | |||||
* @return 解析后的日期 | |||||
*/ | |||||
public static Date getDate2359(LocalDate value) { | |||||
LocalDateTime dateEnd = LocalDateTime.of(value, LocalTime.MAX); | |||||
return NdDateUtils.localDateTime2Date(dateEnd); | |||||
} | |||||
/** | |||||
* LocalDateTime转换为Date | |||||
* | |||||
* @param localDateTime 日期 | |||||
* @return 解析后的日期 | |||||
*/ | |||||
public static Date localDateTime2Date(LocalDateTime localDateTime) { | |||||
ZoneId zoneId = ZoneId.systemDefault(); | |||||
ZonedDateTime zdt = localDateTime.atZone(zoneId); | |||||
return Date.from(zdt.toInstant()); | |||||
} | |||||
//--解析日期 end----------------------------------------- | |||||
/** | |||||
* Date转换为LocalDateTime | |||||
* | |||||
* @param date 日期 | |||||
*/ | |||||
public static LocalDateTime date2LocalDateTime(Date date) { | |||||
if (date == null) { | |||||
return LocalDateTime.now(); | |||||
} | |||||
Instant instant = date.toInstant(); | |||||
ZoneId zoneId = ZoneId.systemDefault(); | |||||
return instant.atZone(zoneId).toLocalDateTime(); | |||||
} | |||||
/** | |||||
* 日期转 LocalDate | |||||
* | |||||
* @param date 日期 | |||||
* @return 解析后的日期 | |||||
*/ | |||||
public static LocalDate date2LocalDate(Date date) { | |||||
if (date == null) { | |||||
return LocalDate.now(); | |||||
} | |||||
Instant instant = date.toInstant(); | |||||
ZoneId zoneId = ZoneId.systemDefault(); | |||||
return instant.atZone(zoneId).toLocalDate(); | |||||
} | |||||
/** | |||||
* 日期转 LocalTime | |||||
* | |||||
* @param date 日期 | |||||
* @return 解析后的日期 | |||||
*/ | |||||
public static LocalTime date2LocalTime(Date date) { | |||||
if (date == null) { | |||||
return LocalTime.now(); | |||||
} | |||||
Instant instant = date.toInstant(); | |||||
ZoneId zoneId = ZoneId.systemDefault(); | |||||
return instant.atZone(zoneId).toLocalTime(); | |||||
} | |||||
/** | |||||
* 毫秒转日期 | |||||
* | |||||
* @param epochMilli 毫秒 | |||||
* @return 解析后的日期 | |||||
*/ | |||||
public static LocalDateTime getDateTimeOfTimestamp(long epochMilli) { | |||||
Instant instant = Instant.ofEpochMilli(epochMilli); | |||||
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); | |||||
} | |||||
/** | |||||
* 秒转日期 | |||||
* | |||||
* @param epochSecond 秒 | |||||
* @return 解析后的日期 | |||||
*/ | |||||
public static LocalDateTime getDateTimeOfSecond(long epochSecond) { | |||||
Instant instant = Instant.ofEpochSecond(epochSecond); | |||||
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); | |||||
} | |||||
//-计算日期 start------------------------------------------ | |||||
/** | |||||
* 计算结束时间与当前时间间隔的天数 | |||||
* | |||||
* @param endDate 结束日期 | |||||
* @return 计算结束时间与当前时间间隔的天数 | |||||
*/ | |||||
public static long until(Date endDate) { | |||||
return LocalDateTime.now().until(date2LocalDateTime(endDate), ChronoUnit.DAYS); | |||||
} | |||||
/** | |||||
* 计算结束时间与开始时间间隔的天数 | |||||
* | |||||
* @param startDate 开始日期 | |||||
* @param endDate 结束日期 | |||||
* @return 计算结束时间与开始时间间隔的天数 | |||||
*/ | |||||
public static long until(Date startDate, Date endDate) { | |||||
return date2LocalDateTime(startDate).until(date2LocalDateTime(endDate), ChronoUnit.DAYS); | |||||
} | |||||
/** | |||||
* 计算结束时间与开始时间间隔的天数 | |||||
* | |||||
* @param startDate 开始日期 | |||||
* @param endDate 结束日期 | |||||
* @return 计算结束时间与开始时间间隔的天数 | |||||
*/ | |||||
public static long until(LocalDateTime startDate, LocalDateTime endDate) { | |||||
return startDate.until(endDate, ChronoUnit.DAYS); | |||||
} | |||||
public static long until(LocalDate startDate, LocalDate endDate) { | |||||
return startDate.until(endDate, ChronoUnit.DAYS); | |||||
} | |||||
/** | |||||
* 计算2个日期之间的所有的日期 yyyy-MM-dd | |||||
* 含头含尾 | |||||
* | |||||
* @param start yyyy-MM-dd | |||||
* @param end yyyy-MM-dd | |||||
* @return 日期区间的所有日期 | |||||
*/ | |||||
public static List<String> getBetweenDay(Date start, Date end) { | |||||
return getBetweenDay(date2LocalDate(start), date2LocalDate(end)); | |||||
} | |||||
/** | |||||
* 计算2个日期之间的所有的日期 yyyy-MM-dd | |||||
* 含头含尾 | |||||
* | |||||
* @param start yyyy-MM-dd | |||||
* @param end yyyy-MM-dd | |||||
*/ | |||||
public static List<String> getBetweenDay(String start, String end) { | |||||
return getBetweenDay(LocalDate.parse(start), LocalDate.parse(end)); | |||||
} | |||||
/** | |||||
* 计算2个日期之间的所有的日期 yyyy-MM-dd | |||||
* 含头含尾 | |||||
* | |||||
* @param startDate yyyy-MM-dd | |||||
* @param endDate yyyy-MM-dd | |||||
*/ | |||||
public static List<String> getBetweenDay(LocalDate startDate, LocalDate endDate) { | |||||
return getBetweenDay(startDate, endDate, DEFAULT_DATE_FORMAT); | |||||
} | |||||
public static List<String> getBetweenDayEn(LocalDate startDate, LocalDate endDate) { | |||||
return getBetweenDay(startDate, endDate, DEFAULT_DATE_FORMAT_EN); | |||||
} | |||||
public static List<String> getBetweenDay(LocalDate startDate, LocalDate endDate, String pattern) { | |||||
if (pattern == null) { | |||||
pattern = DEFAULT_DATE_FORMAT; | |||||
} | |||||
List<String> list = new ArrayList<>(); | |||||
long distance = ChronoUnit.DAYS.between(startDate, endDate); | |||||
if (distance < 1) { | |||||
return list; | |||||
} | |||||
String finalPattern = pattern; | |||||
Stream.iterate(startDate, d -> d.plusDays(1)). | |||||
limit(distance + 1) | |||||
.forEach(f -> list.add(f.format(DateTimeFormatter.ofPattern(finalPattern)))); | |||||
return list; | |||||
} | |||||
/** | |||||
* 计算2个日期之间的所有的周 yyyy-ww | |||||
* 含头含尾 | |||||
* | |||||
* @param start yyyy-MM-dd | |||||
* @param end yyyy-MM-dd | |||||
*/ | |||||
public static List<String> getBetweenWeek(Date start, Date end) { | |||||
return getBetweenWeek(date2LocalDate(start), date2LocalDate(end)); | |||||
} | |||||
/** | |||||
* 计算2个日期之间的所有的周 yyyy-ww | |||||
* 含头含尾 | |||||
* | |||||
* @param start yyyy-MM-dd | |||||
* @param end yyyy-MM-dd | |||||
* @return 2个日期之间的所有的周 | |||||
*/ | |||||
public static List<String> getBetweenWeek(String start, String end) { | |||||
return getBetweenWeek(LocalDate.parse(start), LocalDate.parse(end)); | |||||
} | |||||
/** | |||||
* 计算2个日期之间的所有的周 yyyy-ww | |||||
* 含头含尾 | |||||
* | |||||
* @param startDate yyyy-MM-dd | |||||
* @param endDate yyyy-MM-dd | |||||
* @return 2个日期之间的所有的周 | |||||
*/ | |||||
public static List<String> getBetweenWeek(LocalDate startDate, LocalDate endDate) { | |||||
return getBetweenWeek(startDate, endDate, DEFAULT_WEEK_FORMAT); | |||||
} | |||||
public static List<String> getBetweenWeek(LocalDate startDate, LocalDate endDate, String pattern) { | |||||
List<String> list = new ArrayList<>(); | |||||
long distance = ChronoUnit.WEEKS.between(startDate, endDate); | |||||
if (distance < 1) { | |||||
return list; | |||||
} | |||||
Stream.iterate(startDate, d -> d.plusWeeks(1)). | |||||
limit(distance + 1).forEach(f -> list.add(f.format(DateTimeFormatter.ofPattern(pattern)))); | |||||
return list; | |||||
} | |||||
/** | |||||
* 计算2个日期之间的所有的月 yyyy-MM | |||||
* | |||||
* @param start yyyy-MM-dd | |||||
* @param end yyyy-MM-dd | |||||
* @return 2个日期之间的所有的月 | |||||
*/ | |||||
public static List<String> getBetweenMonth(Date start, Date end) { | |||||
return getBetweenMonth(date2LocalDate(start), date2LocalDate(end)); | |||||
} | |||||
/** | |||||
* 计算2个日期之间的所有的月 yyyy-MM | |||||
* | |||||
* @param start yyyy-MM-dd | |||||
* @param end yyyy-MM-dd | |||||
* @return 2个日期之间的所有的月 | |||||
*/ | |||||
public static List<String> getBetweenMonth(String start, String end) { | |||||
return getBetweenMonth(LocalDate.parse(start), LocalDate.parse(end)); | |||||
} | |||||
/** | |||||
* 计算2个日期之间的所有的月 yyyy-MM | |||||
* | |||||
* @param startDate yyyy-MM-dd | |||||
* @param endDate yyyy-MM-dd | |||||
* @return 2个日期之间的所有的月 | |||||
*/ | |||||
public static List<String> getBetweenMonth(LocalDate startDate, LocalDate endDate) { | |||||
return getBetweenMonth(startDate, endDate, DEFAULT_MONTH_FORMAT); | |||||
} | |||||
public static List<String> getBetweenMonth(LocalDate startDate, LocalDate endDate, String pattern) { | |||||
List<String> list = new ArrayList<>(); | |||||
long distance = ChronoUnit.MONTHS.between(startDate, endDate); | |||||
if (distance < 1) { | |||||
return list; | |||||
} | |||||
Stream.iterate(startDate, d -> d.plusMonths(1)) | |||||
.limit(distance + 1) | |||||
.forEach(f -> list.add(f.format(DateTimeFormatter.ofPattern(pattern)))); | |||||
return list; | |||||
} | |||||
/** | |||||
* 计算时间区间内的日期列表,并返回 | |||||
* | |||||
* @param startTime 开始 | |||||
* @param endTime 结束 | |||||
* @param dateList 日期 | |||||
* @return 计算时间区间内的日期列表 | |||||
*/ | |||||
public static String calculationEn(LocalDateTime startTime, LocalDateTime endTime, List<String> dateList) { | |||||
if (startTime == null) { | |||||
startTime = LocalDateTime.now(); | |||||
} | |||||
if (endTime == null) { | |||||
endTime = LocalDateTime.now().plusDays(30); | |||||
} | |||||
return calculationEn(startTime.toLocalDate(), endTime.toLocalDate(), dateList); | |||||
} | |||||
public static String calculation(LocalDate startDate, LocalDate endDate, List<String> dateList) { | |||||
if (startDate == null) { | |||||
startDate = LocalDate.now(); | |||||
} | |||||
if (endDate == null) { | |||||
endDate = LocalDate.now().plusDays(30); | |||||
} | |||||
if (dateList == null) { | |||||
dateList = new ArrayList<>(); | |||||
} | |||||
long day = until(startDate, endDate); | |||||
String dateType; | |||||
if (day >= 0 && day <= MAX_MONTH_DAY) { | |||||
dateType = DAY; | |||||
dateList.addAll(NdDateUtils.getBetweenDay(startDate, endDate, DEFAULT_DATE_FORMAT)); | |||||
} else if (day > MAX_MONTH_DAY && day <= MAX_3_MONTH_DAY) { | |||||
dateType = WEEK; | |||||
dateList.addAll(NdDateUtils.getBetweenWeek(startDate, endDate, DEFAULT_WEEK_FORMAT)); | |||||
} else if (day > MAX_3_MONTH_DAY && day <= MAX_YEAR_DAY) { | |||||
dateType = MONTH; | |||||
dateList.addAll(NdDateUtils.getBetweenMonth(startDate, endDate, DEFAULT_MONTH_FORMAT)); | |||||
} else { | |||||
throw new BizException("日期参数只能介于0-365天之间"); | |||||
} | |||||
return dateType; | |||||
} | |||||
public static String calculationEn(LocalDate startDate, LocalDate endDate, List<String> dateList) { | |||||
if (startDate == null) { | |||||
startDate = LocalDate.now(); | |||||
} | |||||
if (endDate == null) { | |||||
endDate = LocalDate.now().plusDays(30); | |||||
} | |||||
if (dateList == null) { | |||||
dateList = new ArrayList<>(); | |||||
} | |||||
long day = until(startDate, endDate); | |||||
String dateType; | |||||
if (day >= 0 && day <= MAX_MONTH_DAY) { | |||||
dateType = DAY; | |||||
dateList.addAll(NdDateUtils.getBetweenDay(startDate, endDate, DEFAULT_DATE_FORMAT_EN)); | |||||
} else if (day > MAX_MONTH_DAY && day <= MAX_3_MONTH_DAY) { | |||||
dateType = WEEK; | |||||
dateList.addAll(NdDateUtils.getBetweenWeek(startDate, endDate, DEFAULT_WEEK_FORMAT_EN)); | |||||
} else if (day > MAX_3_MONTH_DAY && day <= MAX_YEAR_DAY) { | |||||
dateType = MONTH; | |||||
dateList.addAll(NdDateUtils.getBetweenMonth(startDate, endDate, DEFAULT_MONTH_FORMAT_EN)); | |||||
} else { | |||||
throw new BizException("日期参数只能介于0-365天之间"); | |||||
} | |||||
return dateType; | |||||
} | |||||
//----------//----------//----------//----------//----------//----------//----------//----------//----------//----------//---------- | |||||
/** | |||||
* 计算开始时间 | |||||
* | |||||
* @param time 日期 | |||||
* @return 计算开始时间 | |||||
*/ | |||||
public static LocalDateTime getStartTime(String time) { | |||||
String startTime = time; | |||||
if (time.matches("^\\d{4}-\\d{1,2}$")) { | |||||
startTime = time + "-01 00:00:00"; | |||||
} else if (time.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) { | |||||
startTime = time + " 00:00:00"; | |||||
} else if (time.matches("^\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}$")) { | |||||
startTime = time + ":00"; | |||||
} else if (time.matches("^\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}.\\d{3}Z$")) { | |||||
startTime = time.replace("T", " ").substring(0, time.indexOf('.')); | |||||
} | |||||
return LocalDateTimeUtil.beginOfDay(LocalDateTime.parse(startTime, DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))); | |||||
} | |||||
/** | |||||
* 计算结束时间 | |||||
* | |||||
* @param time 日期 | |||||
* @return 结束时间 精确到毫秒 | |||||
*/ | |||||
public static LocalDateTime getEndTime(String time) { | |||||
String startTime = time; | |||||
if (time.matches("^\\d{4}-\\d{1,2}$")) { | |||||
Date date = NdDateUtils.parse(time, "yyyy-MM"); | |||||
date = NdDateUtils.getLastDateOfMonth(date); | |||||
startTime = NdDateUtils.formatAsDate(date) + " 23:59:59"; | |||||
} else if (time.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) { | |||||
startTime = time + " 23:59:59"; | |||||
} else if (time.matches("^\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}$")) { | |||||
startTime = time + ":59"; | |||||
} else if (time.matches("^\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}.\\d{3}Z$")) { | |||||
time = time.replace("T", " ").substring(0, time.indexOf('.')); | |||||
startTime = time; | |||||
} | |||||
return endOfDay(LocalDateTime.parse(startTime, DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))); | |||||
} | |||||
public static LocalDateTime endOfDay(LocalDateTime time) { | |||||
return time.with(LocalTime.of(23, 59, 59, 999_999_000)); | |||||
} | |||||
/** | |||||
* 判断当前时间是否在指定时间范围 | |||||
* | |||||
* @param from 开始时间 | |||||
* @param to 结束时间 | |||||
* @return 结果 | |||||
*/ | |||||
public static boolean between(LocalTime from, LocalTime to) { | |||||
if (from == null) { | |||||
throw new IllegalArgumentException("开始时间不能为空"); | |||||
} | |||||
if (to == null) { | |||||
throw new IllegalArgumentException("结束时间不能为空"); | |||||
} | |||||
LocalTime now = LocalTime.now(); | |||||
return now.isAfter(from) && now.isBefore(to); | |||||
} | |||||
/** | |||||
* 转换日期 | |||||
* <p> | |||||
* 0: 今天结束的日期 | |||||
* 1m: 1分钟后的日期 | |||||
* 1h: 1小时后的日期 | |||||
* 4d: 4天后的日期 | |||||
* 2w: 2周后的日期 | |||||
* 3M: 3个月后的日期 | |||||
* 5y: 5年后的日期 | |||||
* | |||||
* @param dateTime 待转换日期 | |||||
* @param time 转换格式 如: | |||||
* 0 当天23:59:59 | |||||
* 1s 1秒后 | |||||
* 3m 3分钟后 | |||||
* 2w 2周后 | |||||
* 1h 1小时后 | |||||
* 2H 2小时后 | |||||
* 4d 4天后 | |||||
* 5M 5月后 | |||||
* 6y 6年后 | |||||
* @return 日期 | |||||
*/ | |||||
public static LocalDateTime conversionDateTime(LocalDateTime dateTime, String time) { | |||||
if (StrUtil.isEmpty(time)) { | |||||
return LocalDateTime.MAX; | |||||
} | |||||
if (dateTime == null) { | |||||
return endOfDay(LocalDateTime.now()); | |||||
} | |||||
// 今天的23:59:59 | |||||
if (StrPool.ZERO.equals(time)) { | |||||
return endOfDay(dateTime); | |||||
} | |||||
char unit = Character.toLowerCase(time.charAt(time.length() - 1)); | |||||
if (time.length() == 1) { | |||||
unit = 'd'; | |||||
} | |||||
Long lastTime = Convert.toLong(time.substring(0, time.length() - 1)); | |||||
switch (unit) { | |||||
//秒 | |||||
case 's': | |||||
return dateTime.plusSeconds(lastTime); | |||||
//分 | |||||
case 'm': | |||||
return dateTime.plusMinutes(lastTime); | |||||
//时 | |||||
case 'h' | 'H': | |||||
return dateTime.plusHours(lastTime); | |||||
//周 | |||||
case 'w': | |||||
return dateTime.plusWeeks(lastTime); | |||||
//月 | |||||
case 'M': | |||||
return dateTime.plusMonths(lastTime); | |||||
//年 | |||||
case 'y': | |||||
return dateTime.plusYears(lastTime); | |||||
//天 | |||||
case 'd': | |||||
default: | |||||
return dateTime.plusDays(lastTime); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,35 @@ | |||||
package com.ningdatech.kqapi.common.util; | |||||
import com.fasterxml.jackson.databind.module.SimpleModule; | |||||
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; | |||||
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; | |||||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; | |||||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; | |||||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; | |||||
import com.ningdatech.kqapi.common.converter.NdLocalDateTimeDeserializer; | |||||
import java.time.LocalDate; | |||||
import java.time.LocalDateTime; | |||||
import java.time.LocalTime; | |||||
import java.time.format.DateTimeFormatter; | |||||
import static com.ningdatech.kqapi.common.util.NdDateUtils.*; | |||||
/** | |||||
* jackson 自定义序列化 & 反序列化 规则 | |||||
* | |||||
* @author WendyYang | |||||
*/ | |||||
public class NdJacksonModule extends SimpleModule { | |||||
public NdJacksonModule() { | |||||
super(); | |||||
this.addDeserializer(LocalDateTime.class, NdLocalDateTimeDeserializer.INSTANCE); | |||||
this.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))); | |||||
this.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT))); | |||||
this.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))); | |||||
this.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))); | |||||
this.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT))); | |||||
} | |||||
} |
@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; | |||||
import com.alibaba.fastjson.JSONObject; | import com.alibaba.fastjson.JSONObject; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import java.io.IOException; | |||||
import java.util.HashMap; | import java.util.HashMap; | ||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.Objects; | import java.util.Objects; | ||||
@@ -16,7 +17,7 @@ import java.util.Objects; | |||||
*/ | */ | ||||
@Slf4j | @Slf4j | ||||
public class RefreshKeyUtil { | public class RefreshKeyUtil { | ||||
public static String getRequestSecret(String appKey, String appSecret,Long requestTime) { | |||||
public static String getRequestSecret(String appKey, String appSecret,Long requestTime) throws IOException { | |||||
// 刷新秘钥 | // 刷新秘钥 | ||||
HttpUtil httpUtil = HttpUtil.getInstance(); | HttpUtil httpUtil = HttpUtil.getInstance(); | ||||
log.info("请求密钥" + appSecret); | log.info("请求密钥" + appSecret); | ||||
@@ -36,7 +37,7 @@ public class RefreshKeyUtil { | |||||
return result; | return result; | ||||
} | } | ||||
public static String refreshSecret(String appKey, String refreshSecret,Long requestTime) { | |||||
public static String refreshSecret(String appKey, String refreshSecret,Long requestTime) throws IOException { | |||||
// 刷新秘钥 | // 刷新秘钥 | ||||
HttpUtil httpUtil = HttpUtil.getInstance(); | HttpUtil httpUtil = HttpUtil.getInstance(); | ||||
log.info("刷新密钥" + refreshSecret); | log.info("刷新密钥" + refreshSecret); | ||||
@@ -0,0 +1,95 @@ | |||||
package com.ningdatech.kqapi.common.util; | |||||
import org.springframework.context.ApplicationContext; | |||||
import org.springframework.util.Assert; | |||||
import java.util.Map; | |||||
/** | |||||
* Spring工具类 | |||||
* | |||||
* @author WendyYang | |||||
* @date 2017-12-25 16:27 | |||||
*/ | |||||
public final class SpringUtils { | |||||
private SpringUtils() { | |||||
} | |||||
/** | |||||
* 单例Holder模式: 优点:将懒加载和线程安全完美结合的一种方式(无锁)。(推荐) | |||||
* | |||||
* @return 实实例 | |||||
*/ | |||||
public static SpringUtils getInstance() { | |||||
return SpringUtilsHolder.INSTANCE; | |||||
} | |||||
private static ApplicationContext applicationContext; | |||||
private static ApplicationContext parentApplicationContext; | |||||
public static ApplicationContext getApplicationContext() { | |||||
return applicationContext; | |||||
} | |||||
public static void setApplicationContext(ApplicationContext ctx) { | |||||
Assert.notNull(ctx, "SpringUtil injection ApplicationContext is null"); | |||||
applicationContext = ctx; | |||||
parentApplicationContext = ctx.getParent(); | |||||
} | |||||
public static Object getBean(String name) { | |||||
Assert.hasText(name, "SpringUtil name is null or empty"); | |||||
try { | |||||
return applicationContext.getBean(name); | |||||
} catch (Exception e) { | |||||
return parentApplicationContext.getBean(name); | |||||
} | |||||
} | |||||
public static <T> T getBean(String name, Class<T> type) { | |||||
Assert.hasText(name, "SpringUtil name is null or empty"); | |||||
Assert.notNull(type, "SpringUtil type is null"); | |||||
try { | |||||
return applicationContext.getBean(name, type); | |||||
} catch (Exception e) { | |||||
return parentApplicationContext.getBean(name, type); | |||||
} | |||||
} | |||||
public static <T> T getBean(Class<T> type) { | |||||
Assert.notNull(type, "SpringUtil type is null"); | |||||
try { | |||||
return applicationContext.getBean(type); | |||||
} catch (Exception e) { | |||||
return parentApplicationContext.getBean(type); | |||||
} | |||||
} | |||||
public static <T> Map<String, T> getBeansOfType(Class<T> type) { | |||||
Assert.notNull(type, "SpringUtil type is null"); | |||||
try { | |||||
return applicationContext.getBeansOfType(type); | |||||
} catch (Exception e) { | |||||
return parentApplicationContext.getBeansOfType(type); | |||||
} | |||||
} | |||||
public static ApplicationContext publishEvent(Object event) { | |||||
applicationContext.publishEvent(event); | |||||
return applicationContext; | |||||
} | |||||
/** | |||||
* <p> | |||||
* 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例 | |||||
* 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载 | |||||
*/ | |||||
private static class SpringUtilsHolder { | |||||
/** | |||||
* 静态初始化器,由JVM来保证线程安全 | |||||
*/ | |||||
private static final SpringUtils INSTANCE = new SpringUtils(); | |||||
} | |||||
} |
@@ -0,0 +1,148 @@ | |||||
package com.ningdatech.kqapi.common.util; | |||||
/** | |||||
* <p> | |||||
* 常用字符串 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @date 2019/07/25 | |||||
*/ | |||||
public interface StrPool { | |||||
String AMPERSAND = "&"; | |||||
String AND = "and"; | |||||
String AT = "@"; | |||||
String ASTERISK = "*"; | |||||
String STAR = "*"; | |||||
String BACK_SLASH = "\\"; | |||||
String COLON = ":"; | |||||
String COMMA = ","; | |||||
String DASH = "-"; | |||||
String DOLLAR = "$"; | |||||
String DOT = "."; | |||||
String DOTDOT = ".."; | |||||
String DOT_CLASS = ".class"; | |||||
String DOT_JAVA = ".java"; | |||||
String DOT_XML = ".xml"; | |||||
String EMPTY = ""; | |||||
String EQUALS = "="; | |||||
String FALSE = "false"; | |||||
String SLASH = "/"; | |||||
String HASH = "#"; | |||||
String HAT = "^"; | |||||
String LEFT_BRACE = "{"; | |||||
String BRACE = "{}"; | |||||
String LEFT_BRACKET = "("; | |||||
char LEFT_BRACKET_CHAR = '('; | |||||
String LEFT_CHEV = "<"; | |||||
String NEWLINE = "\n"; | |||||
String N = "n"; | |||||
String NO = "no"; | |||||
String NULL = "null"; | |||||
String OFF = "off"; | |||||
String ON = "on"; | |||||
String PERCENT = "%"; | |||||
String PIPE = "|"; | |||||
String PLUS = "+"; | |||||
String QUESTION_MARK = "?"; | |||||
String EXCLAMATION_MARK = "!"; | |||||
String QUOTE = "\""; | |||||
String RETURN = "\r"; | |||||
String TAB = "\t"; | |||||
String RIGHT_BRACE = "}"; | |||||
String RIGHT_BRACKET = ")"; | |||||
String RIGHT_CHEV = ">"; | |||||
String SEMICOLON = ";"; | |||||
String SEMICOLON_CHINA = ";"; | |||||
String SINGLE_QUOTE = "'"; | |||||
String BACKTICK = "`"; | |||||
String SPACE = " "; | |||||
String TILDA = "~"; | |||||
String LEFT_SQ_BRACKET = "["; | |||||
String RIGHT_SQ_BRACKET = "]"; | |||||
String TRUE = "true"; | |||||
String UNDERSCORE = "_"; | |||||
String UTF_8 = "UTF-8"; | |||||
String GBK = "GBK"; | |||||
String US_ASCII = "US-ASCII"; | |||||
String ISO_8859_1 = "ISO-8859-1"; | |||||
String Y = "y"; | |||||
String YES = "yes"; | |||||
String ONE = "1"; | |||||
String ZERO = "0"; | |||||
String DOLLAR_LEFT_BRACE = "${"; | |||||
String HASH_LEFT_BRACE = "#{"; | |||||
String CRLF = "\r\n"; | |||||
String HTML_NBSP = " "; | |||||
String HTML_AMP = "&"; | |||||
String HTML_QUOTE = """; | |||||
String HTML_LT = "<"; | |||||
String HTML_GT = ">"; | |||||
String STRING_TYPE_NAME = "java.lang.String"; | |||||
String LONG_TYPE_NAME = "java.lang.Long"; | |||||
String BYTE_TYPE_NAME = "java.lang.Byte"; | |||||
String CHARACTER_TYPE_NAME = "java.lang.Character"; | |||||
String INTEGER_TYPE_NAME = "java.lang.Integer"; | |||||
String SHORT_TYPE_NAME = "java.lang.Short"; | |||||
String DOUBLE_TYPE_NAME = "java.lang.Double"; | |||||
String FLOAT_TYPE_NAME = "java.lang.Float"; | |||||
String BOOLEAN_TYPE_NAME = "java.lang.Boolean"; | |||||
String SET_TYPE_NAME = "java.util.Set"; | |||||
String LIST_TYPE_NAME = "java.util.List"; | |||||
String COLLECTION_TYPE_NAME = "java.util.Collection"; | |||||
String DATE_TYPE_NAME = "java.util.Date"; | |||||
String LOCAL_DATE_TIME_TYPE_NAME = "java.time.LocalDateTime"; | |||||
String LOCAL_DATE_TYPE_NAME = "java.time.LocalDate"; | |||||
String LOCAL_TIME_TYPE_NAME = "java.time.LocalTime"; | |||||
String JAVA_TEMP_DIR = "java.io.tmpdir"; | |||||
String ARRAY = "Array"; | |||||
String INTEGER = "Integer"; | |||||
String FLOAT = "Float"; | |||||
String DATETIME = "DateTime"; | |||||
String DATE = "Date"; | |||||
String TIME = "Time"; | |||||
String BOOLEAN = "Boolean"; | |||||
String HTTPS_PREFIX = "https://"; | |||||
String HTTP_PREFIX = "http://"; | |||||
String HTTPS = "https"; | |||||
String HTTP = "http"; | |||||
/** | |||||
* 编码 | |||||
*/ | |||||
String UTF8 = "UTF-8"; | |||||
/** | |||||
* JSON 资源 | |||||
*/ | |||||
String CONTENT_TYPE = "application/json; charset=utf-8"; | |||||
/** | |||||
* 用于随机选的字符 | |||||
*/ | |||||
String BASE_UPPER_CHAR = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; | |||||
String TEST_TOKEN = "Bearer test"; | |||||
String TEST = "test"; | |||||
String PROD = "prod"; | |||||
String DEV = "dev"; | |||||
/** | |||||
* 默认的父id | |||||
*/ | |||||
Long DEF_PARENT_ID = 0L; | |||||
String UNKNOWN = "unknown"; | |||||
/** | |||||
* 日期 个位数前面补0 | |||||
*/ | |||||
String FORMAT_DATE_SINGLE_DIGITS = "%02d"; | |||||
/** | |||||
* 不足三位的数字前面补0 | |||||
*/ | |||||
String FORMAT_NUMBER_THREE = "%03d"; | |||||
} |
@@ -0,0 +1,40 @@ | |||||
package com.ningdatech.kqapi.open.controller; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.jasypt.util.text.BasicTextEncryptor; | |||||
import org.springframework.validation.annotation.Validated; | |||||
import org.springframework.web.bind.annotation.*; | |||||
import java.time.LocalDateTime; | |||||
import java.time.format.DateTimeFormatter; | |||||
/** | |||||
* <p> | |||||
* 前端控制器 | |||||
* </p> | |||||
* | |||||
* @author ZPF | |||||
* @since 2023-10-27 | |||||
*/ | |||||
@Slf4j | |||||
@Validated | |||||
@RestController | |||||
@RequestMapping | |||||
@RequiredArgsConstructor | |||||
public class HealthController { | |||||
@GetMapping("/health") | |||||
public JSONObject health() { | |||||
JSONObject json = new JSONObject(); | |||||
json.put("code","200"); | |||||
json.put("area","柯桥区"); | |||||
json.put("chargePerson","李*"); | |||||
json.put("appName","企业线上平台"); | |||||
json.put("mobile","156*****306"); | |||||
json.put("time",LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); | |||||
json.put("dept","产业发展科"); | |||||
return json; | |||||
} | |||||
} |
@@ -5,23 +5,17 @@ import com.ningdatech.kqapi.scheduler.manage.SynManage; | |||||
import com.ningdatech.kqapi.scheduler.task.CheckMattersUrlTask; | import com.ningdatech.kqapi.scheduler.task.CheckMattersUrlTask; | ||||
import com.ningdatech.kqapi.scheduler.task.RemoveMattersTask; | import com.ningdatech.kqapi.scheduler.task.RemoveMattersTask; | ||||
import com.ningdatech.kqapi.scheduler.task.SynTask; | import com.ningdatech.kqapi.scheduler.task.SynTask; | ||||
import com.ningdatech.kqapi.zzsfw.entity.vo.MatterTopVO; | |||||
import com.ningdatech.kqapi.zzsfw.entity.vo.TreeVO; | |||||
import com.ningdatech.kqapi.zzsfw.manage.MatterManage; | |||||
import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.springframework.validation.annotation.Validated; | import org.springframework.validation.annotation.Validated; | ||||
import org.springframework.web.bind.annotation.GetMapping; | import org.springframework.web.bind.annotation.GetMapping; | ||||
import org.springframework.web.bind.annotation.PostMapping; | |||||
import org.springframework.web.bind.annotation.RequestMapping; | import org.springframework.web.bind.annotation.RequestMapping; | ||||
import org.springframework.web.bind.annotation.RestController; | import org.springframework.web.bind.annotation.RestController; | ||||
import java.net.MalformedURLException; | import java.net.MalformedURLException; | ||||
import java.net.UnknownHostException; | import java.net.UnknownHostException; | ||||
import java.util.Arrays; | import java.util.Arrays; | ||||
import java.util.List; | |||||
/** | /** | ||||
* <p> | * <p> | ||||
@@ -1,29 +1,35 @@ | |||||
package com.ningdatech.kqapi.scheduler.task; | package com.ningdatech.kqapi.scheduler.task; | ||||
import cn.hutool.core.date.StopWatch; | import cn.hutool.core.date.StopWatch; | ||||
import com.alibaba.fastjson.JSON; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.google.common.collect.Lists; | import com.google.common.collect.Lists; | ||||
import com.ningdatech.basic.model.ApiResponse; | |||||
import com.ningdatech.kqapi.common.model.entity.Item; | import com.ningdatech.kqapi.common.model.entity.Item; | ||||
import com.ningdatech.kqapi.common.util.HttpUtil; | import com.ningdatech.kqapi.common.util.HttpUtil; | ||||
import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwMenu; | import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwMenu; | ||||
import com.ningdatech.kqapi.zzsfw.service.INdKqZzsfwMenuService; | import com.ningdatech.kqapi.zzsfw.service.INdKqZzsfwMenuService; | ||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
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.impl.client.CloseableHttpClient; | |||||
import org.apache.http.impl.client.HttpClientBuilder; | |||||
import org.apache.http.impl.client.HttpClients; | |||||
import org.apache.http.ssl.SSLContexts; | |||||
import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||
import org.springframework.beans.factory.annotation.Value; | import org.springframework.beans.factory.annotation.Value; | ||||
import org.springframework.http.HttpEntity; | import org.springframework.http.HttpEntity; | ||||
import org.springframework.http.HttpHeaders; | import org.springframework.http.HttpHeaders; | ||||
import org.springframework.http.MediaType; | import org.springframework.http.MediaType; | ||||
import org.springframework.http.ResponseEntity; | import org.springframework.http.ResponseEntity; | ||||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; | |||||
import org.springframework.scheduling.annotation.Scheduled; | import org.springframework.scheduling.annotation.Scheduled; | ||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import org.springframework.util.LinkedMultiValueMap; | import org.springframework.util.LinkedMultiValueMap; | ||||
import org.springframework.util.MultiValueMap; | import org.springframework.util.MultiValueMap; | ||||
import org.springframework.web.client.RestTemplate; | import org.springframework.web.client.RestTemplate; | ||||
import javax.net.ssl.SSLContext; | |||||
import java.io.BufferedReader; | import java.io.BufferedReader; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.io.InputStreamReader; | import java.io.InputStreamReader; | ||||
@@ -77,7 +83,7 @@ public class CheckMattersUrlTask { | |||||
List<String> errUrls = Lists.newArrayList(); | List<String> errUrls = Lists.newArrayList(); | ||||
for (NdKqZzsfwMenu menu : menus) { | for (NdKqZzsfwMenu menu : menus) { | ||||
RestTemplate restTemplate = new RestTemplate(HttpUtil.generateHttpRequestFactory()); | |||||
RestTemplate restTemplate = new RestTemplate(generateHttpRequestFactory()); | |||||
String url = "https://www.zjzwfw.gov.cn/jpaas-zjservice-server/open-api/item/getItemDetail"; | String url = "https://www.zjzwfw.gov.cn/jpaas-zjservice-server/open-api/item/getItemDetail"; | ||||
MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); | MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); | ||||
@@ -93,6 +99,7 @@ public class CheckMattersUrlTask { | |||||
ResponseEntity<Item> response = restTemplate.postForEntity(url, formEntity, Item.class); | ResponseEntity<Item> response = restTemplate.postForEntity(url, formEntity, Item.class); | ||||
System.out.println(response.getBody()); | System.out.println(response.getBody()); | ||||
Item body = response.getBody(); | Item body = response.getBody(); | ||||
assert body != null; | |||||
Item.ItemData itemData = body.getData(); | Item.ItemData itemData = body.getData(); | ||||
//如果是空的 | //如果是空的 | ||||
if(Objects.isNull(itemData.getItem())){ | if(Objects.isNull(itemData.getItem())){ | ||||
@@ -137,4 +144,26 @@ public class CheckMattersUrlTask { | |||||
} | } | ||||
return queryPairs; | return queryPairs; | ||||
} | } | ||||
/** | |||||
* 通过该工厂类创建的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; | |||||
} | |||||
} | } |
@@ -2,10 +2,7 @@ package com.ningdatech.kqapi.zzsfw.controller; | |||||
import com.ningdatech.kqapi.zzsfw.entity.dto.DscSxAdsShareItemQltQlsxCommonIDVKqDTO; | import com.ningdatech.kqapi.zzsfw.entity.dto.DscSxAdsShareItemQltQlsxCommonIDVKqDTO; | ||||
import com.ningdatech.kqapi.zzsfw.entity.entity.DscSxAdsShareItemQltQlsxCommonIDVKq; | import com.ningdatech.kqapi.zzsfw.entity.entity.DscSxAdsShareItemQltQlsxCommonIDVKq; | ||||
import com.ningdatech.kqapi.zzsfw.entity.vo.TreeVO; | |||||
import com.ningdatech.kqapi.zzsfw.manage.QlManage; | import com.ningdatech.kqapi.zzsfw.manage.QlManage; | ||||
import io.swagger.annotations.Api; | |||||
import io.swagger.annotations.ApiOperation; | |||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.springframework.validation.annotation.Validated; | import org.springframework.validation.annotation.Validated; | ||||
@@ -28,13 +25,11 @@ import java.util.List; | |||||
@Validated | @Validated | ||||
@RestController | @RestController | ||||
@RequestMapping("/api/v1/zzsfw/") | @RequestMapping("/api/v1/zzsfw/") | ||||
@Api(value = "DscSxAdsShareItemQltQlsxCommonIDVKqController", tags = "柯桥-政务数据") | |||||
@RequiredArgsConstructor | @RequiredArgsConstructor | ||||
public class DscSxAdsShareItemQltQlsxCommonIDVKqController { | public class DscSxAdsShareItemQltQlsxCommonIDVKqController { | ||||
private final QlManage qlManage; | private final QlManage qlManage; | ||||
@ApiOperation(value = "获取政务事项数据列表", notes = "获取政务事项数据列表") | |||||
@GetMapping("/search") | @GetMapping("/search") | ||||
public List<DscSxAdsShareItemQltQlsxCommonIDVKq> search(@ModelAttribute DscSxAdsShareItemQltQlsxCommonIDVKqDTO dto) { | public List<DscSxAdsShareItemQltQlsxCommonIDVKq> search(@ModelAttribute DscSxAdsShareItemQltQlsxCommonIDVKqDTO dto) { | ||||
return qlManage.search(dto); | return qlManage.search(dto); | ||||
@@ -1,42 +0,0 @@ | |||||
package com.ningdatech.kqapi.zzsfw.controller; | |||||
import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwMattersDeduplicateDTO; | |||||
import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwMenuDTO; | |||||
import com.ningdatech.kqapi.zzsfw.entity.vo.MatterTopVO; | |||||
import com.ningdatech.kqapi.zzsfw.entity.vo.TreeVO; | |||||
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.*; | |||||
import java.time.LocalDateTime; | |||||
import java.time.format.DateTimeFormatter; | |||||
import java.util.List; | |||||
/** | |||||
* <p> | |||||
* 前端控制器 | |||||
* </p> | |||||
* | |||||
* @author ZPF | |||||
* @since 2023-10-27 | |||||
*/ | |||||
@Slf4j | |||||
@Validated | |||||
@RestController | |||||
@RequestMapping | |||||
@Api(value = "NdKqZzsfwMenuController", tags = "柯桥-政务数据") | |||||
@RequiredArgsConstructor | |||||
public class HealthController { | |||||
private final MatterManage matterManage; | |||||
@ApiOperation(value = "健康检测", notes = "健康检测") | |||||
@GetMapping("/health") | |||||
public String health() { | |||||
return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); | |||||
} | |||||
} |
@@ -1,15 +1,10 @@ | |||||
package com.ningdatech.kqapi.zzsfw.controller; | package com.ningdatech.kqapi.zzsfw.controller; | ||||
import com.ningdatech.basic.model.ApiResponse; | |||||
import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwMattersDeduplicateDTO; | import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwMattersDeduplicateDTO; | ||||
import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwMenuDTO; | import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwMenuDTO; | ||||
import com.ningdatech.kqapi.zzsfw.entity.vo.MatterTopVO; | import com.ningdatech.kqapi.zzsfw.entity.vo.MatterTopVO; | ||||
import com.ningdatech.kqapi.zzsfw.entity.vo.MattersVO; | |||||
import com.ningdatech.kqapi.zzsfw.entity.vo.TreeVO; | import com.ningdatech.kqapi.zzsfw.entity.vo.TreeVO; | ||||
import com.ningdatech.kqapi.zzsfw.manage.MatterManage; | import com.ningdatech.kqapi.zzsfw.manage.MatterManage; | ||||
import io.swagger.annotations.Api; | |||||
import io.swagger.annotations.ApiOperation; | |||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.springframework.validation.annotation.Validated; | import org.springframework.validation.annotation.Validated; | ||||
@@ -29,42 +24,35 @@ import java.util.List; | |||||
@Validated | @Validated | ||||
@RestController | @RestController | ||||
@RequestMapping("/api/v1/zzsfw/") | @RequestMapping("/api/v1/zzsfw/") | ||||
@Api(value = "NdKqZzsfwMenuController", tags = "柯桥-政务数据") | |||||
@RequiredArgsConstructor | @RequiredArgsConstructor | ||||
public class NdKqZzsfwMenuController { | public class NdKqZzsfwMenuController { | ||||
private final MatterManage matterManage; | private final MatterManage matterManage; | ||||
@ApiOperation(value = "获取政务事项数据列表", notes = "获取政务事项数据列表") | |||||
@GetMapping("/matters") | @GetMapping("/matters") | ||||
public List<TreeVO> getMatters() { | public List<TreeVO> getMatters() { | ||||
return matterManage.getMatters(); | return matterManage.getMatters(); | ||||
} | } | ||||
@ApiOperation(value = "top10事项", notes = "top10事项") | |||||
@GetMapping("/top10") | @GetMapping("/top10") | ||||
public List<MatterTopVO> topTen() { | public List<MatterTopVO> topTen() { | ||||
return matterManage.topTen(); | return matterManage.topTen(); | ||||
} | } | ||||
@ApiOperation(value = "政务事项数据保存", notes = "政务事项数据保存") | |||||
@PostMapping("/save") | @PostMapping("/save") | ||||
public String save(@RequestBody NdKqZzsfwMenuDTO dto) { | public String save(@RequestBody NdKqZzsfwMenuDTO dto) { | ||||
return matterManage.save(dto); | return matterManage.save(dto); | ||||
} | } | ||||
@ApiOperation(value = "政务事项数据清空", notes = "政务事项数据清空") | |||||
@GetMapping("/remove-all") | @GetMapping("/remove-all") | ||||
public String removeAll() { | public String removeAll() { | ||||
return matterManage.removeAll(); | return matterManage.removeAll(); | ||||
} | } | ||||
@ApiOperation(value = "政务事项去重保存", notes = "政务事项去重保存") | |||||
@PostMapping("/save-dup") | @PostMapping("/save-dup") | ||||
public String saveDup(@RequestBody NdKqZzsfwMattersDeduplicateDTO dto) { | public String saveDup(@RequestBody NdKqZzsfwMattersDeduplicateDTO dto) { | ||||
return matterManage.saveDup(dto); | return matterManage.saveDup(dto); | ||||
} | } | ||||
@ApiOperation(value = "政务事项数据清空", notes = "政务事项数据清空") | |||||
@GetMapping("/remove-all-dup") | @GetMapping("/remove-all-dup") | ||||
public String removeAllDup() { | public String removeAllDup() { | ||||
return matterManage.removeAllDup(); | return matterManage.removeAllDup(); | ||||
@@ -1,11 +1,9 @@ | |||||
package com.ningdatech.kqapi.zzsfw.controller; | package com.ningdatech.kqapi.zzsfw.controller; | ||||
import com.ningdatech.basic.model.PageVo; | |||||
import com.ningdatech.kqapi.common.model.PageVo; | |||||
import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwPolicyDTO; | import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwPolicyDTO; | ||||
import com.ningdatech.kqapi.zzsfw.entity.vo.NdKqZzsfwPolicyVO; | import com.ningdatech.kqapi.zzsfw.entity.vo.NdKqZzsfwPolicyVO; | ||||
import com.ningdatech.kqapi.zzsfw.manage.PolicyManage; | import com.ningdatech.kqapi.zzsfw.manage.PolicyManage; | ||||
import io.swagger.annotations.Api; | |||||
import io.swagger.annotations.ApiOperation; | |||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.springframework.validation.annotation.Validated; | import org.springframework.validation.annotation.Validated; | ||||
@@ -23,24 +21,20 @@ import java.util.List; | |||||
@Validated | @Validated | ||||
@RestController | @RestController | ||||
@RequestMapping("/api/v1/poclicy/") | @RequestMapping("/api/v1/poclicy/") | ||||
@Api(value = "PolicyRegulationsController", tags = "柯桥-政策条例") | |||||
@RequiredArgsConstructor | @RequiredArgsConstructor | ||||
public class PolicyRegulationsController { | public class PolicyRegulationsController { | ||||
private final PolicyManage policyManage; | private final PolicyManage policyManage; | ||||
@ApiOperation(value = "政策条例分页列表", notes = "政策条例分页列表") | |||||
@GetMapping("/list") | @GetMapping("/list") | ||||
public PageVo<NdKqZzsfwPolicyVO> list(@RequestParam(defaultValue = "1") long pageNumber, @RequestParam(defaultValue = "10") long pageSize) { | public PageVo<NdKqZzsfwPolicyVO> list(@RequestParam(defaultValue = "1") long pageNumber, @RequestParam(defaultValue = "10") long pageSize) { | ||||
return policyManage.list(pageNumber,pageSize); | return policyManage.list(pageNumber,pageSize); | ||||
} | } | ||||
@ApiOperation(value = "政策条例保存", notes = "政策条例保存") | |||||
@PostMapping("/save") | @PostMapping("/save") | ||||
public String save(@RequestBody NdKqZzsfwPolicyDTO dto) { | public String save(@RequestBody NdKqZzsfwPolicyDTO dto) { | ||||
return policyManage.save(dto); | return policyManage.save(dto); | ||||
} | } | ||||
@ApiOperation(value = "政策条例保存", notes = "政策条例保存") | |||||
@PostMapping("/save-batch") | @PostMapping("/save-batch") | ||||
public String saveBatch(@RequestBody List<NdKqZzsfwPolicyDTO> dtos) { | public String saveBatch(@RequestBody List<NdKqZzsfwPolicyDTO> dtos) { | ||||
@@ -48,7 +42,6 @@ public class PolicyRegulationsController { | |||||
} | } | ||||
@ApiOperation(value = "政务事项数据清空", notes = "政务事项数据清空") | |||||
@GetMapping("/remove-all") | @GetMapping("/remove-all") | ||||
public String removeAll() { | public String removeAll() { | ||||
return policyManage.removeAll(); | return policyManage.removeAll(); | ||||
@@ -1,6 +1,5 @@ | |||||
package com.ningdatech.kqapi.zzsfw.entity.dto; | package com.ningdatech.kqapi.zzsfw.entity.dto; | ||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | import io.swagger.annotations.ApiModelProperty; | ||||
import lombok.Data; | import lombok.Data; | ||||
@@ -16,7 +15,6 @@ import java.time.LocalDateTime; | |||||
* @since 2023-10-25 | * @since 2023-10-25 | ||||
*/ | */ | ||||
@Data | @Data | ||||
@ApiModel(value = "DscSxAdsShareItemQltQlsxCommonIDVKqDTO", description = "省回流_政务服务_数据共享_事项基本信息表") | |||||
public class DscSxAdsShareItemQltQlsxCommonIDVKqDTO implements Serializable { | public class DscSxAdsShareItemQltQlsxCommonIDVKqDTO implements Serializable { | ||||
private static final long serialVersionUID = 1L; | private static final long serialVersionUID = 1L; | ||||
@@ -4,9 +4,8 @@ import cn.hutool.core.bean.BeanUtil; | |||||
import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | ||||
import com.ningdatech.basic.model.PageVo; | |||||
import com.ningdatech.kqapi.common.model.PageVo; | |||||
import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwPolicyDTO; | import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwPolicyDTO; | ||||
import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwMenu; | |||||
import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwPolicy; | import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwPolicy; | ||||
import com.ningdatech.kqapi.zzsfw.entity.vo.NdKqZzsfwPolicyVO; | import com.ningdatech.kqapi.zzsfw.entity.vo.NdKqZzsfwPolicyVO; | ||||
import com.ningdatech.kqapi.zzsfw.service.INdKqZzsfwPolicyService; | import com.ningdatech.kqapi.zzsfw.service.INdKqZzsfwPolicyService; | ||||
@@ -43,9 +43,9 @@ spring: | |||||
datasource: | datasource: | ||||
type: com.zaxxer.hikari.HikariDataSource | type: com.zaxxer.hikari.HikariDataSource | ||||
driver-class-name: com.mysql.cj.jdbc.Driver | 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 | |||||
url: ENC(aMGW3+FFqxyutRz9liYjAg+A72b6IQ7/ygtxO0DmQJ/LLFZkx8r4MhN8quv9L62nQ4sH55qFg+LnQoor/t8IqBACrbfNg462YNKnRyMsBmdHHxJm7i57flIQfePLDW93Omz4LZ2PbRZTvPcLLYtnQyxXSDPwDnjexHNVXTdxwuTJPBqthsVpvyA2mnn5Szef) | |||||
username: root | username: root | ||||
password: NingdaKeji123! | |||||
password: ENC(NHFdgnNk7opRJpNnZOJs51OTXb72zU//) | |||||
# 数据源 | # 数据源 | ||||
hikari: | hikari: | ||||
# 是客户端等待连接池连接的最大毫秒数 | # 是客户端等待连接池连接的最大毫秒数 | ||||
@@ -120,4 +120,12 @@ swagger: | |||||
hostname: iZbp13nwyvib53j4j1p2xoZ | hostname: iZbp13nwyvib53j4j1p2xoZ | ||||
jasypt: | |||||
encryptor: | |||||
password: CodeSheep | |||||
# 指定解密算法,需要和加密时使用的算法一致 | |||||
algorithm: PBEWithMD5AndDES | |||||
# 指定initialization vector类型 | |||||
iv-generator-classname: org.jasypt.iv.NoIvGenerator | |||||
@@ -43,7 +43,7 @@ spring: | |||||
datasource: | datasource: | ||||
type: com.zaxxer.hikari.HikariDataSource | type: com.zaxxer.hikari.HikariDataSource | ||||
driver-class-name: com.mysql.cj.jdbc.Driver | 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 | |||||
url: ENC(aMGW3+FFqxyutRz9liYjAg+A72b6IQ7/ygtxO0DmQJ/LLFZkx8r4MhN8quv9L62nQ4sH55qFg+LnQoor/t8IqBACrbfNg462YNKnRyMsBmdHHxJm7i57flIQfePLDW93Omz4LZ2PbRZTvPcLLYtnQyxXSDPwDnjexHNVXTdxwuTJPBqthsVpvyA2mnn5Szef) | |||||
username: root | username: root | ||||
password: NingdaKeji123! | password: NingdaKeji123! | ||||
# 数据源 | # 数据源 | ||||
@@ -118,4 +118,11 @@ log: | |||||
swagger: | swagger: | ||||
enabled: true | enabled: true | ||||
hostname: iZbp13nwyvib53j4j1p2xoZ | |||||
hostname: iZbp13nwyvib53j4j1p2xoZ | |||||
jasypt: | |||||
encryptor: | |||||
password: CodeSheep | |||||
algorithm: PBEWithMD5AndDES | |||||
# 指定initialization vector类型 | |||||
iv-generator-classname: org.jasypt.iv.NoIvGenerator |
@@ -43,9 +43,10 @@ spring: | |||||
datasource: | datasource: | ||||
type: com.zaxxer.hikari.HikariDataSource | type: com.zaxxer.hikari.HikariDataSource | ||||
driver-class-name: com.mysql.cj.jdbc.Driver | driver-class-name: com.mysql.cj.jdbc.Driver | ||||
url: jdbc:mysql://10.42.248.27:3306/kqzzsfw?serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false | |||||
url: ENC(gtE4OUrpgtFsh6B3aLiSp2sVSX1BYDET9Uii/wRP2RboRK0NDaYu1S7Vx30cHXFE7vecQzY1UbrSFW/BaWJvQ3XJxfDiaUxdrIDND5e+DMTjx1pUkfS8/RbXHQDE+QoOVZV1UKEtdq+khr32tlQXqkTnzmZGuZjctVmjdQxUnmI2YNpoeNlIAkDXiaCvcVYc) | |||||
username: root | username: root | ||||
password: Nd@20231116 | password: Nd@20231116 | ||||
# 数据源 | # 数据源 | ||||
hikari: | hikari: | ||||
# 是客户端等待连接池连接的最大毫秒数 | # 是客户端等待连接池连接的最大毫秒数 | ||||
@@ -120,4 +121,11 @@ swagger: | |||||
hostname: iZut201mqskxt0mwme4tjfZ | hostname: iZut201mqskxt0mwme4tjfZ | ||||
jasypt: | |||||
encryptor: | |||||
password: CodeSheep | |||||
algorithm: PBEWithMD5AndDES | |||||
# 指定initialization vector类型 | |||||
iv-generator-classname: org.jasypt.iv.NoIvGenerator | |||||
@@ -1,741 +0,0 @@ | |||||
<?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> |
@@ -1,294 +0,0 @@ | |||||
<!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> |
@@ -1,281 +0,0 @@ | |||||
<!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> |
@@ -1,281 +0,0 @@ | |||||
<!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> |
@@ -1,286 +0,0 @@ | |||||
<!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> |