Commit 126e943e authored by Dyml's avatar Dyml

Merge branch 'master' of http://gitlab.archser.com/common/aserver

# Conflicts: # src/main/resources/DBUpdate/DM_UpdateSQL.xml
parents 7ab9c9f3 2be259fa
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.archser</groupId>
<artifactId>aserver</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>aserver</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<jdk.version>1.8</jdk.version>
<junit.version>3.8.1</junit.version>
<jfinal.version>4.2</jfinal.version>
<cos.version>2017.5</cos.version>
<apachelog4j.version>2.11.1</apachelog4j.version>
<log4j.version>1.2.17</log4j.version>
<jfinalundertow.version>1.6</jfinalundertow.version>
<druid.version>1.0.29</druid.version>
<fastjson.version>1.2.55</fastjson.version>
<oracle.version>11.2.0.3</oracle.version>
<jjwt.version>0.10.6</jjwt.version>
<dubbo.version>2.7.2</dubbo.version>
<resteasy.version>4.1.1.Final</resteasy.version>
</properties>
<!-- 使用阿里 maven 库 -->
<repositories>
<repository>
<id>nexus</id>
<url>http://nexus.archser.com:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>cos</artifactId>
<version>${cos.version}</version>
</dependency>
<!-- <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId>
<version>${apachelog4j.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId> <version>${apachelog4j.version}</version>
</dependency> -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- undertow -->
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal-undertow</artifactId>
<version>${jfinalundertow.version}</version>
</dependency>
<!-- WebSocket 支持 -->
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-websockets-jsr</artifactId>
<version>2.0.16.Final</version>
</dependency>
<!-- 避免控制台输出如下提示信息: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
项目中实际上用不到这个 jar 包 注意:eclipse 下可以将 scope 设置为 provided -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.25</version>
<!-- 打包前改成 provided,此处使用 compile 仅为支持 IDEA -->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>${oracle.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>${jjwt.version}</version>
</dependency>
<!-- webSocket 开始-->
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<!-- webSocket 结束-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
<exclusion>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 国密加密需要的依赖 -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.60</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<!-- 对接单点登录调用的依赖 -->
<dependency>
<groupId>com.spbportal.sso</groupId>
<artifactId>spbportal-ssoClient-test</artifactId>
<version>1.0</version>
</dependency>
<!--自选库 -->
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId>
<version>${jfinal.version}</version>
</dependency>
<dependency>
<groupId>dm.jdbc</groupId>
<artifactId>DmJdbcDriver17</artifactId>
<version>8.1.1.30</version>
</dependency>
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
<build>
<finalName>aserver</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<!-- java8 保留参数名编译参数 -->
<compilerArgument>-parameters</compilerArgument>
<compilerArguments>
<verbose />
</compilerArguments>
</configuration>
</plugin>
<!-- jar 包中的配置文件优先级高于 config 目录下的 "同名文件" 因此,打包时需要排除掉 jar 包中来自 src/main/resources
目录的 配置文件,否则部署时 config 目录中的同名配置文件不会生效 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<excludes>
<exclude>*.txt</exclude>
<exclude>*.xml</exclude>
<exclude>*.properties</exclude>
</excludes>
</configuration>
</plugin>
<!-- 使用 mvn clean package 打包 更多配置可参考官司方文档:http://maven.apache.org/plugins/maven-assembly-plugin/single-mojo.html -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<!-- 打包生成的文件名 -->
<finalName>${project.artifactId}</finalName>
<!-- jar 等压缩文件在被打包进入 zip、tar.gz 时是否压缩,设置为 false 可加快打包速度 -->
<recompressZippedFiles>false</recompressZippedFiles>
<!-- 打包生成的文件是否要追加 release.xml 中定义的 id 值 -->
<appendAssemblyId>true</appendAssemblyId>
<!-- 指向打包描述文件 package.xml -->
<descriptors>
<descriptor>package.xml</descriptor>
</descriptors>
<!-- 打包结果输出的基础目录 -->
<outputDirectory>${project.build.directory}/</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.archser</groupId>
<artifactId>aserver</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>aserver</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<jdk.version>1.8</jdk.version>
<junit.version>3.8.1</junit.version>
<jfinal.version>4.2</jfinal.version>
<cos.version>2017.5</cos.version>
<apachelog4j.version>2.11.1</apachelog4j.version>
<log4j.version>1.2.17</log4j.version>
<jfinalundertow.version>1.6</jfinalundertow.version>
<druid.version>1.0.29</druid.version>
<fastjson.version>1.2.55</fastjson.version>
<oracle.version>11.2.0.3</oracle.version>
<jjwt.version>0.10.6</jjwt.version>
<dubbo.version>2.7.2</dubbo.version>
<resteasy.version>4.1.1.Final</resteasy.version>
</properties>
<!-- 使用阿里 maven 库 -->
<repositories>
<repository>
<id>nexus</id>
<url>http://nexus.archser.com:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>cos</artifactId>
<version>${cos.version}</version>
</dependency>
<!-- <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId>
<version>${apachelog4j.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId> <version>${apachelog4j.version}</version>
</dependency> -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- undertow -->
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal-undertow</artifactId>
<version>${jfinalundertow.version}</version>
</dependency>
<!-- WebSocket 支持 -->
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-websockets-jsr</artifactId>
<version>2.0.16.Final</version>
</dependency>
<!-- 避免控制台输出如下提示信息: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
项目中实际上用不到这个 jar 包 注意:eclipse 下可以将 scope 设置为 provided -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.25</version>
<!-- 打包前改成 provided,此处使用 compile 仅为支持 IDEA -->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>de.ruedigermoeller</groupId>
<artifactId>fst</artifactId>
<version>2.50</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>${oracle.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>${jjwt.version}</version>
</dependency>
<!-- webSocket 开始 -->
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<!-- webSocket 结束 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
<exclusion>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 国密加密需要的依赖 -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.60</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<!-- 对接单点登录调用的依赖 -->
<dependency>
<groupId>com.spbportal.sso</groupId>
<artifactId>spbportal-ssoClient-test</artifactId>
<version>1.0</version>
</dependency>
<!--自选库 -->
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId>
<version>${jfinal.version}</version>
</dependency>
<dependency>
<groupId>dm.jdbc</groupId>
<artifactId>DmJdbcDriver17</artifactId>
<version>8.1.1.30</version>
</dependency>
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
<build>
<finalName>aserver</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<!-- java8 保留参数名编译参数 -->
<compilerArgument>-parameters</compilerArgument>
<compilerArguments>
<verbose />
</compilerArguments>
</configuration>
</plugin>
<!-- jar 包中的配置文件优先级高于 config 目录下的 "同名文件" 因此,打包时需要排除掉 jar 包中来自 src/main/resources
目录的 配置文件,否则部署时 config 目录中的同名配置文件不会生效 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<excludes>
<exclude>*.txt</exclude>
<exclude>*.xml</exclude>
<exclude>*.properties</exclude>
</excludes>
</configuration>
</plugin>
<!-- 使用 mvn clean package 打包 更多配置可参考官司方文档:http://maven.apache.org/plugins/maven-assembly-plugin/single-mojo.html -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<!-- 打包生成的文件名 -->
<finalName>${project.artifactId}</finalName>
<!-- jar 等压缩文件在被打包进入 zip、tar.gz 时是否压缩,设置为 false 可加快打包速度 -->
<recompressZippedFiles>false</recompressZippedFiles>
<!-- 打包生成的文件是否要追加 release.xml 中定义的 id 值 -->
<appendAssemblyId>true</appendAssemblyId>
<!-- 指向打包描述文件 package.xml -->
<descriptors>
<descriptor>package.xml</descriptor>
</descriptors>
<!-- 打包结果输出的基础目录 -->
<outputDirectory>${project.build.directory}/</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package com.archser.aserver.common.config;
import com.alibaba.druid.filter.stat.StatFilter;
import com.archser.aserver.controller.BugController;
import com.archser.aserver.controller.IndexController;
import com.archser.aserver.controller.KeyController;
import com.archser.aserver.controller.MediumController;
import com.archser.aserver.controller.MenuController;
import com.archser.aserver.controller.MessageController;
import com.archser.aserver.controller.SettingController;
import com.archser.aserver.controller.SystemController;
import com.archser.aserver.controller.UserController;
import com.archser.aserver.interceptor.JwtInterceptor;
import com.archser.aserver.model._MappingKit;
import com.archser.aserver.service.DBService;
import com.archser.aserver.websocket.MessageWebSocket;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.ext.handler.UrlSkipHandler;
import com.jfinal.json.MixedJsonFactory;
import com.jfinal.kit.PathKit;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.CaseInsensitiveContainerFactory;
import com.jfinal.plugin.activerecord.dialect.OracleDialect;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.render.ViewType;
import com.jfinal.server.undertow.UndertowServer;
import com.jfinal.server.undertow.WebBuilder;
import com.jfinal.template.Engine;
public class MainConfig extends JFinalConfig {
/**
* 将全局配置提出来 方便其他地方重用
*/
private static Prop p;
/**
* 配置JFinal常量
*/
@Override
public void configConstant(Constants me) {
// 读取数据库配置文件
loadConfig();
// 设置当前是否为开发模式
me.setDevMode(p.getBoolean("devMode"));
// 设置默认上传文件保存路径 getFile等使用
me.setBaseUploadPath("upload/temp/");
// 设置上传最大限制尺寸
// me.setMaxPostSize(1024*1024*10);
// 设置默认下载文件路径 renderFile使用
me.setBaseDownloadPath("download");
// 设置默认视图类型
me.setViewType(ViewType.JFINAL_TEMPLATE);
// 设置404渲染视图
// me.setError404View("404.html");
// 设置json工厂
me.setJsonFactory(MixedJsonFactory.me());
// 设置启用依赖注入
me.setInjectDependency(true);
}
/**
* 配置项目路由 路由拆分到 FrontRutes 与 AdminRoutes 之中配置的好处: 1:可分别配置不同的 baseViewPath 与 Interceptor
* 2:避免多人协同开发时,频繁修改此文件带来的版本冲突 3:避免本文件中内容过多,拆分后可读性增强 4:便于分模块管理路由
*/
@Override
public void configRoute(Routes me) {
// 推荐拆分方式 如果需要就解开注释 创建对应的 Routes
// me.add(new WechatRoutes());//配置微信端访问路由
// 普通不拆分的方式配置 如下
// 设置默认访问首页路由 可使用http://localhost:port 直接访问 如果80端口 port可以省略
me.add("/", IndexController.class);
me.add("/setting", SettingController.class);
me.add("/user", UserController.class);
me.add("/message", MessageController.class);
me.add("/menu", MenuController.class);
me.add("/key", KeyController.class);
me.add("/system", SystemController.class);
me.add("/bug", BugController.class);
me.add("/medium",MediumController.class);
}
// 先加载开发环境配置,再追加生产环境的少量配置覆盖掉开发环境配置
static void loadConfig() {
if (p == null) {
p = PropKit.use("config.properties").appendIfExists("config-pro.properties");
}
}
/**
* 获取数据库插件 抽取成独立的方法,便于重用该方法,减少代码冗余
*/
public static DruidPlugin getDruidPlugin() {
loadConfig();
return new DruidPlugin(p.get("jdbcUrl"), p.get("user"), p.get("password"), p.get("jdbc.driver"));
}
/**
* 配置JFinal插件 数据库连接池 ActiveRecordPlugin 缓存 定时任务 自定义插件
*/
@Override
public void configPlugin(Plugins me) {
loadConfig();
// 配置数据库连接池插件
DruidPlugin dbPlugin = getDruidPlugin();
dbPlugin.addFilter(new StatFilter()); // 添加 StatFilter 才会有统计数据
// 数据映射 配置ActiveRecord插件
ActiveRecordPlugin arp = new ActiveRecordPlugin(dbPlugin);
arp.setShowSql(p.getBoolean("devMode"));
arp.setContainerFactory(new CaseInsensitiveContainerFactory(true));
arp.setDialect(new OracleDialect());
arp.addSqlTemplate("oracle.sql");
/******** 在此添加数据库 表-Model 映射 *********/
// 如果使用了JFinal Model 生成器 生成了BaseModel 把下面注释解开即可
_MappingKit.mapping(arp);
// 添加到插件列表中
me.add(dbPlugin);
me.add(arp);
}
/**
* 配置全局拦截器
*/
@Override
public void configInterceptor(Interceptors me) {
me.add(new JwtInterceptor());
//统一拦截错误
// me.add(new UnifiedErrorInterceptor());
//错误不会返回页面
// RenderManager.me().setRenderFactory(new ErrorRender());
}
/**
* 配置全局处理器
*/
@Override
public void configHandler(Handlers me) {
// 说明:druid的统计页面涉及安全性 需要自行处理根据登录权限判断是否能访问统计页面
// me.add(DruidKit.getDruidStatViewHandler()); // druid 统计页面功能
me.add(new UrlSkipHandler("^/services/.+", false));
me.add(new UrlSkipHandler("/*\\.ws/", false));
}
/**
* 项目启动后调用
*/
@Override
public void onStart() {
String dbType=p.get("dbType");
if(dbType==null || "".equals(dbType.trim())) {
System.out.println("数据库配置文件中dbType不能为空值");
return;
}
dbType=dbType.trim();
dbType=dbType.toUpperCase();
String configPath=PathKit.getRootClassPath()+"/DBUpdate/";
DBService dbService= new DBService();
dbService.upgrade(configPath, dbType);
}
/**
* 配置模板引擎
*/
@Override
public void configEngine(Engine me) {
// 配置模板支持热加载
me.setDevMode(p.getBoolean("engineDevMode", false));
// 这里只有选择JFinal TPL的时候才用
// 配置共享函数模板
// me.addSharedFunction("/view/common/layout.html")
}
public static void main(String[] args) {
UndertowServer.create(MainConfig.class, "undertow.properties").configWeb(builder -> {
addWebSocket(builder);
}) .start();
}
/**
* 添加websocket
* @param builder
*/
public static void addWebSocket(WebBuilder builder) {
loadConfig();
if(p.getBoolean("openMessageWebSocket") != null && p.getBoolean("openMessageWebSocket") ) {
addMessageWebSocket(builder);
}
}
/**
* 添加消息中心的websocket
* @param builder
*/
public static void addMessageWebSocket(WebBuilder builder) {
builder.addWebSocketEndpoint(MessageWebSocket.class);
}
}
package com.archser.aserver.common.config;
import com.alibaba.druid.filter.stat.StatFilter;
import com.archser.aserver.controller.BugController;
import com.archser.aserver.controller.IndexController;
import com.archser.aserver.controller.KeyController;
import com.archser.aserver.controller.MediumController;
import com.archser.aserver.controller.MenuController;
import com.archser.aserver.controller.MessageController;
import com.archser.aserver.controller.SettingController;
import com.archser.aserver.controller.SystemController;
import com.archser.aserver.controller.UserController;
import com.archser.aserver.interceptor.JwtInterceptor;
import com.archser.aserver.model._MappingKit;
import com.archser.aserver.service.DBService;
import com.archser.aserver.websocket.MessageWebSocket;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.ext.handler.UrlSkipHandler;
import com.jfinal.json.MixedJsonFactory;
import com.jfinal.kit.PathKit;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.CaseInsensitiveContainerFactory;
import com.jfinal.plugin.activerecord.dialect.OracleDialect;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.plugin.redis.RedisPlugin;
import com.jfinal.render.ViewType;
import com.jfinal.server.undertow.UndertowServer;
import com.jfinal.server.undertow.WebBuilder;
import com.jfinal.template.Engine;
public class MainConfig extends JFinalConfig {
/**
* 将全局配置提出来 方便其他地方重用
*/
private static Prop p;
/**
* 配置JFinal常量
*/
@Override
public void configConstant(Constants me) {
// 读取数据库配置文件
loadConfig();
// 设置当前是否为开发模式
me.setDevMode(p.getBoolean("devMode"));
// 设置默认上传文件保存路径 getFile等使用
me.setBaseUploadPath("upload/temp/");
// 设置上传最大限制尺寸
// me.setMaxPostSize(1024*1024*10);
// 设置默认下载文件路径 renderFile使用
me.setBaseDownloadPath("download");
// 设置默认视图类型
me.setViewType(ViewType.JFINAL_TEMPLATE);
// 设置404渲染视图
// me.setError404View("404.html");
// 设置json工厂
me.setJsonFactory(MixedJsonFactory.me());
// 设置启用依赖注入
me.setInjectDependency(true);
}
/**
* 配置项目路由 路由拆分到 FrontRutes 与 AdminRoutes 之中配置的好处: 1:可分别配置不同的 baseViewPath 与 Interceptor
* 2:避免多人协同开发时,频繁修改此文件带来的版本冲突 3:避免本文件中内容过多,拆分后可读性增强 4:便于分模块管理路由
*/
@Override
public void configRoute(Routes me) {
// 推荐拆分方式 如果需要就解开注释 创建对应的 Routes
// me.add(new WechatRoutes());//配置微信端访问路由
// 普通不拆分的方式配置 如下
// 设置默认访问首页路由 可使用http://localhost:port 直接访问 如果80端口 port可以省略
me.add("/", IndexController.class);
me.add("/setting", SettingController.class);
me.add("/user", UserController.class);
me.add("/message", MessageController.class);
me.add("/menu", MenuController.class);
me.add("/key", KeyController.class);
me.add("/system", SystemController.class);
me.add("/bug", BugController.class);
me.add("/medium",MediumController.class);
}
// 先加载开发环境配置,再追加生产环境的少量配置覆盖掉开发环境配置
static void loadConfig() {
if (p == null) {
p = PropKit.use("config.properties").appendIfExists("config-pro.properties");
}
}
/**
* 获取数据库插件 抽取成独立的方法,便于重用该方法,减少代码冗余
*/
public static DruidPlugin getDruidPlugin() {
loadConfig();
return new DruidPlugin(p.get("jdbcUrl"), p.get("user"), p.get("password"), p.get("jdbc.driver"));
}
/**
* 配置JFinal插件 数据库连接池 ActiveRecordPlugin 缓存 定时任务 自定义插件
*/
@Override
public void configPlugin(Plugins me) {
loadConfig();
// 配置数据库连接池插件
DruidPlugin dbPlugin = getDruidPlugin();
dbPlugin.addFilter(new StatFilter()); // 添加 StatFilter 才会有统计数据
// 数据映射 配置ActiveRecord插件
ActiveRecordPlugin arp = new ActiveRecordPlugin(dbPlugin);
arp.setShowSql(p.getBoolean("devMode"));
arp.setContainerFactory(new CaseInsensitiveContainerFactory(true));
arp.setDialect(new OracleDialect());
arp.addSqlTemplate("oracle.sql");
/******** 在此添加数据库 表-Model 映射 *********/
// 如果使用了JFinal Model 生成器 生成了BaseModel 把下面注释解开即可
_MappingKit.mapping(arp);
// 添加到插件列表中
me.add(dbPlugin);
me.add(arp);
// 添加Redis 配置
RedisPlugin redis = new RedisPlugin("redis", PropKit.get("redis.url"), PropKit.get("redis.password"));
me.add(redis);
}
/**
* 配置全局拦截器
*/
@Override
public void configInterceptor(Interceptors me) {
me.add(new JwtInterceptor());
//统一拦截错误
// me.add(new UnifiedErrorInterceptor());
//错误不会返回页面
// RenderManager.me().setRenderFactory(new ErrorRender());
}
/**
* 配置全局处理器
*/
@Override
public void configHandler(Handlers me) {
// 说明:druid的统计页面涉及安全性 需要自行处理根据登录权限判断是否能访问统计页面
// me.add(DruidKit.getDruidStatViewHandler()); // druid 统计页面功能
me.add(new UrlSkipHandler("^/services/.+", false));
me.add(new UrlSkipHandler("/*\\.ws/", false));
}
/**
* 项目启动后调用
*/
@Override
public void onStart() {
String dbType=p.get("dbType");
if(dbType==null || "".equals(dbType.trim())) {
System.out.println("数据库配置文件中dbType不能为空值");
return;
}
dbType=dbType.trim();
dbType=dbType.toUpperCase();
String configPath=PathKit.getRootClassPath()+"/DBUpdate/";
DBService dbService= new DBService();
dbService.upgrade(configPath, dbType);
}
/**
* 配置模板引擎
*/
@Override
public void configEngine(Engine me) {
// 配置模板支持热加载
me.setDevMode(p.getBoolean("engineDevMode", false));
// 这里只有选择JFinal TPL的时候才用
// 配置共享函数模板
// me.addSharedFunction("/view/common/layout.html")
}
public static void main(String[] args) {
UndertowServer.create(MainConfig.class, "undertow.properties").configWeb(builder -> {
addWebSocket(builder);
}) .start();
}
/**
* 添加websocket
* @param builder
*/
public static void addWebSocket(WebBuilder builder) {
loadConfig();
if(p.getBoolean("openMessageWebSocket") != null && p.getBoolean("openMessageWebSocket") ) {
addMessageWebSocket(builder);
}
}
/**
* 添加消息中心的websocket
* @param builder
*/
public static void addMessageWebSocket(WebBuilder builder) {
builder.addWebSocketEndpoint(MessageWebSocket.class);
}
}
package com.archser.aserver.controller;
import java.math.BigInteger;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import com.alibaba.fastjson.JSON;
import com.archser.aserver.interceptor.JwtInterceptor;
import com.archser.aserver.model.System;
import com.archser.aserver.model.User;
import com.archser.aserver.service.LogService;
import com.archser.aserver.service.UserService;
import com.archser.aserver.util.CollectionUtil;
import com.archser.aserver.util.HttpRequestUtil;
import com.archser.aserver.util.KeysUtil;
import com.archser.aserver.util.gm.BCECUtil;
import com.archser.aserver.util.gm.SM2Util;
import com.jfinal.aop.Clear;
import com.jfinal.aop.Inject;
import com.jfinal.core.Controller;
import com.jfinal.kit.HashKit;
import com.jfinal.kit.Kv;
import com.jfinal.kit.PropKit;
import com.jfinal.kit.Ret;
import com.jfinal.kit.StrKit;
import com.jfinal.log.Log;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import com.spbportal.sso.SsoToken;
import io.jsonwebtoken.JwsHeader;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
/**
* IndexController 指向系统访问首页
*
* @author jbolt.cn
* @email 909854136@qq.com
* @date 2018年11月4日 下午9:02:52
*/
public class IndexController extends Controller {
/**
* 登陆用户名,密码解密
*/
public static final String PRIVATE_KEY_D = "38627fffe8003e6d2faa76d4eae2f74fd9cd7be257ab36c356c4f01bbc17e41d";
public static final ECPrivateKeyParameters USER_PRIVATE_KEY = BCECUtil.createECPrivateKeyParameters(
new BigInteger(ByteUtils.fromHexString(PRIVATE_KEY_D)), SM2Util.DOMAIN_PARAMS);
private static Log log = Log.getLog(IndexController.class);
/**
* 超期时间:24小时,即:24 * 60 * 60 * 1000
*/
private static int EXPIRATION = 24 * 60 * 60 * 1000;
private static int permitLoginTimes = 5;// 允许登陆次数
private static int hour = 2; // 两小时内不可登录
@Inject
private LogService logService;
@Inject
private UserService userService;
/**
* 首页Action
*/
public void index() {
render("index.html");
}
/**
* 修改密码
*/
public void updatePassword() {
String username = this.getPara("username");
String password = this.getPara("newPwd");
password = HashKit.sha256(password);
int a = userService.updatePwd(password, username);
if (a == 0) {
this.renderJson(Ret.fail("msg", "修改失败"));
logService.saveAsLog("operate", username, JwtInterceptor.getIpAddr(getRequest()),
username + "修改密码操作:修改密码失败", "aserver");
return;
}
this.renderJson(Ret.ok("msg", "修改成功"));
logService.saveAsLog("operate", username, JwtInterceptor.getIpAddr(getRequest()), username + "修改密码操作:修改密码成功",
"aserver");
}
private String decrypt(String sm2Cipher) throws InvalidCipherTextException {
return new String(SM2Util.decrypt(USER_PRIVATE_KEY, ByteUtils.fromHexString("04" + sm2Cipher)));
}
/**
* 登录验证
*/
@Clear(JwtInterceptor.class)
// @Before(LoginValidator.class)
public void login() {
String app = this.getPara("app");
String username = this.getPara("username");
String password = this.getPara("password");
String callback = this.getPara("callback");
// 解密用户名和密码
try {
username = decrypt(username);
password = decrypt(password);
} catch (Exception e1) {
e1.printStackTrace();
username = this.getPara("username");
password = this.getPara("password");
}
password = HashKit.sha256(password);
java.lang.System.out.println("Login: " + username);
User user = User.dao.template("getUser", username).findFirst();
if (user == null) {
this.renderJson(Ret.fail("msg", "用户名或密码不存在: " + username));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "该用户非本系统用户正在非法登录", app);
return;
}
// 一旦开启三员 admin用户不能使用
if ("admin".equals(user.getUsername())) {
Integer userCount = Db.queryInt(Db.getSql("hasThreeMemberUsersCount"));
boolean isExistThreeMemberUsers = userCount == null ? false : (userCount.intValue() > 0 ? true : false);
if (isExistThreeMemberUsers) {
this.renderJson(Ret.fail("msg", "已开启三员管理,admin失效了。"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:已开启三员管理", app);
return;
}
}
if (Integer.valueOf(user.getLocked()) == 1) {
this.renderJson(Ret.fail("msg", "当前账户已被锁定"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:该用户已被锁定", app);
return;
}
if (!password.equals(user.getPassword())) {
if (this.checkErrorCount(user)) {
this.renderJson(Ret.fail("msg", "您的错误次数已达5次以上,请稍后再试!"));
return;
} else {
int errorCount = permitLoginTimes - (user.getErrorcount() == null ? 0 : user.getErrorcount()) - 1;
if (user.getErrorcount() == 4) {
this.renderJson(Ret.fail("msg", "用户名或密码验证失败,您的账户于两小时后才可登录!"));
return;
} else {
this.renderJson(Ret.fail("msg", "用户名或密码验证失败,您还有" + errorCount + "次机会!"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:密码验证错误",
app);
return;
}
}
}
Integer errorcount = user.getErrorcount();
if (errorcount != null && errorcount != 0) {
if (!this.checkWhenPwdOk(user)) {
Date date = new Date();
long hour1 = 2 * 60 * 60;
long begin = date.getTime();
long end = user.getLastLoginTime().getTime();
long between = (begin - end) / 1000;
long hour2 = (hour1 - between) % (24 * 3600) / 3600;
long minute = (hour1 - between) % 3600 / 60;
long second = (hour1 - between) % 60;
if (between < hour1) {
this.renderJson(Ret.fail("msg", "您的账户还剩" + hour2 + "小时" + minute + "分" + second + "秒才可登录!"));
return;
}
}
}
if (!"admin".equals(user.getUsername())) {
Integer noLockedRolesCount = Db.queryInt(Db.getSql("hasNoLockedRolesCount"), user.getUsername());
boolean noLockedRolesFlag = noLockedRolesCount == null ? false
: (noLockedRolesCount.intValue() > 0 ? true : false);
if (!noLockedRolesFlag) {
this.renderJson(Ret.fail("msg", "拥有的角色全部被锁定,不能登录系统了。"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:该用户拥有的角色全部被锁定",
app);
return;
}
}
System system = System.dao.template("getSystemPrivatekey", app).findFirst();
if (system == null) {
this.renderJson(Ret.fail("msg", "没有找到应用:" + app));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:没有找到应用" + app,
app);
return;
}
if (StrKit.isBlank(system.getPrivatekey()) || StrKit.isBlank(system.getKeyid())) {
this.renderJson(Ret.fail("msg", "没有找到应用的密钥:" + app));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:没有找到应用的密钥" + app,
app);
return;
}
//查询用户是否有该系统的权限
// boolean homeAuth = userService.checkUserSystemPermission(user.getId(), app);
// if (!homeAuth) {
// this.renderJson(Ret.fail("msg", "您没有权限登录" + system.getTitle() + "系统"));
// logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:您没有权限登录此系统" + app,
// app);
// return;
// }
List<System> systemList = userService.findSystemWithUserPermission(user.getId());
/** 修改如果登陆用户为admin用户则直接登陆 huwenbin 2020/5/20 start*/
if (!"admin".equals(user.getUsername())) {
if ((systemList == null || systemList.isEmpty())) {
this.renderJson(Ret.fail("msg", "您没有权限登录" + system.getTitle() + "系统"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:您没有权限登录此系统" + app,
app);
return;
}
Optional<System> systemOptional = userService.getSystemByName(app, systemList);
if (!systemOptional.isPresent()) {// 没有当前系统的权限
system = systemList.get(0);
app = system.getName();
callback = system.getUrl();
}
}
/** 修改如果登陆用户为admin用户则直接登陆 huwenbin 2020/5/20 end */
try {
String jws = Jwts.builder()
// 设置密匙ID
.setHeaderParam(JwsHeader.KEY_ID, system.getKeyid())
// 赋予应用
.setSubject(app)
// 签发时间
.setIssuedAt(new Date())
// 超期时间
.setExpiration(new Date(java.lang.System.currentTimeMillis() + EXPIRATION))
// 用户名
.claim("name", username).claim("ip", JwtInterceptor.getIpAddr(getRequest()))
// 签名
.signWith(KeysUtil.privatekey(system.getPrivatekey()), SignatureAlgorithm.RS256).compact();
if (errorcount != null && errorcount != 0) {
this.setErrZero(user);
}
this.renderJson(Ret.ok("token", jws).set("callback", callback));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()),
username + "登录" + app + "成功", app);
} catch (Exception e) {
log.error("生成登录票据失败", e);
this.renderJson(Ret.fail("msg", "生成登录票据失败"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "生成登录票据失败", app);
}
}
// 密码正确时错误次数清零
private void setErrZero(User user) {
Db.update(Db.getSqlPara("updateForOk", Kv.by("id", user.getId())));
}
//密码错误时判断错误次数是否为5次
private boolean checkErrorCount(User user) {
Kv cond= Kv.by("id", user.getId()).set("hour",hour).set("permitLoginTimes",permitLoginTimes);
List<Record> currentList =Db.find(Db.getSqlPara("getErrorCount",cond));
int currentNum = 0;
for (Record record : currentList) {
currentNum = Integer.parseInt(record.get("flag").toString());
}
if (currentNum >= permitLoginTimes) {
return true;
}else {
//执行+1或=1的操作
Db.update(Db.getSqlPara("updateForErr",cond));
return false;
}
}
//密码正确时判断次数和锁定时间是否在指定范围内
private boolean checkWhenPwdOk(User user) {
List<Record> currentList =Db.find(Db.getSqlPara("checkWhenPwdOk", Kv.by("id", user.getId()).set("hour",hour).set("permitLoginTimes",permitLoginTimes)));
int currentNum = 0;
if (currentList == null || currentList.size() == 0) {
return true;
}
for (Record record : currentList) {
currentNum = Integer.parseInt(record.get("flag").toString());
}
if(currentNum >= permitLoginTimes) {
return false;
}else {
return true;
}
}
/**
* 通过门户系统单点登录
*
* @author Guo XJ
* @date 2019-12-13 15:08:00
*/
public void ssoByPortalSystem() {
try {
//获取app
String app = getPara("app",null);
if(app == null) {
renderJson(Ret.fail("msg","获取服务信息失败"));
return ;
}
//获取到门户系统的Token
String ssotoken = getPara("ssotoken");
//获取到personCode(用户唯一标识)
SsoToken st = new SsoToken();
st.initialise(ssotoken);
String personCode = st.getTokenId();
//获取用户
Record user = userService.getUserInfoByPersonCode(personCode);
System system = System.dao.template("getSystemPrivatekey", app).findFirst();
if(system == null) {
renderJson(Ret.fail("msg","获取服务信息失败"));
return ;
}
//判断用户是否存在
if(user != null && user.getStr("username") != null) {
String jws = Jwts.builder()
// 设置密匙ID
.setHeaderParam(JwsHeader.KEY_ID, system.getKeyid())
// 赋予应用
.setSubject(app)
// 签发时间
.setIssuedAt(new Date())
// 超期时间
.setExpiration(new Date(java.lang.System.currentTimeMillis() + EXPIRATION))
// 用户名
.claim("name", user.getStr("username")).claim("ip", JwtInterceptor.getIpAddr(getRequest()))
// 签名
.signWith(KeysUtil.privatekey(system.getPrivatekey()), SignatureAlgorithm.RS256).compact();
this.renderJson(Ret.ok("token", jws));
return;
}else {
this.renderJson(Ret.fail("msg","没有找到当前用户"));
return;
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
this.renderJson(Ret.fail("msg","登录出错!"));
}
}
/**
* 根据邮政门户传回的code 获取用户信息
*
* @Title: getUserInfoForH5
* @author LDC
* @date 2019-11-19 03:22:34
*/
@Clear
public void getUserInfoForH5() {
String code = getPara("code", null);
if (code == null) {
renderJson(Ret.fail("msg", "获取用户信息失败"));
return;
}
String app = getPara("app", null);
if (app == null) {
renderJson(Ret.fail("msg", "获取服务信息失败"));
return;
}
Map<String, String> paramMap = new LinkedHashMap<String, String>();
paramMap.put("client_id", "MmEepJkH7Hiz7EtS");
paramMap.put("code", code);
paramMap.put("state", "1");
paramMap.put("grant_type", "authorization_code");
paramMap.put("scope", "scope");
paramMap.put("redirect_uri", PropKit.get("redirect_uri"));
Iterator<Entry<String, String>> entrySet = paramMap.entrySet().iterator();
StringBuilder builder = new StringBuilder();
while (entrySet.hasNext()) {
Entry<String, String> next = entrySet.next();
builder.append(next.getKey()).append("=").append(next.getValue()).append("&");
}
String param = builder.deleteCharAt(builder.length() - 1).toString();
String result = HttpRequestUtil.sendPost(PropKit.get("authUrl"), param);
Kv parseObject = JSON.parseObject(result, Kv.class);
Object access_token = parseObject.get("access_token");
if (access_token == null) {
renderJson(Ret.fail("msg", "获取授权失败,请重新登录"));
return;
}
String sendPost = HttpRequestUtil.sendPost(PropKit.get("userInfoUrl"),
"access_token=" + access_token.toString());
Kv userObj = JSON.parseObject(sendPost, Kv.class);
Object uuid = userObj.get("uuid");
if (uuid == null) {
renderJson(Ret.fail("msg", "获取用户信息失败"));
return;
}
System system = System.dao.template("getSystemPrivatekey", app).findFirst();
if (system == null) {
renderJson(Ret.fail("msg", "获取服务信息失败"));
return;
}
Record userInfo = Db.findById("AS_USER", "UUID", uuid.toString());
if (userInfo == null) {
renderJson(Ret.fail("msg", "没有找到当前用户"));
return;
}
String userName = userInfo.getStr("USERNAME");
if (userName == null) {
renderJson(Ret.fail("msg", "获取用户名失败"));
return;
}
try {
String jws = Jwts.builder()
// 设置密匙ID
.setHeaderParam(JwsHeader.KEY_ID, system.getKeyid())
// 赋予应用
.setSubject(app)
// 签发时间
.setIssuedAt(new Date())
// 超期时间
.setExpiration(new Date(java.lang.System.currentTimeMillis() + EXPIRATION))
// 用户名
.claim("name", userName).claim("ip", JwtInterceptor.getIpAddr(getRequest()))
// 签名
.signWith(KeysUtil.privatekey(system.getPrivatekey()), SignatureAlgorithm.RS256).compact();
this.renderJson(Ret.ok("token", jws));
logService.saveAsLog("login", userName, JwtInterceptor.getIpAddr(getRequest()),
userName + "登录" + app + "成功", app);
} catch (Exception e) {
log.error("生成登录票据失败", e);
this.renderJson(Ret.fail("msg", "生成登录票据失败"));
logService.saveAsLog("login", userName, JwtInterceptor.getIpAddr(getRequest()), "生成登录票据失败", app);
}
}
}
package com.archser.aserver.controller;
import java.math.BigInteger;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import com.alibaba.fastjson.JSON;
import com.archser.aserver.interceptor.JwtInterceptor;
import com.archser.aserver.model.System;
import com.archser.aserver.model.User;
import com.archser.aserver.service.LogService;
import com.archser.aserver.service.UserService;
import com.archser.aserver.util.HttpRequestUtil;
import com.archser.aserver.util.KeysUtil;
import com.archser.aserver.util.gm.BCECUtil;
import com.archser.aserver.util.gm.SM2Util;
import com.jfinal.aop.Clear;
import com.jfinal.aop.Inject;
import com.jfinal.core.Controller;
import com.jfinal.kit.HashKit;
import com.jfinal.kit.Kv;
import com.jfinal.kit.PropKit;
import com.jfinal.kit.Ret;
import com.jfinal.kit.StrKit;
import com.jfinal.log.Log;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.redis.Redis;
import com.spbportal.sso.SsoToken;
import io.jsonwebtoken.JwsHeader;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
/**
* IndexController 指向系统访问首页
*
* @author jbolt.cn
* @email 909854136@qq.com
* @date 2018年11月4日 下午9:02:52
*/
public class IndexController extends Controller {
/**
* 登陆用户名,密码解密
*/
public static final String PRIVATE_KEY_D = "38627fffe8003e6d2faa76d4eae2f74fd9cd7be257ab36c356c4f01bbc17e41d";
public static final ECPrivateKeyParameters USER_PRIVATE_KEY = BCECUtil.createECPrivateKeyParameters(
new BigInteger(ByteUtils.fromHexString(PRIVATE_KEY_D)), SM2Util.DOMAIN_PARAMS);
private static Log log = Log.getLog(IndexController.class);
/**
* 超期时间:24小时,即:24 * 60 * 60 * 1000
*/
private static int EXPIRATION = 24 * 60 * 60 * 1000;
private static int permitLoginTimes = 5;// 允许登陆次数
private static int hour = 2; // 两小时内不可登录
@Inject
private LogService logService;
@Inject
private UserService userService;
/**
* 首页Action
*/
public void index() {
render("index.html");
}
/**
* 修改密码
*/
public void updatePassword() {
String username = this.getPara("username");
String password = this.getPara("newPwd");
password = HashKit.sha256(password);
int a = userService.updatePwd(password, username);
if (a == 0) {
this.renderJson(Ret.fail("msg", "修改失败"));
logService.saveAsLog("operate", username, JwtInterceptor.getIpAddr(getRequest()),
username + "修改密码操作:修改密码失败", "aserver");
return;
}
this.renderJson(Ret.ok("msg", "修改成功"));
logService.saveAsLog("operate", username, JwtInterceptor.getIpAddr(getRequest()), username + "修改密码操作:修改密码成功",
"aserver");
}
private String decrypt(String sm2Cipher) throws InvalidCipherTextException {
return new String(SM2Util.decrypt(USER_PRIVATE_KEY, ByteUtils.fromHexString("04" + sm2Cipher)));
}
/**
* 登录验证
*/
@Clear(JwtInterceptor.class)
// @Before(LoginValidator.class)
public void login() {
String app = this.getPara("app");
String username = this.getPara("username");
String password = this.getPara("password");
String callback = this.getPara("callback");
// 解密用户名和密码
try {
username = decrypt(username);
password = decrypt(password);
} catch (Exception e1) {
e1.printStackTrace();
username = this.getPara("username");
password = this.getPara("password");
}
password = HashKit.sha256(password);
User user = User.dao.template("getUser", username).findFirst();
if (user == null) {
this.renderJson(Ret.fail("msg", "用户名或密码不存在: " + username));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "该用户非本系统用户正在非法登录", app);
return;
}
// 一旦开启三员 admin用户不能使用
if ("admin".equals(user.getUsername())) {
Integer userCount = Db.queryInt(Db.getSql("hasThreeMemberUsersCount"));
boolean isExistThreeMemberUsers = userCount == null ? false : (userCount.intValue() > 0 ? true : false);
if (isExistThreeMemberUsers) {
this.renderJson(Ret.fail("msg", "已开启三员管理,admin失效了。"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:已开启三员管理", app);
return;
}
}
if (Integer.valueOf(user.getLocked()) == 1) {
this.renderJson(Ret.fail("msg", "当前账户已被锁定"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:该用户已被锁定", app);
return;
}
if (!password.equals(user.getPassword())) {
if (this.checkErrorCount(user)) {
this.renderJson(Ret.fail("msg", "您的错误次数已达5次以上,请稍后再试!"));
return;
} else {
int errorCount = permitLoginTimes - (user.getErrorcount() == null ? 0 : user.getErrorcount()) - 1;
if (user.getErrorcount() == 4) {
this.renderJson(Ret.fail("msg", "用户名或密码验证失败,您的账户于两小时后才可登录!"));
return;
} else {
this.renderJson(Ret.fail("msg", "用户名或密码验证失败,您还有" + errorCount + "次机会!"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:密码验证错误",
app);
return;
}
}
}
Integer errorcount = user.getErrorcount();
if (errorcount != null && errorcount != 0) {
if (!this.checkWhenPwdOk(user)) {
Date date = new Date();
long hour1 = 2 * 60 * 60;
long begin = date.getTime();
long end = user.getLastLoginTime().getTime();
long between = (begin - end) / 1000;
long hour2 = (hour1 - between) % (24 * 3600) / 3600;
long minute = (hour1 - between) % 3600 / 60;
long second = (hour1 - between) % 60;
if (between < hour1) {
this.renderJson(Ret.fail("msg", "您的账户还剩" + hour2 + "小时" + minute + "分" + second + "秒才可登录!"));
return;
}
}
}
if (!"admin".equals(user.getUsername())) {
Integer noLockedRolesCount = Db.queryInt(Db.getSql("hasNoLockedRolesCount"), user.getUsername());
boolean noLockedRolesFlag = noLockedRolesCount == null ? false
: (noLockedRolesCount.intValue() > 0 ? true : false);
if (!noLockedRolesFlag) {
this.renderJson(Ret.fail("msg", "拥有的角色全部被锁定,不能登录系统了。"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:该用户拥有的角色全部被锁定",
app);
return;
}
}
System system = System.dao.template("getSystemPrivatekey", app).findFirst();
if (system == null) {
this.renderJson(Ret.fail("msg", "没有找到应用:" + app));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:没有找到应用" + app,
app);
return;
}
if (StrKit.isBlank(system.getPrivatekey()) || StrKit.isBlank(system.getKeyid())) {
this.renderJson(Ret.fail("msg", "没有找到应用的密钥:" + app));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:没有找到应用的密钥" + app,
app);
return;
}
//查询用户是否有该系统的权限
// boolean homeAuth = userService.checkUserSystemPermission(user.getId(), app);
// if (!homeAuth) {
// this.renderJson(Ret.fail("msg", "您没有权限登录" + system.getTitle() + "系统"));
// logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "登录失败,原因:您没有权限登录此系统" + app,
// app);
// return;
// }
List<System> systemList = userService.findSystemWithUserPermission(user.getId());
/** 修改如果登陆用户为admin用户则直接登陆 huwenbin 2020/5/20 start */
if (!"admin".equals(user.getUsername())) {
if ((systemList == null || systemList.isEmpty())) {
this.renderJson(Ret.fail("msg", "您没有权限登录" + system.getTitle() + "系统"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()),
"登录失败,原因:您没有权限登录此系统" + app, app);
return;
}
Optional<System> systemOptional = userService.getSystemByName(app, systemList);
if (!systemOptional.isPresent()) {// 没有当前系统的权限
system = systemList.get(0);
app = system.getName();
callback = system.getUrl();
}
}
/** 修改如果登陆用户为admin用户则直接登陆 huwenbin 2020/5/20 end */
try {
String jws = Jwts.builder()
// 设置密匙ID
.setHeaderParam(JwsHeader.KEY_ID, system.getKeyid())
// 赋予应用
.setSubject(app)
// 签发时间
.setIssuedAt(new Date())
// 超期时间
.setExpiration(new Date(java.lang.System.currentTimeMillis() + EXPIRATION))
// 用户名
.claim("name", username).claim("ip", JwtInterceptor.getIpAddr(getRequest()))
// 签名
.signWith(KeysUtil.privatekey(system.getPrivatekey()), SignatureAlgorithm.RS256).compact();
if (errorcount != null && errorcount != 0) {
this.setErrZero(user);
}
/**
* 20200706 lidecai 将用户信息保存到Redis start
*/
Map<Object, Object> userInfo = new HashMap<>();
Iterator<Entry<String, Object>> userIterator = user._getAttrsEntrySet().iterator();
Entry<String, Object> nextAttr = null;
while(userIterator.hasNext()) {
nextAttr = userIterator.next();
userInfo.put(nextAttr.getKey().trim().toLowerCase(), nextAttr.getValue());
}
try {
Redis.use().hmset(username + "_INFO", userInfo);
// 设置过期时间
Redis.use().expire(username, 60 * 60 * 24);
}catch (Exception e) {
e.printStackTrace();
}
this.renderJson(Ret.ok("token", jws).set("callback", callback));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), username + "登录" + app + "成功", app);
/**
* 20200706 lidecai 将用户信息保存到Redis end
*/
} catch (Exception e) {
log.error("生成登录票据失败", e);
this.renderJson(Ret.fail("msg", "生成登录票据失败"));
logService.saveAsLog("login", username, JwtInterceptor.getIpAddr(getRequest()), "生成登录票据失败", app);
}
}
// 密码正确时错误次数清零
private void setErrZero(User user) {
Db.update(Db.getSqlPara("updateForOk", Kv.by("id", user.getId())));
}
//密码错误时判断错误次数是否为5次
private boolean checkErrorCount(User user) {
Kv cond = Kv.by("id", user.getId()).set("hour", hour).set("permitLoginTimes", permitLoginTimes);
List<Record> currentList = Db.find(Db.getSqlPara("getErrorCount", cond));
int currentNum = 0;
for (Record record : currentList) {
currentNum = Integer.parseInt(record.get("flag").toString());
}
if (currentNum >= permitLoginTimes) {
return true;
} else {
//执行+1或=1的操作
Db.update(Db.getSqlPara("updateForErr", cond));
return false;
}
}
//密码正确时判断次数和锁定时间是否在指定范围内
private boolean checkWhenPwdOk(User user) {
List<Record> currentList = Db.find(Db.getSqlPara("checkWhenPwdOk",
Kv.by("id", user.getId()).set("hour", hour).set("permitLoginTimes", permitLoginTimes)));
int currentNum = 0;
if (currentList == null || currentList.size() == 0) {
return true;
}
for (Record record : currentList) {
currentNum = Integer.parseInt(record.get("flag").toString());
}
if (currentNum >= permitLoginTimes) {
return false;
} else {
return true;
}
}
/**
* 通过门户系统单点登录
*
* @author Guo XJ
* @date 2019-12-13 15:08:00
*/
public void ssoByPortalSystem() {
try {
//获取app
String app = getPara("app", null);
if (app == null) {
renderJson(Ret.fail("msg", "获取服务信息失败"));
return;
}
//获取到门户系统的Token
String ssotoken = getPara("ssotoken");
//获取到personCode(用户唯一标识)
SsoToken st = new SsoToken();
st.initialise(ssotoken);
String personCode = st.getTokenId();
//获取用户
Record user = userService.getUserInfoByPersonCode(personCode);
System system = System.dao.template("getSystemPrivatekey", app).findFirst();
if (system == null) {
renderJson(Ret.fail("msg", "获取服务信息失败"));
return;
}
//判断用户是否存在
if (user != null && user.getStr("username") != null) {
String jws = Jwts.builder()
// 设置密匙ID
.setHeaderParam(JwsHeader.KEY_ID, system.getKeyid())
// 赋予应用
.setSubject(app)
// 签发时间
.setIssuedAt(new Date())
// 超期时间
.setExpiration(new Date(java.lang.System.currentTimeMillis() + EXPIRATION))
// 用户名
.claim("name", user.getStr("username")).claim("ip", JwtInterceptor.getIpAddr(getRequest()))
// 签名
.signWith(KeysUtil.privatekey(system.getPrivatekey()), SignatureAlgorithm.RS256).compact();
this.renderJson(Ret.ok("token", jws));
return;
} else {
this.renderJson(Ret.fail("msg", "没有找到当前用户"));
return;
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
this.renderJson(Ret.fail("msg", "登录出错!"));
}
}
/**
* 根据邮政门户传回的code 获取用户信息
*
* @Title: getUserInfoForH5
* @author LDC
* @date 2019-11-19 03:22:34
*/
@Clear
public void getUserInfoForH5() {
String code = getPara("code", null);
if (code == null) {
renderJson(Ret.fail("msg", "获取用户信息失败"));
return;
}
String app = getPara("app", null);
if (app == null) {
renderJson(Ret.fail("msg", "获取服务信息失败"));
return;
}
Map<String, String> paramMap = new LinkedHashMap<String, String>();
paramMap.put("client_id", "MmEepJkH7Hiz7EtS");
paramMap.put("code", code);
paramMap.put("state", "1");
paramMap.put("grant_type", "authorization_code");
paramMap.put("scope", "scope");
paramMap.put("redirect_uri", PropKit.get("redirect_uri"));
Iterator<Entry<String, String>> entrySet = paramMap.entrySet().iterator();
StringBuilder builder = new StringBuilder();
while (entrySet.hasNext()) {
Entry<String, String> next = entrySet.next();
builder.append(next.getKey()).append("=").append(next.getValue()).append("&");
}
String param = builder.deleteCharAt(builder.length() - 1).toString();
String result = HttpRequestUtil.sendPost(PropKit.get("authUrl"), param);
Kv parseObject = JSON.parseObject(result, Kv.class);
Object access_token = parseObject.get("access_token");
if (access_token == null) {
renderJson(Ret.fail("msg", "获取授权失败,请重新登录"));
return;
}
String sendPost = HttpRequestUtil.sendPost(PropKit.get("userInfoUrl"),
"access_token=" + access_token.toString());
Kv userObj = JSON.parseObject(sendPost, Kv.class);
Object uuid = userObj.get("uuid");
if (uuid == null) {
renderJson(Ret.fail("msg", "获取用户信息失败"));
return;
}
System system = System.dao.template("getSystemPrivatekey", app).findFirst();
if (system == null) {
renderJson(Ret.fail("msg", "获取服务信息失败"));
return;
}
Record userInfo = Db.findById("AS_USER", "UUID", uuid.toString());
if (userInfo == null) {
renderJson(Ret.fail("msg", "没有找到当前用户"));
return;
}
String userName = userInfo.getStr("USERNAME");
if (userName == null) {
renderJson(Ret.fail("msg", "获取用户名失败"));
return;
}
try {
String jws = Jwts.builder()
// 设置密匙ID
.setHeaderParam(JwsHeader.KEY_ID, system.getKeyid())
// 赋予应用
.setSubject(app)
// 签发时间
.setIssuedAt(new Date())
// 超期时间
.setExpiration(new Date(java.lang.System.currentTimeMillis() + EXPIRATION))
// 用户名
.claim("name", userName).claim("ip", JwtInterceptor.getIpAddr(getRequest()))
// 签名
.signWith(KeysUtil.privatekey(system.getPrivatekey()), SignatureAlgorithm.RS256).compact();
this.renderJson(Ret.ok("token", jws));
logService.saveAsLog("login", userName, JwtInterceptor.getIpAddr(getRequest()),
userName + "登录" + app + "成功", app);
} catch (Exception e) {
log.error("生成登录票据失败", e);
this.renderJson(Ret.fail("msg", "生成登录票据失败"));
logService.saveAsLog("login", userName, JwtInterceptor.getIpAddr(getRequest()), "生成登录票据失败", app);
}
}
/**
* 退出系统,清空Redis 中的用户信息
* @Time:2020年7月6日 - 下午5:19:58
* @author:李德才
* @param:
* @return: void
* @throws
*/
public void loginOut() {
String userName = getAttrForStr("username");
Redis.use().del(userName + "_INFO");
renderJson(Ret.ok());
}
}
package com.archser.aserver.controller;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import com.archser.aserver.model.User;
import com.archser.aserver.service.UserService;
import com.jfinal.core.Controller;
import com.jfinal.kit.HashKit;
import com.jfinal.kit.Kv;
import com.jfinal.kit.Ret;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
/**
* 用户相关操作
*
* @author dgq
*
*/
public class UserController extends Controller {
@Inject
UserService userService;
/**
* 获取用户信息
*/
public void info() {
String username = this.getAttr("username");
User user = User.dao.template("getUser", username).findFirst();
user.remove("password");
this.renderJson(Ret.ok("userInfo", user));
}
/**
* 修改用户密码
*/
@SuppressWarnings("unused")
public void updatePwd() {
String username = this.getAttr("username");
String password = this.getPara("newPwd");
password = HashKit.sha256(password);
int flag = Db.update(Db.getSql("updatePassword"), password, username);
if (flag == 0) {
this.renderJson(Ret.fail("msg","修改失败"));
}
this.renderJson(Ret.ok("msg","修改成功"));
}
/**
* 修改用户
*/
public void updateUser() {
User user = this.getModel(User.class, "user", true);
if (user == null) {
renderJson("msg", "数据参数错误,请重新修改");
return;
}
boolean flag = user.update();
if (flag) {
renderJson(Ret.ok("msg", "数据修改成功!"));
return;
} else {
renderJson(Ret.fail("msg", "Error ! 请联系管理员解决。"));
}
}
/**
* 查询角色
*/
@SuppressWarnings("unused")
public void getRoleData() {
String username = this.getAttr("username");
User user = User.dao.template("getUser", username).findFirst();
int userId = user.getId();
List<Record> records = Db.find(Db.getSql("getRolesByUserId"), userId);
List<Integer> ids = new ArrayList<Integer>();
for (Record record : records) {
ids.add(record.getInt("ROLE_ID"));
}
List<Record> dataList = Db.find(Db.getSqlPara("getRole",Kv.by("ids", ids)));
if (dataList != null) {
this.renderJson(Ret.ok("list", dataList));
} else {
this.renderJson(Ret.fail("msg", "未找到数据"));
}
}
/**
* 验证原密码输入的是否正确
*/
public void validateOldPassword() {
String username = this.getAttr("username");
User user = User.dao.template("getUser", username).findFirst();
String oldPwd = getPara("oldPwd");
String encryptionString = HashKit.sha256(oldPwd);
if (encryptionString.equals(user.getPassword())) {
renderJson(Ret.ok());
} else {
renderJson(Ret.fail());
}
}
}
package com.archser.aserver.controller;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.inject.Inject;
import com.archser.aserver.model.User;
import com.archser.aserver.service.UserService;
import com.jfinal.core.Controller;
import com.jfinal.kit.HashKit;
import com.jfinal.kit.Kv;
import com.jfinal.kit.Ret;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.redis.Redis;
/**
* 用户相关操作
*
* @author dgq
*
*/
public class UserController extends Controller {
@Inject
UserService userService;
private static final String _INFO = "_INFO";
/**
* 获取用户信息
*/
public void info() {
String username = this.getAttr("username");
User user = User.dao.template("getUser", username).findFirst();
user.remove("password");
this.renderJson(Ret.ok("userInfo", user));
}
/**
* 修改用户密码
* @throws SQLException
*/
public void updatePwd() {
String username = this.getAttr("username");
String password = this.getPara("newPwd");
password = HashKit.sha256(password);
int flag = Db.update(Db.getSql("updatePassword"), password, username);
if (flag == 0) {
this.renderJson(Ret.fail("msg","修改失败"));
return ;
}
try {
Redis.use().hset(username+ _INFO, "password", password);
}catch (Exception e) {
e.printStackTrace();
}
this.renderJson(Ret.ok("msg","修改成功"));
}
/**
* 修改用户
*/
public void updateUser() {
User user = this.getModel(User.class, "user", true);
if (user == null) {
renderJson("msg", "数据参数错误,请重新修改");
return;
}
boolean flag = user.update();
if (flag) {
updateUserForRedis(user);
renderJson(Ret.ok("msg", "数据修改成功!"));
return;
} else {
renderJson(Ret.fail("msg", "Error ! 请联系管理员解决。"));
}
}
/**
* 修改Redis中的用户信息
*@Time:2020年7月10日 - 上午8:48:48
* @author:李德才
* @param: @param user
* @return: void
* @throws
*/
public void updateUserForRedis(User user) {
try {
Iterator<Entry<String, Object>> userIterator = user._getAttrsEntrySet().iterator();
Map<Object, Object> userMap = new HashMap<>();
Entry<String, Object> userAttr = null;
while (userIterator.hasNext()) {
userAttr = userIterator.next();
userMap.put(userAttr.getKey().toString().trim().toLowerCase(), userAttr.getValue());
}
Redis.use().hmset(user.getUsername() + _INFO, userMap);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 查询角色
*/
public void getRoleData() {
String username = this.getAttr("username");
User user = User.dao.template("getUser", username).findFirst();
int userId = user.getId();
List<Record> records = Db.find(Db.getSql("getRolesByUserId"), userId);
List<Integer> ids = new ArrayList<Integer>();
for (Record record : records) {
ids.add(record.getInt("ROLE_ID"));
}
List<Record> dataList = Db.find(Db.getSqlPara("getRole",Kv.by("ids", ids)));
if (dataList != null) {
this.renderJson(Ret.ok("list", dataList));
} else {
this.renderJson(Ret.fail("msg", "未找到数据"));
}
}
/**
* 验证原密码输入的是否正确
*/
public void validateOldPassword() {
String username = this.getAttr("username");
User user = User.dao.template("getUser", username).findFirst();
String oldPwd = getPara("oldPwd");
String encryptionString = HashKit.sha256(oldPwd);
if (encryptionString.equals(user.getPassword())) {
renderJson(Ret.ok());
} else {
renderJson(Ret.fail());
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE update SYSTEM "DBUpdate_dtd.dtd">
<update dataType="DM" description="达梦数据库升级SQL语句">
<version edition="1" description="更新错误登陆次数为0">
<sql creator="chenyong" createDate="20200114" note="更新错误登陆次数为0">
UPDATE AS_USER
SET ERRORCOUNT=0
</sql>
</version>
<version edition="2" description="添加url长度">
<sql creator="cyq" createDate="20200211" note="添加url长度">
alter table AS_LOG
modify (URL varchar2(1000))
</sql>
</version>
<version edition="3" description="创建流程服务的表单表">
<sql creator="huwenbin" createDate="20200212" note="创建流程服务的表单表">
CREATE TABLE
"AS_PROCESS_FORM"
(
"ID" NUMBER(9,0) NOT NULL,
"CREATER" NUMBER(22,6),
"CREATE_TIME" TIMESTAMP(6),
"DESCRIPTION" VARCHAR2(250),
"NAME"
VARCHAR(250),
"PROCESS_ID" VARCHAR2(64),
"ISSUE" VARCHAR2(10),
"FORM_CONTENT" VARCHAR2(4000),
"SCHEDULE_CONTENT" VARCHAR2(4000),
NOT
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON
TABLE "AS_PROCESS_FORM" IS '流程服务的表单表';
COMMENT ON COLUMN
"AS_PROCESS_FORM"."CREATER" IS '创建人id';
COMMENT ON COLUMN
"AS_PROCESS_FORM"."CREATE_TIME" IS
'创建时间';
COMMENT ON
COLUMN "AS_PROCESS_FORM"."DESCRIPTION" IS '表单描述';
COMMENT ON COLUMN "AS_PROCESS_FORM"."FORM_CONTENT" IS
'表单数据JSON';
COMMENT ON COLUMN "AS_PROCESS_FORM"."ID" IS
'主键';
COMMENT ON COLUMN "AS_PROCESS_FORM"."ISSUE" IS
'是否发布:0:否,1:是';
COMMENT ON COLUMN
"AS_PROCESS_FORM"."NAME" IS '表单名称';
COMMENT ON COLUMN
"AS_PROCESS_FORM"."PROCESS_ID" IS
'流程关联id';
COMMENT ON
COLUMN "AS_PROCESS_FORM"."SCHEDULE_CONTENT" IS
'附表数据JSON';
</sql>
</version>
<version edition="4" description="创建流程服务和角色关联的表">
<sql creator="huwenbin" createDate="20200212" note="创建流程服务和角色关联的表">
CREATE TABLE
"AS_ROLE_FORM"
(
"ID" NUMBER(9,6) NOT NULL,
"ROLE_ID" NUMBER(20,6),
"FORM_ID" NUMBER(20,6),
CLUSTER PRIMARY KEY("ID"),
UNIQUE("ID"))
STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE
"AS_ROLE_FORM" IS '流程管理角色和表单关联';
COMMENT ON COLUMN
"AS_ROLE_FORM"."FORM_ID" IS '表单id';
COMMENT ON COLUMN
"AS_ROLE_FORM"."ID" IS '主键id';
COMMENT ON COLUMN
"AS_ROLE_FORM"."ROLE_ID" IS '角色id';
</sql>
</version>
<version edition="5" description="创建流程模型和流程部署关联表">
<sql creator="huwenbin" createDate="20200312" note="创建流程模型和流程部署关联表">
create table AS_MODEL_DEPLOYMENT
(
ID INTEGER not null,
DEPLOYMENT_ID VARCHAR2(64),
MODEL_ID VARCHAR2(50)
);
comment on table
AS_MODEL_DEPLOYMENT is '流程图与流程部署表的关联表';
create unique index
INDEX33558234
on AS_MODEL_DEPLOYMENT (ID);
alter table
AS_MODEL_DEPLOYMENT
add constraint CONS134220130
primary key (ID);
CREATE SEQUENCE "SEQ_AS_MODEL_DEPLOYMENT" INCREMENT BY 1 START WITH 1
MAXVALUE 99999999999999 MINVALUE 1 CACHE 20;
CREATE SEQUENCE
"SEQ_AS_ROLE_FORM" INCREMENT BY 1 START WITH 1 MAXVALUE
9999999999999999 MINVALUE 1 CACHE 20;
CREATE SEQUENCE
"SEQ_AS_PROCESS_FORM" INCREMENT BY 1 START WITH 1 MAXVALUE
9999999999999999 MINVALUE 1 CACHE 20;
</sql>
</version>
<version edition="6" description="YZJ-1781 代码规则表">
<sql creator="lidecai" createDate="20200320" note="创建代码规则表">
CREATE TABLE
AS_CODEVALUE"
(
"ID" INTEGER NOT NULL,
"TABLE_ID" INTEGER,
"COLUMN_ID"
INTEGER,
"KEY" VARCHAR2(50),
"VALUE" VARCHAR2(50),
"IDSEQ" VARCHAR2(50),
"COLUMN_NAME" VARCHAR2(50),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON
"MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "AS_CODEVALUE"."COLUMN_ID" IS
'字段ID';
COMMENT ON COLUMN "AS_CODEVALUE"."IDSEQ" IS '全宗代码';
COMMENT ON
COLUMN "AS_CODEVALUE"."KEY" IS '代码';
COMMENT ON COLUMN
"AS_CODEVALUE"."TABLE_ID" IS '表ID';
COMMENT ON COLUMN
"AS_CODEVALUE"."VALUE" IS '值';
</sql>
<sql creator="lidecai" createDate="20200320" note="创建代码规则表的序列">
CREATE SEQUENCE
"SEQ_AS_CODEVALUE" INCREMENT BY 1 START WITH 1
MAXVALUE
9999999999 MINVALUE 1 CACHE 20;
</sql>
</version>
<version edition="7" description="报表与档案关联表添加全宗">
<sql creator="yangchegnwu" createDate="20200323" note="报表与档案关联表添加全宗">
alter table AS_REPORT_TABLE add "IDSEQ" VARCHAR2(50);
</sql>
<sql creator="ChengYaqing" createDate="20200327" note="主动接口任务表添加字段">
alter table AS_TASK add ("IDSEQ" VARCHAR2(255),"CREATOR"
VARCHAR2(50));
</sql>
<sql creator="ChengYaqing" createDate="20200327" note="主动接口配置表添加字段">
alter table AS_TASK_DBCONFIG add ("AJCONDITION"
VARCHAR2(500),"JNCONDITION" VARCHAR2(500));
</sql>
<sql creator="ChengYaqing" createDate="20200416" note="统计归档元数据统计">
CREATE TABLE
AS_FILING_METADATA_STATISTICS
(
"ID" NUMBER(9,0) NOT NULL,
"LIBRARY"
VARCHAR2(255),
"DATE" TIMESTAMP(6),
"PATH" VARCHAR2(255),
"DATACOUNT"
NUMBER(9,0),
"FILECOUNT" NUMBER(9,0),
CLUSTER PRIMARY
KEY("ID"))
STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN
"AS_FILING_METADATA_STATISTICS"."DATACOUNT"
IS '数据的数量';
COMMENT ON COLUMN
"AS_FILING_METADATA_STATISTICS"."DATE"
IS '时间';
COMMENT
ON COLUMN
"AS_FILING_METADATA_STATISTICS"."FILECOUNT" IS
'文件数量';
COMMENT ON COLUMN
"AS_FILING_METADATA_STATISTICS"."LIBRARY" IS '档案类型';
COMMENT ON COLUMN "AS_FILING_METADATA_STATISTICS"."PATH"
IS '下载文件路径';
</sql>
</version>
<version edition="8" description="库房字段类型修改">
<sql creator="lidecai" createDate="20200331" note="修改字段名称">
alter table
AS_ACCESS_MOVE rename column COUNT TO COUNT_COPY;
</sql>
<sql creator="lidecai" createDate="20200331" note="增加一个和原字段名同名的字段">
alter table
AS_ACCESS_MOVE add COUNT NUMBER(10);
</sql>
<sql creator="lidecai" createDate="20200331" note="将原字段 COUNT_COPY 数据更新到增加的字段 COUNT ">
update AS_ACCESS_MOVE set COUNT= trim (COUNT_COPY)
</sql>
<sql creator="lidecai" createDate="20200331" note="更新完,删除临时字段">
alter table
AS_ACCESS_MOVE drop column COUNT_COPY;
</sql>
</version>
<version edition="9" description="盘点记录">
<sql creator="lidecai" createDate="20200423" note="创建记录表">
CREATE TABLE
"AS_CHECK_RECORD"
(
"ID" INTEGER NOT NULL,
"CHECK_NAME"
VARCHAR2(50),
"CREATE_TIME" TIMESTAMP(6),
"CHECK_TIME" VARCHAR2(50),
"USER_NAME" VARCHAR2(50),
"CHECK_STATUS" VARCHAR2(50),
CLUSTER PRIMARY
KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN
"AS_CHECK_RECORD"."CHECK_NAME" IS '盘点名称';
COMMENT ON
COLUMN "AS_CHECK_RECORD"."CHECK_STATUS" IS
'盘点状态';
COMMENT ON COLUMN "AS_CHECK_RECORD"."CHECK_TIME" IS
'盘点时间';
COMMENT ON COLUMN "AS_CHECK_RECORD"."CREATE_TIME"
IS
'创建时间';
COMMENT ON COLUMN "AS_CHECK_RECORD"."USER_NAME"
IS '创建者名称';
</sql>
<sql creator="lidecai" createDate="20200423" note="创建序列">
CREATE SEQUENCE
"SEQ_AS_CHECK_RECORD" INCREMENT BY 1 START WITH 1
MAXVALUE 9999999999 MINVALUE 1 CACHE 20;
</sql>
</version>
<version edition="10" description="盘点记录详情">
<sql creator="lidecai" createDate="20200423" note="创建记录表">
CREATE TABLE
"AS_CHECK_RECORD_RESULT"
(
"ID" CHAR(10) NOT NULL,
"TABLE_ID" INTEGER,
"EPC" VARCHAR2(50),
"RECORD_ID" INTEGER,
"LIB_ID"
INTEGER,
"DATA_ID" INTEGER,
CLUSTER PRIMARY KEY("ID")) STORAGE(ON
"MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN
"AS_CHECK_RECORD_RESULT"."DATA_ID" IS
'档案条目ID';
COMMENT ON
COLUMN "AS_CHECK_RECORD_RESULT"."EPC" IS '档案唯一标识
RFID';
COMMENT ON COLUMN "AS_CHECK_RECORD_RESULT"."ID" IS '主键';
COMMENT ON COLUMN "AS_CHECK_RECORD_RESULT"."LIB_ID" IS
'档案类别ID';
COMMENT ON COLUMN
"AS_CHECK_RECORD_RESULT"."RECORD_ID" IS
'盘点记录ID';
COMMENT
ON COLUMN "AS_CHECK_RECORD_RESULT"."TABLE_ID" IS '表ID';
</sql>
<sql creator="lidecai" createDate="20200423" note="创建序列">
CREATE SEQUENCE
"SEQ_AS_CHECK_RECORD_RUEULT" INCREMENT BY 1 START WITH 1
MAXVALUE 999999999 MINVALUE 1 CACHE 20;
</sql>
</version>
<version edition="11" description="库房中间表">
<sql creator="lidecai" createDate="20200423" note="创建中间表">
CREATE TABLE
"AS_EPC_DATA"
(
"ID" INTEGER NOT NULL,
"EPC" VARCHAR2(50)
NOT NULL,
"LIB_ID" INTEGER,
"TABLE_ID" INTEGER,
"DATA_ID" VARCHAR2(50),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE
INDEX "AS_EPC_DATA_INDEX" ON "AS_EPC_DATA"("EPC" ASC)
STORAGE(ON "MAIN", CLUSTERBTR) ;
</sql>
<sql creator="lidecai" createDate="20200331" note="创建序列">
CREATE SEQUENCE
"SEQ_AS_EPC_DATA" INCREMENT BY 1 START WITH 1 MAXVALUE
999999999 MINVALUE 1 CACHE 20;
</sql>
</version>
<version edition="12" description="库房中间表">
<sql creator="lidecai" createDate="20200426" note="添加EPC字段">
ALTER TABLE As_Borrow_Data add EPC VARCHAR2(20);
</sql>
</version>
<version edition="13" description="流程附表拓展字段表">
<sql creator="huwenbin" createDate="20200428" note="流程附表拓展字段表">
CREATE TABLE "AS_SCHE_EXT_DATA"
(
"ID" NUMBER(9,0) NOT NULL,
"ORIGINAL_DATA" CLOB,
"SCHE_ID" NUMBER(9,0),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_SCHE_EXT_DATA" IS '附表的拓展数据表';
COMMENT ON COLUMN "AS_SCHE_EXT_DATA"."ORIGINAL_DATA" IS '附表源数据';
COMMENT ON COLUMN "AS_SCHE_EXT_DATA"."SCHE_ID" IS '附表id';
CREATE SEQUENCE "SEQ_AS_SCHE_EXT_DATA" INCREMENT BY 1 START WITH 1 MAXVALUE 999999999999999 MINVALUE 1;
</sql>
</version>
<version edition="14" description="流程申请表">
<sql creator="huwenbin" createDate="20200428" note="流程申请表">
CREATE TABLE "AS_APPLY_BORROW"
(
"ID" NUMBER(22,6) NOT NULL,
"PROCESS_INST_ID" VARCHAR2(64),
"START_USER_ID" NUMBER(9,0),
"START_TIME" TIMESTAMP(6),
"END_TIME" TIMESTAMP(6),
"APPLY_STATUS" NUMBER(1,0),
"PROCESS_NAME" VARCHAR2(50),
"TEMPORARY_ID" NUMBER(9,0),
"PROCESS_DEF_ID" VARCHAR2(64),
"TEMPORARY_TIME" TIMESTAMP(6),
"SYSTEM_ID" NUMBER(9,0),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_APPLY_BORROW" IS '档案申请借阅表';
COMMENT ON COLUMN "AS_APPLY_BORROW"."APPLY_STATUS" IS '申请状态';
COMMENT ON COLUMN "AS_APPLY_BORROW"."END_TIME" IS '结束时间';
COMMENT ON COLUMN "AS_APPLY_BORROW"."ID" IS '主键id';
COMMENT ON COLUMN "AS_APPLY_BORROW"."PROCESS_DEF_ID" IS '流程定义id';
COMMENT ON COLUMN "AS_APPLY_BORROW"."PROCESS_INST_ID" IS '流程实例id';
COMMENT ON COLUMN "AS_APPLY_BORROW"."PROCESS_NAME" IS '流程实例名称';
COMMENT ON COLUMN "AS_APPLY_BORROW"."START_TIME" IS '申请时间';
COMMENT ON COLUMN "AS_APPLY_BORROW"."START_USER_ID" IS '申请人';
COMMENT ON COLUMN "AS_APPLY_BORROW"."SYSTEM_ID" IS '系统id';
COMMENT ON COLUMN "AS_APPLY_BORROW"."TEMPORARY_ID" IS '暂存id';
</sql>
</version>
<version edition="15" description="流程附表拓展字段表">
<sql creator="huwenbin" createDate="20200428" note="流程附表拓展字段表增加字段">
alter table "AS_SCHE_EXT_DATA" add column("SCHE_TABLE_ID" NUMBER(9, 6));
comment on column "AS_SCHE_EXT_DATA"."SCHE_TABLE_ID" is '附表设计表id';
</sql>
</version>
<version edition="16" description="流程模型表单增加字段">
<sql creator="huwenbin" createDate="20200519" note="流程模型表单增加字段">
alter table "AS_MODEL_DEPLOYMENT" add column("FORM_ID" NUMBER(9, 0));
alter table "AS_MODEL_DEPLOYMENT" add column("TAG_ID" NUMBER(9, 0));
alter table "AS_MODEL_DEPLOYMENT" add column("TAG_NAME" VARCHAR2(50));
</sql>
</version>
<version edition="17" description="归档元数据统计表">
<sql creator="huwenbin" createDate="20200519" note="归档元数据统计表">
CREATE TABLE "AS_FILING_METADATA_STATISTICS"
(
"ID" NUMBER(9,0) NOT NULL,
"LIBRARY" VARCHAR2(255),
"DATE" TIMESTAMP(6),
"PATH" VARCHAR2(255),
"DATACOUNT" NUMBER(9,0),
"FILECOUNT" NUMBER(9,0),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "AS_FILING_METADATA_STATISTICS"."DATACOUNT" IS '数据的数量';
COMMENT ON COLUMN "AS_FILING_METADATA_STATISTICS"."DATE" IS '时间';
COMMENT ON COLUMN "AS_FILING_METADATA_STATISTICS"."FILECOUNT" IS '文件数量';
COMMENT ON COLUMN "AS_FILING_METADATA_STATISTICS"."LIBRARY" IS '档案类型';
COMMENT ON COLUMN "AS_FILING_METADATA_STATISTICS"."PATH" IS '下载文件路径';
</sql>
</version>
<version edition="18" description="流程标签表">
<sql creator="huwenbin" createDate="20200519" note="流程标签表">
CREATE TABLE "AS_PROCESS_TAG"
(
"ID" NUMBER(9,6) NOT NULL,
"NAME" VARCHAR2(50),
"PROCESS_MODEL_ID" VARCHAR2(150),
"DATA_TYPE" NUMBER(22,6),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_PROCESS_TAG" IS '流程标签表';
COMMENT ON COLUMN "AS_PROCESS_TAG"."DATA_TYPE" IS '1-内置的标签';
COMMENT ON COLUMN "AS_PROCESS_TAG"."NAME" IS '标签名';
COMMENT ON COLUMN "AS_PROCESS_TAG"."PROCESS_MODEL_ID" IS '流程模型表id';
</sql>
</version>
<version edition="19" description="流程申请表">
<sql creator="huwenbin" createDate="20200519" note="流程申请表">
CREATE TABLE "AS_APPLY_PROCESS"
(
"ID" NUMBER(9,0) NOT NULL,
"PROC_INST_ID" VARCHAR(64),
"TABLE_ID" NUMBER(9,0),
"DATA_ID" NUMBER(9,0),
"TITLE" VARCHAR(64),
"VIEW_PERMISSION_START_TIME" TIMESTAMP(6),
"VIEW_PERMISSION_END_TIME" TIMESTAMP(6),
"ENTITY_START_TIME" TIMESTAMP(6),
"ENTITY_END_TIME" TIMESTAMP(6),
"ENTITY_BACK_TIME" TIMESTAMP(6),
"IS_VIEW" NUMBER(22,6),
"IS_DOWN" NUMBER(22,6),
"START_USER_ID" NUMBER(9,0),
"DOWN_PERMISSION_START_TIME" TIMESTAMP(6),
"DOWN_PERMISSION_END_TIME" TIMESTAMP(6),
"PRINT_PERMISSION_START_TIME" TIMESTAMP(6),
"PRINT_PERMISSION_END_TIME" TIMESTAMP(6),
"VIEW_DAYS" NUMBER(3,0),
"DOWN_DAYS" NUMBER(3,0),
"PRINT_DAYS" NUMBER(3,0),
"IS_PRINT" NUMBER(3,0),
"APPLY_ID" NUMBER(9,0),
"ENTITY_BORROW_DAYS" NUMBER(9,6),
"BORROW_WAY" NUMBER(1,0),
"PROC_SCHE_ID" NUMBER(9,0),
CONSTRAINT "AS_APPLY_PROCEESS_PK" CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "AS_APPLY_PROCESS"."BORROW_WAY" IS '借阅方式:1-实体,2-电子';
COMMENT ON COLUMN "AS_APPLY_PROCESS"."IS_DOWN" IS '1-可以下载,0-不能下载';
COMMENT ON COLUMN "AS_APPLY_PROCESS"."IS_VIEW" IS '1-可以预览,0-不可以预览';
COMMENT ON COLUMN "AS_APPLY_PROCESS"."PROC_SCHE_ID" IS '1';
</sql>
</version>
<version edition="20" description="普服快递办件接收表">
<sql creator="huwenbin" createDate="20200519" note="普服快递办件接收表">
CREATE TABLE "AS_FILING_ACCEPT"
(
"ID" VARCHAR2(50) NOT NULL,
"PROJECTNO" VARCHAR2(50),
"TASKNAME" VARCHAR2(255),
"FILINGSTATUS" VARCHAR2(50),
"TABLEAJID" VARCHAR2(50),
"TABLEJNID" VARCHAR2(50),
"ORGCODE" VARCHAR2(50),
"ADDRES S" VARCHAR2(1000),
"PROJECTNAME" VARCHAR2(255),
"SYSTEMNAME" VARCHAR2(50),
"OPERATE" VARCHAR2(50),
"APPLYERPAGECODE" VARCHAR2(50),
"APPLYERNAME" VARCHAR2(50),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
</sql>
</version>
<version edition="21" description="普服快递许可办件材料表">
<sql creator="huwenbin" createDate="20200519" note="普服快递许可办件材料表">
CREATE TABLE "AS_FILING_MATERIAL"
(
"ID" VARCHAR2(50) NOT NULL,
"ROWGUID" VARCHAR2(50),
"PROJECTNO" VARCHAR2(50),
"GETTYPE" VARCHAR2(2),
"MATERIALATTACHNAME" VARCHAR2(200),
"MATERIALNAME" VARCHAR2(200),
"CD_OPERATION" VARCHAR2(2),
"CD_BATCH" VARCHAR2(32),
"DATASOURCE" VARCHAR2(3),
"CD_TIME" DATETIME(6),
"REMARK" VARCHAR2(1000),
"GETNUM" VARCHAR2(5),
"SOURCE_ID" VARCHAR2(50),
"FILINGSTATUS" VARCHAR2(50),
"OPERATE" VARCHAR2(50),
"SYSTEMNAME" VARCHAR2(50),
"URL" VARCHAR2(1000),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
</sql>
</version>
<version edition="22" description="普服快递许可办件结果表">
<sql creator="huwenbin" createDate="20200519" note="普服快递许可办件结果表">
CREATE TABLE "AS_FILING_RESULT"
(
"ID" VARCHAR2(255) NOT NULL,
"PROJECTNO" VARCHAR2(50),
"HANDLEUSERNAME" VARCHAR2(100),
"RESULTDATE" DATETIME(6),
"RESULTEXPLAIN" VARCHAR2(2000),
"ISDELIVERYRESULTS" VARCHAR2(2),
"RESULTTYPE" VARCHAR2(2),
"RESULTCETRNAME" VARCHAR2(2000),
"RESULTCETRNO" VARCHAR2(2000),
"SATISFACTION" VARCHAR2(2),
"FILINGSTATUS" VARCHAR2(50),
"TABLEAJID" VARCHAR2(50),
"TABLEJNID" VARCHAR2(50),
"OPERATE" VARCHAR2(50),
"SYSTEMNAME" VARCHAR2(50),
"REMARK" VARCHAR2(50),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
</sql>
</version>
<version edition="23" description="代码值表">
<sql creator="liuyimeng" createDate="20200602" note="代码值表">
CREATE TABLE "AS_CODEVALUE"
(
"ID" INTEGER NOT NULL,
"TABLE_ID" INTEGER,
"COLUMN_ID" INTEGER,
"KEY" VARCHAR2(50),
"VALUE" VARCHAR2(50),
"IDSEQ" VARCHAR2(50),
"COLUMN_NAME" VARCHAR2(50),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "AS_CODEVALUE"."COLUMN_ID" IS '字段ID';
COMMENT ON COLUMN "AS_CODEVALUE"."IDSEQ" IS '全宗代码';
COMMENT ON COLUMN "AS_CODEVALUE"."KEY" IS '代码';
COMMENT ON COLUMN "AS_CODEVALUE"."TABLE_ID" IS '表ID';
COMMENT ON COLUMN "AS_CODEVALUE"."VALUE" IS '值';
</sql>
</version>
<version edition="24" description="四性检测表">
<sql creator="liuyimeng" createDate="20200602" note="四性检测表">
alter table
AS_FOURTEST
add
CONDITION_DES
VARCHAR2(500);
</sql>
</version>
<version edition="25" description="表单列表">
<sql creator="liuyimeng" createDate="20200602" note="表单列表">
alter table
AS_FORM_COLUMN
add
IS_HIDE
VARCHAR2(500);
</sql>
</version>
<version edition="26" description="表单列表">
<sql creator="liuyimeng" createDate="20200602" note="表单列表">
alter table
AS_FORM_COLUMN
add
ID_EDIT
VARCHAR2(500);
</sql>
</version>
<version edition="27" description="库房表">
<sql creator="liuyimeng" createDate="20200602" note="库房表">
alter table
AS_STORAGE
add
IDSEQ
VARCHAR2(500);
</sql>
</version>
<version edition="28" description="库房表">
<sql creator="liuyimeng" createDate="20200602" note="库房表">
alter table
AS_STORAGE
add
ORGAN_ID
VARCHAR2(500);
</sql>
</version>
<version edition="29" description="日常管理表">
<sql creator="liuyimeng" createDate="20200602" note="日常管理表">
alter table
AS_DAILY
add
STORAGE_ID
VARCHAR2(500);
</sql>
</version>
<version edition="30" description="入库表">
<sql creator="liuyimeng" createDate="20200602" note="普服快递许可办件结果表">
alter table
AS_ACCESS_INTO
add
ORGAN_ID
VARCHAR2(500);
</sql>
</version>
<version edition="31" description="移库表">
<sql creator="liuyimeng" createDate="20200602" note="移库表">
alter table
AS_ACCESS_MOVE
add
ORGAN_ID
VARCHAR2(500);
</sql>
</version>
<version edition="32" description="出库表">
<sql creator="liuyimeng" createDate="20200602" note="出库表">
alter table
AS_ACCESS_OUT
add
ORGAN_ID
VARCHAR2(500);
</sql>
</version>
<version edition="33" description="出库表">
<sql creator="liuyimeng" createDate="20200602" note="出库表">
alter table
AS_ACCESS_OUT
add
MOBILEPHONE
VARCHAR2(500);
</sql>
</version>
<version edition="34" description="流程表单部署表">
<sql creator="huwenbin" createDate="20200604" note="流程表单部署表">
CREATE TABLE "AS_PROCESS_DEPLOY_FORM"
(
"ID" NUMBER(9,0) NOT NULL,
"NAME" VARCHAR2(250),
"DEPLOY_USER_ID" NUMBER(9,6),
"SCHE_ID" NUMBER(22,6),
"FORM_CONTENT" CLOB,
"CALLBACK_URL" VARCHAR2(1000),
"PROCESS_ID" NVARCHAR2(64),
"DEPLOY_TIME" DATE,
"ORIGINAL_ID" NUMBER(9,0),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_PROCESS_DEPLOY_FORM" IS '流程表单部署表';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."CALLBACK_URL" IS '回调地址';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."DEPLOY_TIME" IS '部署时间';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."DEPLOY_USER_ID" IS '部署人id';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."FORM_CONTENT" IS '表单内容';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."ID" IS '主键id';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."NAME" IS '表单名称';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."ORIGINAL_ID" IS '源表单id';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."PROCESS_ID" IS '流程id';
CREATE TABLE "AS_PROCESS_DEPLOY_SCHE"
(
"ID" NUMBER(9,0) NOT NULL,
"NAME" VARCHAR2(250),
"FORM_ID" NUMBER(9,0),
"SCHEDULE_CONTENT" CLOB,
"DEPLOY_TIME" DATE,
"ORIGINAL_ID" NUMBER(9,0),
"PROCESS_ID" NVARCHAR2(64),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_PROCESS_DEPLOY_SCHE" IS '流程部署附表';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."DEPLOY_TIME" IS '部署时间';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."FORM_ID" IS '表单id';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."ID" IS '主键';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."NAME" IS '附表名称';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."ORIGINAL_ID" IS '源附表id';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."SCHEDULE_CONTENT" IS '附表内容';
CREATE SEQUENCE "SEQ_AS_PROCESS_DEPLOY_FORM"
INCREMENT BY 1
START WITH 1
MAXVALUE 99999999999
MINVALUE 1
NOCYCLE
NOCACHE
NOORDER
;
CREATE SEQUENCE "SEQ_AS_PROCESS_DEPLOY_SCHE"
INCREMENT BY 1
START WITH 1
MAXVALUE 999999999999
MINVALUE 1
NOCYCLE
NOCACHE
NOORDER
;
</sql>
</version>
<version edition="35" description="修改表单字段表字段类型长度">
<sql creator="huwenbin" createDate="20200605" note="修改表单字段表字段类型长度">
alter table "AS_FORM_COLUMN" modify "ID" NUMBER(22, 0);
alter table "AS_FORM_COLUMN" modify "FORM_TABLE_ID" NUMBER(9, 0);
alter table "AS_FORM_COLUMN" modify "LENGTH" NUMBER(9, 0);
alter table "AS_FORM_COLUMN" modify "IS_HIDE" NUMBER(9, 0);
alter table "AS_FORM_COLUMN" modify "IS_EDIT" NUMBER(9, 0);
</sql>
</version>
<version edition="36" description="修改表字段长度">
<sql creator="huwenbin" createDate="20200608" note="修改表字段长度">
alter table "AS_SCHE_EXT_DATA" modify "SCHE_TABLE_ID" NUMBER(9, 0);
alter table "AS_SCHE_EXT_DATA" modify "SCHE_ID" NUMBER(9, 0);
alter table "AS_PROCESS_FORM" modify "SCHE_ID" NUMBER(9, 0);
alter table "AS_PROCESS_FORM" add primary key("ID");
alter table "AS_PROCESS_TAG" modify "ID" NUMBER(9, 0);
alter table "AS_PROCESS_DEPLOY_FORM" modify "DEPLOY_USER_ID" NUMBER(9, 0);
alter table "AS_PROCESS_DEPLOY_FORM" modify "SCHE_ID" NUMBER(9, 0);
</sql>
</version>
<version edition="37" description="文件批量操作日志表">
<sql creator="liuxiang" createDate="20200609" note="文件批量操作日志表">
CREATE TABLE "AS_FILELOG"
(
"ID" NUMBER(9,0) NOT NULL,
"USER_ID" NUMBER(9,0),
"IP" VARCHAR2(50),
"OPERATION" VARCHAR2(2000),
"STATE" VARCHAR2(1000),
"CREATE_TIME" TIMESTAMP(6),
"END_TIME" TIMESTAMP(6),
"NAME" VARCHAR2(3000),
"FILEPATH" VARCHAR2(3000),
"RESULT" VARCHAR2(3000),
"CODE" VARCHAR2(10),
"DETAIL" VARCHAR2(3000),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "AS_FILELOG"."CODE" IS '代码';
COMMENT ON COLUMN "AS_FILELOG"."CREATE_TIME" IS '创建时间';
COMMENT ON COLUMN "AS_FILELOG"."DETAIL" IS '详情';
COMMENT ON COLUMN "AS_FILELOG"."END_TIME" IS '结束时间';
COMMENT ON COLUMN "AS_FILELOG"."FILEPATH" IS '原始文件';
COMMENT ON COLUMN "AS_FILELOG"."ID" IS '主键';
COMMENT ON COLUMN "AS_FILELOG"."IP" IS 'ip地址';
COMMENT ON COLUMN "AS_FILELOG"."NAME" IS '任务标识';
COMMENT ON COLUMN "AS_FILELOG"."OPERATION" IS '操作';
COMMENT ON COLUMN "AS_FILELOG"."RESULT" IS '结果';
COMMENT ON COLUMN "AS_FILELOG"."STATE" IS '状态';
COMMENT ON COLUMN "AS_FILELOG"."USER_ID" IS '用户名,关联AS_USER表的USERNAME';
CREATE SEQUENCE "ARCHSER_YZ"."SEQ_FILELOG"
INCREMENT BY 1
START WITH 1
MAXVALUE 999999999999
MINVALUE 1
NOCYCLE
CACHE 20
NOORDER
;
</sql>
</version>
<version edition="38" description="生成档案分类管理表">
<sql creator="lidecai" createDate="20200612" note="生成档案分类管理表">
CREATE TABLE "AS_TREECLASSFIC"
(
"ID" NUMBER(22,0) NOT NULL,
"PID" NUMBER(22,0),
"NAME" VARCHAR2(80),
"DESCRIBE" VARCHAR2(100),
"LIBID" NUMBER(22,0),
"CONDITION" VARCHAR2(500),
"SQLCOND" VARCHAR2(500),
"BUSINESSID" VARCHAR2(50),
CLUSTER PRIMARY KEY("ID"),
UNIQUE("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_TREECLASSFIC" IS '档案分类管理自定义';
COMMENT ON COLUMN "AS_TREECLASSFIC"."BUSINESSID" IS '业务类型(1文件接收;2档案著录)';
COMMENT ON COLUMN "AS_TREECLASSFIC"."CONDITION" IS '数据筛选条件';
COMMENT ON COLUMN "AS_TREECLASSFIC"."DESCRIBE" IS '描述';
COMMENT ON COLUMN "AS_TREECLASSFIC"."LIBID" IS '关联档案类型id';
COMMENT ON COLUMN "AS_TREECLASSFIC"."NAME" IS '节点名称';
COMMENT ON COLUMN "AS_TREECLASSFIC"."PID" IS '父节点id';
COMMENT ON COLUMN "AS_TREECLASSFIC"."SQLCOND" IS 'sql拼装条件';
</sql>
<sql creator="lidecai" createDate="20200612" note="创建序列">
CREATE SEQUENCE "SEQ_AS_TREECLASSFIC" INCREMENT BY 1 START WITH 1 MAXVALUE 9223372036854775807 MINVALUE 1;
</sql>
</version>
<version edition="39" description="修改AS_LIBRARY字段长度">
<sql creator="lidecai" createDate="20200629" note="修改AS_LIBRARY种的字段长度">
alter table AS_LIBRARY modify(NAME_COLLECTION VARCHAR2(255))
</sql>
</version>
<version edition="40" description="视频转换后的uuid名称表">
<sql creator="yangrifei" createDate="20200629" note="视频转换后的uuid名称表">
CREATE TABLE "AS_VIDEO_TRANSITION"
(
"ID" INT NOT NULL,
"VIDEO_KEY" VARCHAR(50),
"VIDEO_VALUE" VARCHAR(50),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "ARCHSER_YZ"."AS_VIDEO_TRANSITION" IS '视频播放uuid';
</sql>
</version>
<version edition="41" description="档案分类管理表">
<sql creator="liukexin" createDate="20200628" note="档案分类管理表">
alter table "AS_TREECLASSFIC" add IDSEQ VARCHAR2(500);
</sql>
</version>
<version edition="42" description="盘点">
<sql creator="zhanglongfa" createDate="20200701" note="盘点">
alter table AS_CHECK_RECORD_RESULT add(DATASIGN1 VARCHAR2(200));
</sql>
</version>
<version edition="43" description="档案分类排序">
<sql creator="xiaoying" createDate="20200703" note="档案分类排序">
alter table AS_TREECLASSFIC add(SERIALINDEX VARCHAR2(500));
</sql>
</version>
<version edition="44" description="添加全宗信息表">
<sql creator="yangchengwu" createDate="20200715" note="全宗信息表">
CREATE TABLE "ARCHSER_YZ"."AS_FOND"
(
"ID" NUMBER NOT NULL,
"FOND_ID" VARCHAR2(40),
"NAME" VARCHAR2(40),
"DESCRIPTION" VARCHAR2(255),
"ORGAN_ID" VARCHAR2(40),
"CREATE_TIME" TIMESTAMP(6),
"REMARK" VARCHAR2(255),
"IDSEQ" VARCHAR2(500),
CONSTRAINT "SYS_C0090555" NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "ARCHSER_YZ"."AS_FOND"."CREATE_TIME" IS '创建时间';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_FOND"."DESCRIPTION" IS '全宗描述';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_FOND"."FOND_ID" IS '全宗id';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_FOND"."NAME" IS '全宗名称';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_FOND"."ORGAN_ID" IS '关联机构';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_FOND"."REMARK" IS '备注';
</sql>
</version>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE update SYSTEM "DBUpdate_dtd.dtd">
<update dataType="DM" description="达梦数据库升级SQL语句">
<version edition="1" description="更新错误登陆次数为0">
<sql creator="chenyong" createDate="20200114" note="更新错误登陆次数为0">
UPDATE AS_USER
SET ERRORCOUNT=0
</sql>
</version>
<version edition="2" description="添加url长度">
<sql creator="cyq" createDate="20200211" note="添加url长度">
alter table AS_LOG
modify (URL varchar2(1000))
</sql>
</version>
<version edition="3" description="创建流程服务的表单表">
<sql creator="huwenbin" createDate="20200212" note="创建流程服务的表单表">
CREATE TABLE
"AS_PROCESS_FORM"
(
"ID" NUMBER(9,0) NOT NULL,
"CREATER" NUMBER(22,6),
"CREATE_TIME" TIMESTAMP(6),
"DESCRIPTION" VARCHAR2(250),
"NAME"
VARCHAR(250),
"PROCESS_ID" VARCHAR2(64),
"ISSUE" VARCHAR2(10),
"FORM_CONTENT" VARCHAR2(4000),
"SCHEDULE_CONTENT" VARCHAR2(4000),
NOT
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON
TABLE "AS_PROCESS_FORM" IS '流程服务的表单表';
COMMENT ON COLUMN
"AS_PROCESS_FORM"."CREATER" IS '创建人id';
COMMENT ON COLUMN
"AS_PROCESS_FORM"."CREATE_TIME" IS
'创建时间';
COMMENT ON
COLUMN "AS_PROCESS_FORM"."DESCRIPTION" IS '表单描述';
COMMENT ON COLUMN "AS_PROCESS_FORM"."FORM_CONTENT" IS
'表单数据JSON';
COMMENT ON COLUMN "AS_PROCESS_FORM"."ID" IS
'主键';
COMMENT ON COLUMN "AS_PROCESS_FORM"."ISSUE" IS
'是否发布:0:否,1:是';
COMMENT ON COLUMN
"AS_PROCESS_FORM"."NAME" IS '表单名称';
COMMENT ON COLUMN
"AS_PROCESS_FORM"."PROCESS_ID" IS
'流程关联id';
COMMENT ON
COLUMN "AS_PROCESS_FORM"."SCHEDULE_CONTENT" IS
'附表数据JSON';
</sql>
</version>
<version edition="4" description="创建流程服务和角色关联的表">
<sql creator="huwenbin" createDate="20200212" note="创建流程服务和角色关联的表">
CREATE TABLE
"AS_ROLE_FORM"
(
"ID" NUMBER(9,6) NOT NULL,
"ROLE_ID" NUMBER(20,6),
"FORM_ID" NUMBER(20,6),
CLUSTER PRIMARY KEY("ID"),
UNIQUE("ID"))
STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE
"AS_ROLE_FORM" IS '流程管理角色和表单关联';
COMMENT ON COLUMN
"AS_ROLE_FORM"."FORM_ID" IS '表单id';
COMMENT ON COLUMN
"AS_ROLE_FORM"."ID" IS '主键id';
COMMENT ON COLUMN
"AS_ROLE_FORM"."ROLE_ID" IS '角色id';
</sql>
</version>
<version edition="5" description="创建流程模型和流程部署关联表">
<sql creator="huwenbin" createDate="20200312" note="创建流程模型和流程部署关联表">
create table AS_MODEL_DEPLOYMENT
(
ID INTEGER not null,
DEPLOYMENT_ID VARCHAR2(64),
MODEL_ID VARCHAR2(50)
);
comment on table
AS_MODEL_DEPLOYMENT is '流程图与流程部署表的关联表';
create unique index
INDEX33558234
on AS_MODEL_DEPLOYMENT (ID);
alter table
AS_MODEL_DEPLOYMENT
add constraint CONS134220130
primary key (ID);
CREATE SEQUENCE "SEQ_AS_MODEL_DEPLOYMENT" INCREMENT BY 1 START WITH 1
MAXVALUE 99999999999999 MINVALUE 1 CACHE 20;
CREATE SEQUENCE
"SEQ_AS_ROLE_FORM" INCREMENT BY 1 START WITH 1 MAXVALUE
9999999999999999 MINVALUE 1 CACHE 20;
CREATE SEQUENCE
"SEQ_AS_PROCESS_FORM" INCREMENT BY 1 START WITH 1 MAXVALUE
9999999999999999 MINVALUE 1 CACHE 20;
</sql>
</version>
<version edition="6" description="YZJ-1781 代码规则表">
<sql creator="lidecai" createDate="20200320" note="创建代码规则表">
CREATE TABLE
AS_CODEVALUE"
(
"ID" INTEGER NOT NULL,
"TABLE_ID" INTEGER,
"COLUMN_ID"
INTEGER,
"KEY" VARCHAR2(50),
"VALUE" VARCHAR2(50),
"IDSEQ" VARCHAR2(50),
"COLUMN_NAME" VARCHAR2(50),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON
"MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "AS_CODEVALUE"."COLUMN_ID" IS
'字段ID';
COMMENT ON COLUMN "AS_CODEVALUE"."IDSEQ" IS '全宗代码';
COMMENT ON
COLUMN "AS_CODEVALUE"."KEY" IS '代码';
COMMENT ON COLUMN
"AS_CODEVALUE"."TABLE_ID" IS '表ID';
COMMENT ON COLUMN
"AS_CODEVALUE"."VALUE" IS '值';
</sql>
<sql creator="lidecai" createDate="20200320" note="创建代码规则表的序列">
CREATE SEQUENCE
"SEQ_AS_CODEVALUE" INCREMENT BY 1 START WITH 1
MAXVALUE
9999999999 MINVALUE 1 CACHE 20;
</sql>
</version>
<version edition="7" description="报表与档案关联表添加全宗">
<sql creator="yangchegnwu" createDate="20200323" note="报表与档案关联表添加全宗">
alter table AS_REPORT_TABLE add "IDSEQ" VARCHAR2(50);
</sql>
<sql creator="ChengYaqing" createDate="20200327" note="主动接口任务表添加字段">
alter table AS_TASK add ("IDSEQ" VARCHAR2(255),"CREATOR"
VARCHAR2(50));
</sql>
<sql creator="ChengYaqing" createDate="20200327" note="主动接口配置表添加字段">
alter table AS_TASK_DBCONFIG add ("AJCONDITION"
VARCHAR2(500),"JNCONDITION" VARCHAR2(500));
</sql>
<sql creator="ChengYaqing" createDate="20200416" note="统计归档元数据统计">
CREATE TABLE
AS_FILING_METADATA_STATISTICS
(
"ID" NUMBER(9,0) NOT NULL,
"LIBRARY"
VARCHAR2(255),
"DATE" TIMESTAMP(6),
"PATH" VARCHAR2(255),
"DATACOUNT"
NUMBER(9,0),
"FILECOUNT" NUMBER(9,0),
CLUSTER PRIMARY
KEY("ID"))
STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN
"AS_FILING_METADATA_STATISTICS"."DATACOUNT"
IS '数据的数量';
COMMENT ON COLUMN
"AS_FILING_METADATA_STATISTICS"."DATE"
IS '时间';
COMMENT
ON COLUMN
"AS_FILING_METADATA_STATISTICS"."FILECOUNT" IS
'文件数量';
COMMENT ON COLUMN
"AS_FILING_METADATA_STATISTICS"."LIBRARY" IS '档案类型';
COMMENT ON COLUMN "AS_FILING_METADATA_STATISTICS"."PATH"
IS '下载文件路径';
</sql>
</version>
<version edition="8" description="库房字段类型修改">
<sql creator="lidecai" createDate="20200331" note="修改字段名称">
alter table
AS_ACCESS_MOVE rename column COUNT TO COUNT_COPY;
</sql>
<sql creator="lidecai" createDate="20200331" note="增加一个和原字段名同名的字段">
alter table
AS_ACCESS_MOVE add COUNT NUMBER(10);
</sql>
<sql creator="lidecai" createDate="20200331" note="将原字段 COUNT_COPY 数据更新到增加的字段 COUNT ">
update AS_ACCESS_MOVE set COUNT= trim (COUNT_COPY)
</sql>
<sql creator="lidecai" createDate="20200331" note="更新完,删除临时字段">
alter table
AS_ACCESS_MOVE drop column COUNT_COPY;
</sql>
</version>
<version edition="9" description="盘点记录">
<sql creator="lidecai" createDate="20200423" note="创建记录表">
CREATE TABLE
"AS_CHECK_RECORD"
(
"ID" INTEGER NOT NULL,
"CHECK_NAME"
VARCHAR2(50),
"CREATE_TIME" TIMESTAMP(6),
"CHECK_TIME" VARCHAR2(50),
"USER_NAME" VARCHAR2(50),
"CHECK_STATUS" VARCHAR2(50),
CLUSTER PRIMARY
KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN
"AS_CHECK_RECORD"."CHECK_NAME" IS '盘点名称';
COMMENT ON
COLUMN "AS_CHECK_RECORD"."CHECK_STATUS" IS
'盘点状态';
COMMENT ON COLUMN "AS_CHECK_RECORD"."CHECK_TIME" IS
'盘点时间';
COMMENT ON COLUMN "AS_CHECK_RECORD"."CREATE_TIME"
IS
'创建时间';
COMMENT ON COLUMN "AS_CHECK_RECORD"."USER_NAME"
IS '创建者名称';
</sql>
<sql creator="lidecai" createDate="20200423" note="创建序列">
CREATE SEQUENCE
"SEQ_AS_CHECK_RECORD" INCREMENT BY 1 START WITH 1
MAXVALUE 9999999999 MINVALUE 1 CACHE 20;
</sql>
</version>
<version edition="10" description="盘点记录详情">
<sql creator="lidecai" createDate="20200423" note="创建记录表">
CREATE TABLE
"AS_CHECK_RECORD_RESULT"
(
"ID" CHAR(10) NOT NULL,
"TABLE_ID" INTEGER,
"EPC" VARCHAR2(50),
"RECORD_ID" INTEGER,
"LIB_ID"
INTEGER,
"DATA_ID" INTEGER,
CLUSTER PRIMARY KEY("ID")) STORAGE(ON
"MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN
"AS_CHECK_RECORD_RESULT"."DATA_ID" IS
'档案条目ID';
COMMENT ON
COLUMN "AS_CHECK_RECORD_RESULT"."EPC" IS '档案唯一标识
RFID';
COMMENT ON COLUMN "AS_CHECK_RECORD_RESULT"."ID" IS '主键';
COMMENT ON COLUMN "AS_CHECK_RECORD_RESULT"."LIB_ID" IS
'档案类别ID';
COMMENT ON COLUMN
"AS_CHECK_RECORD_RESULT"."RECORD_ID" IS
'盘点记录ID';
COMMENT
ON COLUMN "AS_CHECK_RECORD_RESULT"."TABLE_ID" IS '表ID';
</sql>
<sql creator="lidecai" createDate="20200423" note="创建序列">
CREATE SEQUENCE
"SEQ_AS_CHECK_RECORD_RUEULT" INCREMENT BY 1 START WITH 1
MAXVALUE 999999999 MINVALUE 1 CACHE 20;
</sql>
</version>
<version edition="11" description="库房中间表">
<sql creator="lidecai" createDate="20200423" note="创建中间表">
CREATE TABLE
"AS_EPC_DATA"
(
"ID" INTEGER NOT NULL,
"EPC" VARCHAR2(50)
NOT NULL,
"LIB_ID" INTEGER,
"TABLE_ID" INTEGER,
"DATA_ID" VARCHAR2(50),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE
INDEX "AS_EPC_DATA_INDEX" ON "AS_EPC_DATA"("EPC" ASC)
STORAGE(ON "MAIN", CLUSTERBTR) ;
</sql>
<sql creator="lidecai" createDate="20200331" note="创建序列">
CREATE SEQUENCE
"SEQ_AS_EPC_DATA" INCREMENT BY 1 START WITH 1 MAXVALUE
999999999 MINVALUE 1 CACHE 20;
</sql>
</version>
<version edition="12" description="库房中间表">
<sql creator="lidecai" createDate="20200426" note="添加EPC字段">
ALTER TABLE As_Borrow_Data add EPC VARCHAR2(20);
</sql>
</version>
<version edition="13" description="流程附表拓展字段表">
<sql creator="huwenbin" createDate="20200428" note="流程附表拓展字段表">
CREATE TABLE "AS_SCHE_EXT_DATA"
(
"ID" NUMBER(9,0) NOT NULL,
"ORIGINAL_DATA" CLOB,
"SCHE_ID" NUMBER(9,0),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_SCHE_EXT_DATA" IS '附表的拓展数据表';
COMMENT ON COLUMN "AS_SCHE_EXT_DATA"."ORIGINAL_DATA" IS '附表源数据';
COMMENT ON COLUMN "AS_SCHE_EXT_DATA"."SCHE_ID" IS '附表id';
CREATE SEQUENCE "SEQ_AS_SCHE_EXT_DATA" INCREMENT BY 1 START WITH 1 MAXVALUE 999999999999999 MINVALUE 1;
</sql>
</version>
<version edition="14" description="流程申请表">
<sql creator="huwenbin" createDate="20200428" note="流程申请表">
CREATE TABLE "AS_APPLY_BORROW"
(
"ID" NUMBER(22,6) NOT NULL,
"PROCESS_INST_ID" VARCHAR2(64),
"START_USER_ID" NUMBER(9,0),
"START_TIME" TIMESTAMP(6),
"END_TIME" TIMESTAMP(6),
"APPLY_STATUS" NUMBER(1,0),
"PROCESS_NAME" VARCHAR2(50),
"TEMPORARY_ID" NUMBER(9,0),
"PROCESS_DEF_ID" VARCHAR2(64),
"TEMPORARY_TIME" TIMESTAMP(6),
"SYSTEM_ID" NUMBER(9,0),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_APPLY_BORROW" IS '档案申请借阅表';
COMMENT ON COLUMN "AS_APPLY_BORROW"."APPLY_STATUS" IS '申请状态';
COMMENT ON COLUMN "AS_APPLY_BORROW"."END_TIME" IS '结束时间';
COMMENT ON COLUMN "AS_APPLY_BORROW"."ID" IS '主键id';
COMMENT ON COLUMN "AS_APPLY_BORROW"."PROCESS_DEF_ID" IS '流程定义id';
COMMENT ON COLUMN "AS_APPLY_BORROW"."PROCESS_INST_ID" IS '流程实例id';
COMMENT ON COLUMN "AS_APPLY_BORROW"."PROCESS_NAME" IS '流程实例名称';
COMMENT ON COLUMN "AS_APPLY_BORROW"."START_TIME" IS '申请时间';
COMMENT ON COLUMN "AS_APPLY_BORROW"."START_USER_ID" IS '申请人';
COMMENT ON COLUMN "AS_APPLY_BORROW"."SYSTEM_ID" IS '系统id';
COMMENT ON COLUMN "AS_APPLY_BORROW"."TEMPORARY_ID" IS '暂存id';
</sql>
</version>
<version edition="15" description="流程附表拓展字段表">
<sql creator="huwenbin" createDate="20200428" note="流程附表拓展字段表增加字段">
alter table "AS_SCHE_EXT_DATA" add column("SCHE_TABLE_ID" NUMBER(9, 6));
comment on column "AS_SCHE_EXT_DATA"."SCHE_TABLE_ID" is '附表设计表id';
</sql>
</version>
<version edition="16" description="流程模型表单增加字段">
<sql creator="huwenbin" createDate="20200519" note="流程模型表单增加字段">
alter table "AS_MODEL_DEPLOYMENT" add column("FORM_ID" NUMBER(9, 0));
alter table "AS_MODEL_DEPLOYMENT" add column("TAG_ID" NUMBER(9, 0));
alter table "AS_MODEL_DEPLOYMENT" add column("TAG_NAME" VARCHAR2(50));
</sql>
</version>
<version edition="17" description="归档元数据统计表">
<sql creator="huwenbin" createDate="20200519" note="归档元数据统计表">
CREATE TABLE "AS_FILING_METADATA_STATISTICS"
(
"ID" NUMBER(9,0) NOT NULL,
"LIBRARY" VARCHAR2(255),
"DATE" TIMESTAMP(6),
"PATH" VARCHAR2(255),
"DATACOUNT" NUMBER(9,0),
"FILECOUNT" NUMBER(9,0),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "AS_FILING_METADATA_STATISTICS"."DATACOUNT" IS '数据的数量';
COMMENT ON COLUMN "AS_FILING_METADATA_STATISTICS"."DATE" IS '时间';
COMMENT ON COLUMN "AS_FILING_METADATA_STATISTICS"."FILECOUNT" IS '文件数量';
COMMENT ON COLUMN "AS_FILING_METADATA_STATISTICS"."LIBRARY" IS '档案类型';
COMMENT ON COLUMN "AS_FILING_METADATA_STATISTICS"."PATH" IS '下载文件路径';
</sql>
</version>
<version edition="18" description="流程标签表">
<sql creator="huwenbin" createDate="20200519" note="流程标签表">
CREATE TABLE "AS_PROCESS_TAG"
(
"ID" NUMBER(9,6) NOT NULL,
"NAME" VARCHAR2(50),
"PROCESS_MODEL_ID" VARCHAR2(150),
"DATA_TYPE" NUMBER(22,6),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_PROCESS_TAG" IS '流程标签表';
COMMENT ON COLUMN "AS_PROCESS_TAG"."DATA_TYPE" IS '1-内置的标签';
COMMENT ON COLUMN "AS_PROCESS_TAG"."NAME" IS '标签名';
COMMENT ON COLUMN "AS_PROCESS_TAG"."PROCESS_MODEL_ID" IS '流程模型表id';
</sql>
</version>
<version edition="19" description="流程申请表">
<sql creator="huwenbin" createDate="20200519" note="流程申请表">
CREATE TABLE "AS_APPLY_PROCESS"
(
"ID" NUMBER(9,0) NOT NULL,
"PROC_INST_ID" VARCHAR(64),
"TABLE_ID" NUMBER(9,0),
"DATA_ID" NUMBER(9,0),
"TITLE" VARCHAR(64),
"VIEW_PERMISSION_START_TIME" TIMESTAMP(6),
"VIEW_PERMISSION_END_TIME" TIMESTAMP(6),
"ENTITY_START_TIME" TIMESTAMP(6),
"ENTITY_END_TIME" TIMESTAMP(6),
"ENTITY_BACK_TIME" TIMESTAMP(6),
"IS_VIEW" NUMBER(22,6),
"IS_DOWN" NUMBER(22,6),
"START_USER_ID" NUMBER(9,0),
"DOWN_PERMISSION_START_TIME" TIMESTAMP(6),
"DOWN_PERMISSION_END_TIME" TIMESTAMP(6),
"PRINT_PERMISSION_START_TIME" TIMESTAMP(6),
"PRINT_PERMISSION_END_TIME" TIMESTAMP(6),
"VIEW_DAYS" NUMBER(3,0),
"DOWN_DAYS" NUMBER(3,0),
"PRINT_DAYS" NUMBER(3,0),
"IS_PRINT" NUMBER(3,0),
"APPLY_ID" NUMBER(9,0),
"ENTITY_BORROW_DAYS" NUMBER(9,6),
"BORROW_WAY" NUMBER(1,0),
"PROC_SCHE_ID" NUMBER(9,0),
CONSTRAINT "AS_APPLY_PROCEESS_PK" CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "AS_APPLY_PROCESS"."BORROW_WAY" IS '借阅方式:1-实体,2-电子';
COMMENT ON COLUMN "AS_APPLY_PROCESS"."IS_DOWN" IS '1-可以下载,0-不能下载';
COMMENT ON COLUMN "AS_APPLY_PROCESS"."IS_VIEW" IS '1-可以预览,0-不可以预览';
COMMENT ON COLUMN "AS_APPLY_PROCESS"."PROC_SCHE_ID" IS '1';
</sql>
</version>
<version edition="20" description="普服快递办件接收表">
<sql creator="huwenbin" createDate="20200519" note="普服快递办件接收表">
CREATE TABLE "AS_FILING_ACCEPT"
(
"ID" VARCHAR2(50) NOT NULL,
"PROJECTNO" VARCHAR2(50),
"TASKNAME" VARCHAR2(255),
"FILINGSTATUS" VARCHAR2(50),
"TABLEAJID" VARCHAR2(50),
"TABLEJNID" VARCHAR2(50),
"ORGCODE" VARCHAR2(50),
"ADDRES S" VARCHAR2(1000),
"PROJECTNAME" VARCHAR2(255),
"SYSTEMNAME" VARCHAR2(50),
"OPERATE" VARCHAR2(50),
"APPLYERPAGECODE" VARCHAR2(50),
"APPLYERNAME" VARCHAR2(50),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
</sql>
</version>
<version edition="21" description="普服快递许可办件材料表">
<sql creator="huwenbin" createDate="20200519" note="普服快递许可办件材料表">
CREATE TABLE "AS_FILING_MATERIAL"
(
"ID" VARCHAR2(50) NOT NULL,
"ROWGUID" VARCHAR2(50),
"PROJECTNO" VARCHAR2(50),
"GETTYPE" VARCHAR2(2),
"MATERIALATTACHNAME" VARCHAR2(200),
"MATERIALNAME" VARCHAR2(200),
"CD_OPERATION" VARCHAR2(2),
"CD_BATCH" VARCHAR2(32),
"DATASOURCE" VARCHAR2(3),
"CD_TIME" DATETIME(6),
"REMARK" VARCHAR2(1000),
"GETNUM" VARCHAR2(5),
"SOURCE_ID" VARCHAR2(50),
"FILINGSTATUS" VARCHAR2(50),
"OPERATE" VARCHAR2(50),
"SYSTEMNAME" VARCHAR2(50),
"URL" VARCHAR2(1000),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
</sql>
</version>
<version edition="22" description="普服快递许可办件结果表">
<sql creator="huwenbin" createDate="20200519" note="普服快递许可办件结果表">
CREATE TABLE "AS_FILING_RESULT"
(
"ID" VARCHAR2(255) NOT NULL,
"PROJECTNO" VARCHAR2(50),
"HANDLEUSERNAME" VARCHAR2(100),
"RESULTDATE" DATETIME(6),
"RESULTEXPLAIN" VARCHAR2(2000),
"ISDELIVERYRESULTS" VARCHAR2(2),
"RESULTTYPE" VARCHAR2(2),
"RESULTCETRNAME" VARCHAR2(2000),
"RESULTCETRNO" VARCHAR2(2000),
"SATISFACTION" VARCHAR2(2),
"FILINGSTATUS" VARCHAR2(50),
"TABLEAJID" VARCHAR2(50),
"TABLEJNID" VARCHAR2(50),
"OPERATE" VARCHAR2(50),
"SYSTEMNAME" VARCHAR2(50),
"REMARK" VARCHAR2(50),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
</sql>
</version>
<version edition="23" description="代码值表">
<sql creator="liuyimeng" createDate="20200602" note="代码值表">
CREATE TABLE "AS_CODEVALUE"
(
"ID" INTEGER NOT NULL,
"TABLE_ID" INTEGER,
"COLUMN_ID" INTEGER,
"KEY" VARCHAR2(50),
"VALUE" VARCHAR2(50),
"IDSEQ" VARCHAR2(50),
"COLUMN_NAME" VARCHAR2(50),
CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "AS_CODEVALUE"."COLUMN_ID" IS '字段ID';
COMMENT ON COLUMN "AS_CODEVALUE"."IDSEQ" IS '全宗代码';
COMMENT ON COLUMN "AS_CODEVALUE"."KEY" IS '代码';
COMMENT ON COLUMN "AS_CODEVALUE"."TABLE_ID" IS '表ID';
COMMENT ON COLUMN "AS_CODEVALUE"."VALUE" IS '值';
</sql>
</version>
<version edition="24" description="四性检测表">
<sql creator="liuyimeng" createDate="20200602" note="四性检测表">
alter table
AS_FOURTEST
add
CONDITION_DES
VARCHAR2(500);
</sql>
</version>
<version edition="25" description="表单列表">
<sql creator="liuyimeng" createDate="20200602" note="表单列表">
alter table
AS_FORM_COLUMN
add
IS_HIDE
VARCHAR2(500);
</sql>
</version>
<version edition="26" description="表单列表">
<sql creator="liuyimeng" createDate="20200602" note="表单列表">
alter table
AS_FORM_COLUMN
add
ID_EDIT
VARCHAR2(500);
</sql>
</version>
<version edition="27" description="库房表">
<sql creator="liuyimeng" createDate="20200602" note="库房表">
alter table
AS_STORAGE
add
IDSEQ
VARCHAR2(500);
</sql>
</version>
<version edition="28" description="库房表">
<sql creator="liuyimeng" createDate="20200602" note="库房表">
alter table
AS_STORAGE
add
ORGAN_ID
VARCHAR2(500);
</sql>
</version>
<version edition="29" description="日常管理表">
<sql creator="liuyimeng" createDate="20200602" note="日常管理表">
alter table
AS_DAILY
add
STORAGE_ID
VARCHAR2(500);
</sql>
</version>
<version edition="30" description="入库表">
<sql creator="liuyimeng" createDate="20200602" note="普服快递许可办件结果表">
alter table
AS_ACCESS_INTO
add
ORGAN_ID
VARCHAR2(500);
</sql>
</version>
<version edition="31" description="移库表">
<sql creator="liuyimeng" createDate="20200602" note="移库表">
alter table
AS_ACCESS_MOVE
add
ORGAN_ID
VARCHAR2(500);
</sql>
</version>
<version edition="32" description="出库表">
<sql creator="liuyimeng" createDate="20200602" note="出库表">
alter table
AS_ACCESS_OUT
add
ORGAN_ID
VARCHAR2(500);
</sql>
</version>
<version edition="33" description="出库表">
<sql creator="liuyimeng" createDate="20200602" note="出库表">
alter table
AS_ACCESS_OUT
add
MOBILEPHONE
VARCHAR2(500);
</sql>
</version>
<version edition="34" description="流程表单部署表">
<sql creator="huwenbin" createDate="20200604" note="流程表单部署表">
CREATE TABLE "AS_PROCESS_DEPLOY_FORM"
(
"ID" NUMBER(9,0) NOT NULL,
"NAME" VARCHAR2(250),
"DEPLOY_USER_ID" NUMBER(9,6),
"SCHE_ID" NUMBER(22,6),
"FORM_CONTENT" CLOB,
"CALLBACK_URL" VARCHAR2(1000),
"PROCESS_ID" NVARCHAR2(64),
"DEPLOY_TIME" DATE,
"ORIGINAL_ID" NUMBER(9,0),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_PROCESS_DEPLOY_FORM" IS '流程表单部署表';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."CALLBACK_URL" IS '回调地址';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."DEPLOY_TIME" IS '部署时间';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."DEPLOY_USER_ID" IS '部署人id';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."FORM_CONTENT" IS '表单内容';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."ID" IS '主键id';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."NAME" IS '表单名称';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."ORIGINAL_ID" IS '源表单id';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_FORM"."PROCESS_ID" IS '流程id';
CREATE TABLE "AS_PROCESS_DEPLOY_SCHE"
(
"ID" NUMBER(9,0) NOT NULL,
"NAME" VARCHAR2(250),
"FORM_ID" NUMBER(9,0),
"SCHEDULE_CONTENT" CLOB,
"DEPLOY_TIME" DATE,
"ORIGINAL_ID" NUMBER(9,0),
"PROCESS_ID" NVARCHAR2(64),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_PROCESS_DEPLOY_SCHE" IS '流程部署附表';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."DEPLOY_TIME" IS '部署时间';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."FORM_ID" IS '表单id';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."ID" IS '主键';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."NAME" IS '附表名称';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."ORIGINAL_ID" IS '源附表id';
COMMENT ON COLUMN "AS_PROCESS_DEPLOY_SCHE"."SCHEDULE_CONTENT" IS '附表内容';
CREATE SEQUENCE "SEQ_AS_PROCESS_DEPLOY_FORM"
INCREMENT BY 1
START WITH 1
MAXVALUE 99999999999
MINVALUE 1
NOCYCLE
NOCACHE
NOORDER
;
CREATE SEQUENCE "SEQ_AS_PROCESS_DEPLOY_SCHE"
INCREMENT BY 1
START WITH 1
MAXVALUE 999999999999
MINVALUE 1
NOCYCLE
NOCACHE
NOORDER
;
</sql>
</version>
<version edition="35" description="修改表单字段表字段类型长度">
<sql creator="huwenbin" createDate="20200605" note="修改表单字段表字段类型长度">
alter table "AS_FORM_COLUMN" modify "ID" NUMBER(22, 0);
alter table "AS_FORM_COLUMN" modify "FORM_TABLE_ID" NUMBER(9, 0);
alter table "AS_FORM_COLUMN" modify "LENGTH" NUMBER(9, 0);
alter table "AS_FORM_COLUMN" modify "IS_HIDE" NUMBER(9, 0);
alter table "AS_FORM_COLUMN" modify "IS_EDIT" NUMBER(9, 0);
</sql>
</version>
<version edition="36" description="修改表字段长度">
<sql creator="huwenbin" createDate="20200608" note="修改表字段长度">
alter table "AS_SCHE_EXT_DATA" modify "SCHE_TABLE_ID" NUMBER(9, 0);
alter table "AS_SCHE_EXT_DATA" modify "SCHE_ID" NUMBER(9, 0);
alter table "AS_PROCESS_FORM" modify "SCHE_ID" NUMBER(9, 0);
alter table "AS_PROCESS_FORM" add primary key("ID");
alter table "AS_PROCESS_TAG" modify "ID" NUMBER(9, 0);
alter table "AS_PROCESS_DEPLOY_FORM" modify "DEPLOY_USER_ID" NUMBER(9, 0);
alter table "AS_PROCESS_DEPLOY_FORM" modify "SCHE_ID" NUMBER(9, 0);
</sql>
</version>
<version edition="37" description="文件批量操作日志表">
<sql creator="liuxiang" createDate="20200609" note="文件批量操作日志表">
CREATE TABLE "AS_FILELOG"
(
"ID" NUMBER(9,0) NOT NULL,
"USER_ID" NUMBER(9,0),
"IP" VARCHAR2(50),
"OPERATION" VARCHAR2(2000),
"STATE" VARCHAR2(1000),
"CREATE_TIME" TIMESTAMP(6),
"END_TIME" TIMESTAMP(6),
"NAME" VARCHAR2(3000),
"FILEPATH" VARCHAR2(3000),
"RESULT" VARCHAR2(3000),
"CODE" VARCHAR2(10),
"DETAIL" VARCHAR2(3000),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "AS_FILELOG"."CODE" IS '代码';
COMMENT ON COLUMN "AS_FILELOG"."CREATE_TIME" IS '创建时间';
COMMENT ON COLUMN "AS_FILELOG"."DETAIL" IS '详情';
COMMENT ON COLUMN "AS_FILELOG"."END_TIME" IS '结束时间';
COMMENT ON COLUMN "AS_FILELOG"."FILEPATH" IS '原始文件';
COMMENT ON COLUMN "AS_FILELOG"."ID" IS '主键';
COMMENT ON COLUMN "AS_FILELOG"."IP" IS 'ip地址';
COMMENT ON COLUMN "AS_FILELOG"."NAME" IS '任务标识';
COMMENT ON COLUMN "AS_FILELOG"."OPERATION" IS '操作';
COMMENT ON COLUMN "AS_FILELOG"."RESULT" IS '结果';
COMMENT ON COLUMN "AS_FILELOG"."STATE" IS '状态';
COMMENT ON COLUMN "AS_FILELOG"."USER_ID" IS '用户名,关联AS_USER表的USERNAME';
CREATE SEQUENCE "ARCHSER_YZ"."SEQ_FILELOG"
INCREMENT BY 1
START WITH 1
MAXVALUE 999999999999
MINVALUE 1
NOCYCLE
CACHE 20
NOORDER
;
</sql>
</version>
<version edition="38" description="生成档案分类管理表">
<sql creator="lidecai" createDate="20200612" note="生成档案分类管理表">
CREATE TABLE "AS_TREECLASSFIC"
(
"ID" NUMBER(22,0) NOT NULL,
"PID" NUMBER(22,0),
"NAME" VARCHAR2(80),
"DESCRIBE" VARCHAR2(100),
"LIBID" NUMBER(22,0),
"CONDITION" VARCHAR2(500),
"SQLCOND" VARCHAR2(500),
"BUSINESSID" VARCHAR2(50),
CLUSTER PRIMARY KEY("ID"),
UNIQUE("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "AS_TREECLASSFIC" IS '档案分类管理自定义';
COMMENT ON COLUMN "AS_TREECLASSFIC"."BUSINESSID" IS '业务类型(1文件接收;2档案著录)';
COMMENT ON COLUMN "AS_TREECLASSFIC"."CONDITION" IS '数据筛选条件';
COMMENT ON COLUMN "AS_TREECLASSFIC"."DESCRIBE" IS '描述';
COMMENT ON COLUMN "AS_TREECLASSFIC"."LIBID" IS '关联档案类型id';
COMMENT ON COLUMN "AS_TREECLASSFIC"."NAME" IS '节点名称';
COMMENT ON COLUMN "AS_TREECLASSFIC"."PID" IS '父节点id';
COMMENT ON COLUMN "AS_TREECLASSFIC"."SQLCOND" IS 'sql拼装条件';
</sql>
<sql creator="lidecai" createDate="20200612" note="创建序列">
CREATE SEQUENCE "SEQ_AS_TREECLASSFIC" INCREMENT BY 1 START WITH 1 MAXVALUE 9223372036854775807 MINVALUE 1;
</sql>
</version>
<version edition="39" description="修改AS_LIBRARY字段长度">
<sql creator="lidecai" createDate="20200629" note="修改AS_LIBRARY种的字段长度">
alter table AS_LIBRARY modify(NAME_COLLECTION VARCHAR2(255))
</sql>
</version>
<version edition="40" description="视频转换后的uuid名称表">
<sql creator="yangrifei" createDate="20200629" note="视频转换后的uuid名称表">
CREATE TABLE "AS_VIDEO_TRANSITION"
(
"ID" INT NOT NULL,
"VIDEO_KEY" VARCHAR(50),
"VIDEO_VALUE" VARCHAR(50),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "ARCHSER_YZ"."AS_VIDEO_TRANSITION" IS '视频播放uuid';
</sql>
</version>
<version edition="41" description="档案分类管理表">
<sql creator="liukexin" createDate="20200628" note="档案分类管理表">
alter table "AS_TREECLASSFIC" add IDSEQ VARCHAR2(500);
</sql>
</version>
<version edition="42" description="盘点">
<sql creator="zhanglongfa" createDate="20200701" note="盘点">
alter table AS_CHECK_RECORD_RESULT add(DATASIGN1 VARCHAR2(200));
</sql>
</version>
<version edition="43" description="序列">
<sql creator="yangrifei" createDate="20200715" note="序列">
CREATE SEQUENCE "SEQ_AS_VIDEO_TRANSITION" INCREMENT BY 1 START WITH 1 MAXVALUE 9223372036854775807 MINVALUE 1;
</sql>
</version>
<version edition="44" description="档案分类排序">
<sql creator="xiaoying" createDate="20200703" note="档案分类排序">
alter table AS_TREECLASSFIC add(SERIALINDEX VARCHAR2(500));
</sql>
</version>
<version edition="45" description="添加全宗信息表">
<sql creator="yangchengwu" createDate="20200715" note="全宗信息表">
CREATE TABLE "ARCHSER_YZ"."AS_FOND"
(
"ID" NUMBER NOT NULL,
"FOND_ID" VARCHAR2(40),
"NAME" VARCHAR2(40),
"DESCRIPTION" VARCHAR2(255),
"ORGAN_ID" VARCHAR2(40),
"CREATE_TIME" TIMESTAMP(6),
"REMARK" VARCHAR2(255),
"IDSEQ" VARCHAR2(500),
CONSTRAINT "SYS_C0090555" NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "ARCHSER_YZ"."AS_FOND"."CREATE_TIME" IS '创建时间';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_FOND"."DESCRIPTION" IS '全宗描述';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_FOND"."FOND_ID" IS '全宗id';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_FOND"."NAME" IS '全宗名称';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_FOND"."ORGAN_ID" IS '关联机构';
COMMENT ON COLUMN "ARCHSER_YZ"."AS_FOND"."REMARK" IS '备注';
</sql>
</version>
</update>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment