docs: 优化迁移检测文档并添加数据库初始化脚本

- 精简迁移检测实施方案,聚焦核心检测机制
- 新增MyBatis-Plus持久层一致性检测机制设计
- 新增跨数据库SQL兼容性检测方案
- 添加db目录,包含达梦数据库建表SQL和视图定义
- 删除冗余的包重新计入公示SQL文件
This commit is contained in:
周志尧 2026-01-05 14:53:10 +08:00
parent 5bdb4cb44c
commit 378600a749
12 changed files with 40183 additions and 411 deletions

View File

@ -0,0 +1,117 @@
# MyBatis-Plus持久层与数据库表结构一致性检测机制设计
## 一、检测目标
确保MyBatis-Plus持久层Entity + Mapper + Mapper XML与达梦数据库表结构保持一致提前发现并规避因字段不匹配导致的运行时错误。
**应用场景**
- 开发阶段:提前发现字段映射问题
- 上线前审计:生成完整的一致性报告
---
## 二、检测架构
```
┌─────────────────────────────────────────────────────┐
│ Schema Consistency Checker │
├─────────────────────────────────────────────────────┤
│ 1. 元数据采集 │
│ ├─ DatabaseMetadataExtractor (数据库表结构) │
│ ├─ MapperMetadataExtractor (Entity注解+XML) │
│ └─ SqlFileParser (SQL脚本) │
├─────────────────────────────────────────────────────┤
│ 2. 一致性分析 │
│ ├─ TableComparator (表级对比) │
│ └─ FieldComparator (字段级对比) │
├─────────────────────────────────────────────────────┤
│ 3. 报告生成 │
│ ├─ MarkdownReporter (开发查看) │
│ └─ HtmlReporter (团队分享) │
├─────────────────────────────────────────────────────┤
│ 4. 执行入口 │
│ └─ SchemaConsistencyMain (main方法驱动) │
└─────────────────────────────────────────────────────┘
```
---
## 三、检测维度
### 3.1 表结构检查
| 检查项 | 说明 | 严重程度 |
|--------|------|----------|
| 表是否存在 | Mapper对应的表在数据库中存在 | HIGH |
| 主键一致性 | @TableId与数据库主键定义一致 | HIGH |
| 表名匹配 | @TableName与实际表名一致 | MEDIUM |
### 3.2 字段检查
| 检查项 | 说明 | 严重程度 |
|--------|------|----------|
| 字段完整性 | Mapper字段全部在数据库中存在 | HIGH |
| 字段多余性 | 无数据库中已删除的废弃字段 | MEDIUM |
| 类型匹配 | Java类型 ↔ 达梦类型对应正确 | MEDIUM |
| 长度匹配 | VARCHAR/DECIMAL长度一致 | LOW |
| 可空性 | @TableField + 实际可空性一致 | LOW |
### 3.3 Mapper XML检查
| 检查项 | 说明 | 严重程度 |
|--------|------|----------|
| ResultMap完整性 | 所有字段有对应column定义 | MEDIUM |
| Base_Column_List | 包含所有非LOB字段 | LOW |
| SQL字段存在性 | SQL中的字段在表结构中存在 | HIGH |
---
## 四、技术实现
### 4.1 核心技术
- **数据库元数据提取**: 使用JDBC DatabaseMetaData API获取达梦表结构
- **Mapper元数据提取**: 使用MyBatis-Plus TableInfoHelper获取Entity注解 + SAX解析XML
- **类型映射**: 配置化Java类型与达梦数据库类型的对应关系
- **对比算法**: 基于反射和元数据的多维度差异检测
### 4.2 包结构
```
com.chinaweal.aiccs.dev.consistency/
├── SchemaConsistencyMain # 入口类
├── config/ # 配置管理
├── metadata/ # 元数据提取器
│ ├── DatabaseMetadataExtractor
│ ├── MapperMetadataExtractor
│ └── model/ # 元数据模型
├── comparator/ # 一致性对比器
└── reporter/ # 报告生成器
```
---
## 五、使用方式
### 5.1 命令行运行
```bash
# 检查所有数据源
mvn exec:java -Dexec.mainClass="com.chinaweal.aiccs.dev.consistency.SchemaConsistencyMain"
# 检查指定数据源
mvn exec:java -Dexec.mainClass="..." -Dexec.args="--datasource=aiccs --output=html"
```
### 5.2 配置文件
- `consistency-check.yml`: 数据源配置、检查规则(忽略表、失败策略)
- `type-mapping.yml`: Java类型与达梦数据库类型映射关系
---
## 六、输出报告
支持多种报告格式:
- **Markdown**: 开发人员查看,包含差异详情和修复建议
- **HTML**: 团队分享和归档
### 报告内容结构
1. **摘要**: 一致表数量、差异表数量、严重错误统计
2. **差异详情**: 按表分组展示字段级差异(缺失、多余、类型不匹配、长度不一致等)
3. **修复建议**: 自动生成ALTER TABLE SQL语句

View File

@ -0,0 +1,827 @@
# 跨数据库SQL兼容性检测方案
## 一、检测目标
检测系统中所有SQL语句在目标数据库达梦/MySQL/Oracle/DB2上的兼容性识别并修复不兼容的SQL语法确保系统平滑迁移到新数据库环境。
---
## 二、检测范围
### 检测对象
1. **Mapper XML文件**所有MyBatis Mapper XML中的SQL语句
2. **Java代码**:使用注解(@Select/@Insert/@Update/@Delete的SQL
3. **动态SQL**Java代码中拼接的SQL字符串
4. **数据库脚本**DDL/DML脚本文件
### 检测项
1. **SQL语法兼容性**
- MySQL特有语法 → 达梦/Oracle语法
- 分页、函数、操作符等
2. **数据类型兼容性**
- MySQL特有类型 → 标准SQL类型
- 类型映射关系
3. **字符串和日期处理**
- 字符串拼接、日期函数等
---
## 三、MySQL到达梦兼容性对照表
| SQL类型 | MySQL语法 | 达梦语法 | 兼容性说明 | 检测方法 |
|--------|-----------|---------|-----------|---------|
| **分页** | `LIMIT 10, 20` | `LIMIT 20 OFFSET 10``ROWNUM` | 达梦8+支持LIMIT | Grep搜索`LIMIT` |
| **自增主键** | `AUTO_INCREMENT` | `IDENTITY``SEQUENCE` | 需修改为IDENTITY | Grep搜索`AUTO_INCREMENT` |
| **日期函数** | `NOW()` | `SYSDATE` | 需替换为SYSDATE | Grep搜索`NOW()` |
| **字符串拼接** | `CONCAT(a,b)``CONCAT_WS()` | `a \|\| b``CONCAT()` | 达梦支持两种方式 | Grep搜索`CONCAT` |
| **反引号** | `` `table` `` | `"table"` | 需替换为双引号 | Grep搜索反引号 |
| **布尔值** | `TRUE/FALSE` | `1/0` | 需替换为1/0 | Grep搜索`TRUE\|FALSE` |
| **注释符号** | `#注释` | `-- 注释` | `#`不支持,需改为`--` | Grep搜索`^[[:space:]]*#` |
| **当前时间** | `CURRENT_TIMESTAMP` | `SYSDATE` | 建议统一用SYSDATE | Grep搜索`CURRENT_TIMESTAMP` |
| **空字符串** | `''` | `''``NULL` | 大部分兼容 | 人工检查 |
| **数据类型** | `TINYINT/MEDIUMINT` | `TINYINT/INT` | TINYINT需调整为INT | Grep搜索`TINYINT\|MEDIUMINT` |
| **索引提示** | `USE INDEX` | 不支持 | 需删除索引提示 | Grep搜索`USE INDEX` |
| **GROUP BY** | 允许SELECT非聚合字段 | 要求SELECT字段都在GROUP BY中 | 需修改SQL | 人工检查 |
| **IF函数** | `IF(condition, a, b)` | `CASE WHEN` | 需改写为CASE WHEN | Grep搜索`\bIF\(` |
| **日期格式化** | `DATE_FORMAT()` | `TO_CHAR()` | 需改写为TO_CHAR | Grep搜索`DATE_FORMAT` |
| **字符串转数字** | `CAST('123' AS SIGNED)` | `CAST('123' AS INT)` | SIGNED改为INT | Grep搜索`AS SIGNED` |
---
## 四、检测方法
### 方案A命令行快速扫描
```bash
#!/bin/bash
# MySQL到达梦SQL兼容性扫描脚本
echo "开始扫描MySQL特有SQL语法..."
echo ""
# 1. 搜索分页语句LIMIT
echo "=== 1. 分页语句 (LIMIT) ==="
grep -rn "LIMIT\s" src/main/resources/mybatis/
echo ""
# 2. 搜索自增主键AUTO_INCREMENT
echo "=== 2. 自增主键 (AUTO_INCREMENT) ==="
grep -rn "AUTO_INCREMENT" src/
echo ""
# 3. 搜索日期函数NOW
echo "=== 3. 日期函数 (NOW) ==="
grep -rn "NOW()" src/
echo ""
# 4. 搜索反引号MySQL特有
echo "=== 4. 反引号 (MySQL特有) ==="
grep -rn '`' src/main/resources/mybatis/
echo ""
# 5. 搜索布尔值TRUE/FALSE
echo "=== 5. 布尔值 (TRUE/FALSE) ==="
grep -rn "\bTRUE\b\|\bFALSE\b" src/
echo ""
# 6. 搜索注释符号(#
echo "=== 6. 注释符号 (#) ==="
grep -rn "^[[:space:]]*#" src/main/resources/mybatis/
echo ""
# 7. 搜索特定数据类型
echo "=== 7. MySQL特有数据类型 (TINYINT/MEDIUMINT) ==="
grep -rn "TINYINT\|MEDIUMINT" src/
echo ""
# 8. 搜索IF函数
echo "=== 8. IF函数 (需改写为CASE WHEN) ==="
grep -rn "\bIF(" src/
echo ""
# 9. 搜索DATE_FORMAT
echo "=== 9. DATE_FORMAT (需改写为TO_CHAR) ==="
grep -rn "DATE_FORMAT" src/
echo ""
# 10. 搜索CAST AS SIGNED
echo "=== 10. CAST AS SIGNED (需改为AS INT) ==="
grep -rn "AS SIGNED" src/
echo ""
# 11. 搜索USE INDEX
echo "=== 11. USE INDEX (达梦不支持) ==="
grep -rn "USE INDEX\|FORCE INDEX\|IGNORE INDEX" src/
echo ""
# 12. 搜索GROUP_CONCAT
echo "=== 12. GROUP_CONCAT (需改写为LISTAGG) ==="
grep -rn "GROUP_CONCAT" src/
echo ""
echo "扫描完成!"
```
**Windows版本PowerShell**
```powershell
# MySQL到达梦SQL兼容性扫描脚本
Write-Host "开始扫描MySQL特有SQL语法..." -ForegroundColor Green
Write-Host ""
# 定义要扫描的模式
$patterns = @{
"分页语句 (LIMIT)" = "LIMIT\s"
"自增主键 (AUTO_INCREMENT)" = "AUTO_INCREMENT"
"日期函数 (NOW)" = "NOW\(\)"
"反引号" = "`""
"布尔值 (TRUE/FALSE)" = "\bTRUE\b|\bFALSE\b"
"注释符号 (#)" = "^\s*#"
"TINYINT/MEDIUMINT" = "TINYINT|MEDIUMINT"
"IF函数" = "\bIF\("
"DATE_FORMAT" = "DATE_FORMAT"
"CAST AS SIGNED" = "AS SIGNED"
"USE INDEX" = "USE INDEX|FORCE INDEX|IGNORE INDEX"
"GROUP_CONCAT" = "GROUP_CONCAT"
}
# 执行扫描
foreach ($item in $patterns.GetEnumerator()) {
Write-Host "=== $($item.Key) ===" -ForegroundColor Yellow
Select-String -Path "src\**\*.xml", "src\**\*.java" -Pattern $item.Value -Recurse
Write-Host ""
}
Write-Host "扫描完成!" -ForegroundColor Green
```
---
### 方案BPython自动化检测工具
```python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
MySQL到达梦SQL兼容性检测工具
"""
import re
import json
from pathlib import Path
from typing import Dict, List, Tuple
from dataclasses import dataclass, asdict
from datetime import datetime
@dataclass
class CompatibilityIssue:
"""兼容性问题"""
issue_type: str
severity: str # HIGH, MEDIUM, LOW
file_path: str
line_number: int
mysql_pattern: str
dm_pattern: str
description: str
suggestion: str
class MySQLToDMCompatibilityChecker:
"""MySQL到达梦兼容性检测器"""
# 检测规则配置
RULES = {
'LIMIT': {
'pattern': r'\bLIMIT\s+(\d+)\s*,\s*(\d+)',
'severity': 'HIGH',
'mysql_pattern': 'LIMIT offset, count',
'dm_pattern': 'LIMIT count OFFSET offset',
'description': 'MySQL分页语法不兼容达梦',
'suggestion': '将 LIMIT offset, count 改为 LIMIT count OFFSET offset'
},
'AUTO_INCREMENT': {
'pattern': r'\bAUTO_INCREMENT\b',
'severity': 'HIGH',
'mysql_pattern': 'AUTO_INCREMENT',
'dm_pattern': 'IDENTITY',
'description': '达梦不支持AUTO_INCREMENT',
'suggestion': '将 AUTO_INCREMENT 改为 IDENTITY 或使用序列SEQUENCE'
},
'NOW': {
'pattern': r'\bNOW\(\)',
'severity': 'HIGH',
'mysql_pattern': 'NOW()',
'dm_pattern': 'SYSDATE',
'description': '达梦不支持NOW()函数',
'suggestion': '将 NOW() 改为 SYSDATE'
},
'BACKTICK': {
'pattern': r'`',
'severity': 'HIGH',
'mysql_pattern': '`table_name`',
'dm_pattern': '"table_name"',
'description': 'MySQL反引号语法',
'suggestion': '将反引号改为双引号 "table_name"'
},
'BOOLEAN': {
'pattern': r'\b(TRUE|FALSE)\b',
'severity': 'MEDIUM',
'mysql_pattern': 'TRUE/FALSE',
'dm_pattern': '1/0',
'description': '达梦不支持布尔值关键字',
'suggestion': '将 TRUE 改为 1FALSE 改为 0'
},
'COMMENT_HASH': {
'pattern': r'^\s*#',
'severity': 'LOW',
'mysql_pattern': '# 注释',
'dm_pattern': '-- 注释',
'description': '达梦不支持#注释',
'suggestion': '将 # 注释 改为 -- 注释'
},
'TINYINT': {
'pattern': r'\bTINYINT\b',
'severity': 'MEDIUM',
'mysql_pattern': 'TINYINT',
'dm_pattern': 'INT或SMALLINT',
'description': '达梦不完全支持TINYINT',
'suggestion': '将 TINYINT 改为 SMALLINT 或 INT'
},
'IF_FUNCTION': {
'pattern': r'\bIF\s*\(',
'severity': 'HIGH',
'mysql_pattern': 'IF(condition, a, b)',
'dm_pattern': 'CASE WHEN condition THEN a ELSE b END',
'description': '达梦不支持IF()函数',
'suggestion': '将 IF(condition, a, b) 改为 CASE WHEN condition THEN a ELSE b END'
},
'DATE_FORMAT': {
'pattern': r'\bDATE_FORMAT\s*\(',
'severity': 'HIGH',
'mysql_pattern': 'DATE_FORMAT(date, format)',
'dm_pattern': 'TO_CHAR(date, format)',
'description': '达梦不支持DATE_FORMAT函数',
'suggestion': '将 DATE_FORMAT(date, format) 改为 TO_CHAR(date, format)'
},
'CAST_SIGNED': {
'pattern': r'\bCAST\s*\([^)]+\s+AS\s+SIGNED\b',
'severity': 'MEDIUM',
'mysql_pattern': 'CAST(expr AS SIGNED)',
'dm_pattern': 'CAST(expr AS INT)',
'description': '达梦不支持SIGNED类型',
'suggestion': '将 CAST(expr AS SIGNED) 改为 CAST(expr AS INT)'
},
'USE_INDEX': {
'pattern': r'\b(USE|FORCE|IGNORE)\s+INDEX\b',
'severity': 'MEDIUM',
'mysql_pattern': 'USE INDEX (index_name)',
'dm_pattern': '(删除索引提示)',
'description': '达梦不支持索引提示',
'suggestion': '删除 USE INDEX/FORCE INDEX/IGNORE INDEX'
},
'GROUP_CONCAT': {
'pattern': r'\bGROUP_CONCAT\s*\(',
'severity': 'HIGH',
'mysql_pattern': 'GROUP_CONCAT(expr)',
'dm_pattern': 'LISTAGG(expr, delimiter)',
'description': '达梦不支持GROUP_CONCAT函数',
'suggestion': '将 GROUP_CONCAT(expr) 改为 LISTAGG(expr, ",")'
}
}
def __init__(self, source_dir: str):
"""
初始化检测器
:param source_dir: 源代码目录
"""
self.source_dir = Path(source_dir)
self.issues: List[CompatibilityIssue] = []
def check_file(self, file_path: Path) -> List[CompatibilityIssue]:
"""检测单个文件"""
issues = []
content = file_path.read_text(encoding='utf-8')
lines = content.split('\n')
for line_no, line in enumerate(lines, 1):
for rule_name, rule in self.RULES.items():
matches = re.finditer(rule['pattern'], line, re.IGNORECASE)
for match in matches:
issues.append(CompatibilityIssue(
issue_type=rule_name,
severity=rule['severity'],
file_path=str(file_path.relative_to(self.source_dir)),
line_number=line_no,
mysql_pattern=rule['mysql_pattern'],
dm_pattern=rule['dm_pattern'],
description=rule['description'],
suggestion=rule['suggestion']
))
return issues
def check_all(self) -> List[CompatibilityIssue]:
"""检测所有文件"""
# 检测XML文件
xml_files = list(self.source_dir.rglob('**/*.xml'))
# 检测Java文件
java_files = list(self.source_dir.rglob('**/*.java'))
all_files = xml_files + java_files
print(f'开始检测 {len(all_files)} 个文件...\n')
for idx, file_path in enumerate(all_files, 1):
print(f'[{idx}/{len(all_files)}] 检测: {file_path.name}')
issues = self.check_file(file_path)
self.issues.extend(issues)
return self.issues
def generate_report(self, output_file: str = 'compatibility_report.json'):
"""生成检测报告"""
report = {
'scan_time': datetime.now().isoformat(),
'summary': {
'total_issues': len(self.issues),
'by_severity': self._count_by_severity(),
'by_type': self._count_by_type(),
'by_file': self._count_by_file()
},
'issues': [asdict(issue) for issue in self.issues]
}
# 保存JSON报告
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(report, f, ensure_ascii=False, indent=2)
# 生成Markdown报告
md_file = output_file.replace('.json', '.md')
self._generate_markdown_report(report, md_file)
print(f'\n检测完成')
print(f'JSON报告: {output_file}')
print(f'Markdown报告: {md_file}')
print(f'\n总计发现 {report["summary"]["total_issues"]} 个兼容性问题:')
for severity, count in report['summary']['by_severity'].items():
print(f' - {severity}: {count}')
def _count_by_severity(self) -> Dict[str, int]:
"""按严重程度统计"""
count = {'HIGH': 0, 'MEDIUM': 0, 'LOW': 0}
for issue in self.issues:
count[issue.severity] += 1
return count
def _count_by_type(self) -> Dict[str, int]:
"""按问题类型统计"""
count = {}
for issue in self.issues:
if issue.issue_type not in count:
count[issue.issue_type] = 0
count[issue.issue_type] += 1
return dict(sorted(count.items(), key=lambda x: x[1], reverse=True))
def _count_by_file(self) -> Dict[str, int]:
"""按文件统计"""
count = {}
for issue in self.issues:
if issue.file_path not in count:
count[issue.file_path] = 0
count[issue.file_path] += 1
return dict(sorted(count.items(), key=lambda x: x[1], reverse=True)[:10])
def _generate_markdown_report(self, report: dict, output_file: str):
"""生成Markdown格式报告"""
with open(output_file, 'w', encoding='utf-8') as f:
f.write('# MySQL到达梦SQL兼容性检测报告\n\n')
f.write(f'**扫描时间**: {report["scan_time"]}\n\n')
# 摘要
f.write('## 检测摘要\n\n')
f.write(f'- **总问题数**: {report["summary"]["total_issues"]}\n')
f.write('\n### 按严重程度\n\n')
f.write('| 严重程度 | 数量 |\n')
f.write('|---------|------|\n')
for severity, count in report['summary']['by_severity'].items():
f.write(f'| {severity} | {count} |\n')
f.write('\n### 按问题类型\n\n')
f.write('| 问题类型 | 数量 |\n')
f.write('|---------|------|\n')
for issue_type, count in list(report['summary']['by_type'].items())[:10]:
f.write(f'| {issue_type} | {count} |\n')
f.write('\n### 问题最多的文件 (Top 10)\n\n')
f.write('| 文件 | 问题数 |\n')
f.write('|------|--------|\n')
for file_path, count in report['summary']['by_file'].items():
f.write(f'| {file_path} | {count} |\n')
# 详细问题列表
f.write('\n## 详细问题清单\n\n')
for issue in report['issues']:
f.write(f'### {issue["issue_type"]} - {issue["severity"]}\n\n')
f.write(f'**文件**: `{issue["file_path"]}:{issue["line_number"]}`\n\n')
f.write(f'**问题描述**: {issue["description"]}\n\n')
f.write(f'- **MySQL语法**: `{issue["mysql_pattern"]}`\n')
f.write(f'- **达梦语法**: `{issue["dm_pattern"]}`\n')
f.write(f'- **修复建议**: {issue["suggestion"]}\n\n')
f.write('---\n\n')
def generate_fix_script(self, output_file: str = 'fix_compatibility.sh'):
"""生成自动修复脚本(仅适用于简单替换)"""
with open(output_file, 'w', encoding='utf-8') as f:
f.write('#!/bin/bash\n')
f.write('# MySQL到达梦SQL兼容性自动修复脚本\n')
f.write('# 注意:此脚本仅处理简单替换,复杂情况需人工确认\n\n')
# 可自动修复的规则
fixable_rules = {
'NOW': ('NOW()', 'SYSDATE'),
'AUTO_INCREMENT': ('AUTO_INCREMENT', 'IDENTITY'),
'BOOLEAN_TRUE': ('\\bTRUE\\b', '1'),
'BOOLEAN_FALSE': ('\\bFALSE\\b', '0'),
}
for rule_name, (old, new) in fixable_rules.items():
f.write(f'# 修复 {rule_name}\n')
f.write(f'find src -type f -name "*.xml" -o -name "*.java" | \\\n')
f.write(f' xargs sed -i "s/{old}/{new}/g"\n\n')
f.write('echo "自动修复完成!请仔细检查修改内容。"\n')
print(f'自动修复脚本已生成: {output_file}')
print('⚠️ 注意:使用前请先提交代码,修复脚本可能产生副作用')
def main():
"""主函数"""
import sys
# 配置
SOURCE_DIR = 'src'
JSON_REPORT = 'check/reports/compatibility_report.json'
FIX_SCRIPT = 'check/scripts/fix_compatibility.sh'
# 创建检测器
checker = MySQLToDMCompatibilityChecker(SOURCE_DIR)
# 执行检测
checker.check_all()
# 生成报告
checker.generate_report(JSON_REPORT)
# 生成修复脚本
checker.generate_fix_script(FIX_SCRIPT)
if __name__ == '__main__':
main()
```
---
## 五、常见SQL兼容性问题及修复示例
### 1. 分页查询
**MySQL写法**
```xml
<select id="selectPage" resultType="...">
SELECT * FROM abnormal_list
LIMIT #{offset}, #{pageSize}
</select>
```
**达梦写法**
```xml
<select id="selectPage" resultType="...">
SELECT * FROM abnormal_list
LIMIT #{pageSize} OFFSET #{offset}
</select>
```
**或者使用ROWNUM**达梦7及以下
```xml
<select id="selectPage" resultType="...">
SELECT * FROM (
SELECT t.*, ROWNUM AS rn FROM abnormal_list t WHERE ROWNUM <= #{offset} + #{pageSize}
) WHERE rn > #{offset}
</select>
```
---
### 2. 日期函数
**MySQL写法**
```xml
<select id="selectByCreateTime" resultType="...">
SELECT * FROM abnormal_list
WHERE create_time &lt;= NOW()
</select>
```
**达梦写法**
```xml
<select id="selectByCreateTime" resultType="...">
SELECT * FROM abnormal_list
WHERE create_time &lt;= SYSDATE
</select>
```
---
### 3. IF函数改为CASE WHEN
**MySQL写法**
```xml
<select id="selectWithStatus" resultType="...">
SELECT
entname,
IF(abnormal_date IS NULL, '正常', '异常') AS status
FROM abnormal_list
</select>
```
**达梦写法**
```xml
<select id="selectWithStatus" resultType="...">
SELECT
entname,
CASE WHEN abnormal_date IS NULL THEN '正常' ELSE '异常' END AS status
FROM abnormal_list
</select>
```
---
### 4. GROUP_CONCAT改为LISTAGG
**MySQL写法**
```xml
<select id="selectGroupConcat" resultType="...">
SELECT
dept_id,
GROUP_CONCAT(entname SEPARATOR ',') AS ent_names
FROM abnormal_list
GROUP BY dept_id
</select>
```
**达梦写法**
```xml
<select id="selectGroupConcat" resultType="...">
SELECT
dept_id,
LISTAGG(entname, ',') WITHIN GROUP (ORDER BY entname) AS ent_names
FROM abnormal_list
GROUP BY dept_id
</select>
```
---
### 5. 字符串拼接
**MySQL写法**
```xml
<select id="selectFullName" resultType="...">
SELECT
CONCAT(last_name, first_name) AS full_name
FROM users
</select>
```
**达梦写法**(两种都支持):
```xml
<select id="selectFullName" resultType="...">
SELECT
last_name || first_name AS full_name
FROM users
</select>
```
```xml
<select id="selectFullName" resultType="...">
SELECT
CONCAT(last_name, first_name) AS full_name
FROM users
</select>
```
---
### 6. CAST类型转换
**MySQL写法**
```xml
<select id="selectCast" resultType="...">
SELECT CAST(amount AS SIGNED) AS int_amount
FROM payments
</select>
```
**达梦写法**
```xml
<select id="selectCast" resultType="...">
SELECT CAST(amount AS INT) AS int_amount
FROM payments
</select>
```
---
### 7. DATE_FORMAT改为TO_CHAR
**MySQL写法**
```xml
<select id="selectFormattedDate" resultType="...">
SELECT
DATE_FORMAT(create_time, '%Y-%m-%d') AS formatted_date
FROM abnormal_list
</select>
```
**达梦写法**
```xml
<select id="selectFormattedDate" resultType="...">
SELECT
TO_CHAR(create_time, 'YYYY-MM-DD') AS formatted_date
FROM abnormal_list
</select>
```
---
## 六、检测步骤
### 1. 准备阶段
```bash
# 创建报告目录
mkdir -p check/reports
mkdir -p check/scripts
# 统计需要检测的文件数量
find src -name "*.xml" | wc -l
find src -name "*.java" | wc -l
```
### 2. 执行检测
**方式1使用命令行快速扫描**
```bash
# Linux/Mac
bash check/scripts/scan_mysql_syntax.sh > scan_results.txt
# Windows PowerShell
powershell -ExecutionPolicy Bypass -File check/scripts/scan_mysql_syntax.ps1 > scan_results.txt
```
**方式2使用Python自动化检测**
```bash
# 运行检测脚本
python check/scripts/mysql_to_dm_checker.py
# 查看报告
cat check/reports/compatibility_report.json
cat check/reports/compatibility_report.md
```
### 3. 分析报告
根据报告中的问题优先级处理:
1. **HIGH高危**
- 影响SQL执行的关键语法
- 必须修复才能正常运行
2. **MEDIUM中危**
- 可能有兼容性问题
- 建议修复
3. **LOW低危**
- 次要兼容性问题
- 可选修复
### 4. 修复问题
**自动修复**(谨慎使用):
```bash
# 先提交代码
git add .
git commit -m "备份:修复前的代码"
# 执行自动修复脚本
bash check/scripts/fix_compatibility.sh
# 检查修复结果
git diff
```
**手动修复**
根据报告中的文件路径和行号,逐一修复兼容性问题。
### 5. 验证修复
```bash
# 重新扫描确认问题已修复
python check/scripts/mysql_to_dm_checker.py
# 对比修复前后的报告
diff check/reports/before_fix.json check/reports/after_fix.json
```
---
## 七、输出报告
### JSON格式报告兼容性检测机器报告
```json
{
"scan_time": "2025-01-05T14:30:00",
"summary": {
"total_issues": 45,
"by_severity": {
"HIGH": 23,
"MEDIUM": 15,
"LOW": 7
},
"by_type": {
"NOW": 18,
"LIMIT": 12,
"IF_FUNCTION": 8,
"AUTO_INCREMENT": 5,
"BOOLEAN": 2
},
"by_file": {
"src/main/resources/mybatis/mapper/aiccs/abnormal/AbnormalListMapper.xml": 8,
"src/main/java/com/chinaweal/aiccs/aiccs/seriousillegal/mapper/SeriousIllegalMapper.java": 5
}
},
"issues": [
{
"issue_type": "NOW",
"severity": "HIGH",
"file_path": "src/main/resources/mybatis/mapper/aiccs/abnormal/AbnormalListMapper.xml",
"line_number": 45,
"mysql_pattern": "NOW()",
"dm_pattern": "SYSDATE",
"description": "达梦不支持NOW()函数",
"suggestion": "将 NOW() 改为 SYSDATE"
}
]
}
```
### Markdown格式报告兼容性检测人工报告
参见工具生成的Markdown格式报告。
---
## 八、注意事项
1. **数据库版本差异**
- 达梦8与达梦7语法有差异
- 确认目标数据库版本
2. **索引提示**
- 达梦不支持MySQL的索引提示语法
- 删除后可能影响查询性能
3. **GROUP BY严格模式**
- 达梦要求SELECT中的非聚合字段必须在GROUP BY中
- MySQL的宽松模式在达梦中会报错
4. **字符串拼接**
- 达梦支持 `||``CONCAT()` 两种方式
- 建议统一使用 `CONCAT()` 以提高代码可读性
5. **NULL处理**
- 达梦的NULL处理与MySQL可能有细微差异
- 注意空字符串 `''``NULL` 的区别
6. **自动生成的SQL**
- MyBatis-Plus等框架生成的SQL也需要检测
- 可能需要配置框架的数据库方言
---
## 九、相关文件
- Mapper XML路径: `src/main/resources/mybatis/mapper/{数据源}/**/*.xml`
- 扫描脚本: `check/scripts/scan_mysql_syntax.sh` / `scan_mysql_syntax.ps1`
- 检测工具: `check/scripts/mysql_to_dm_checker.py`
- 检测报告: `check/reports/compatibility_report.json` / `compatibility_report.md`
- 修复脚本: `check/scripts/fix_compatibility.sh`

View File

@ -3,476 +3,406 @@
## 一、检测目标
确保从广州市场监督管理局迁移到内蒙市场监督管理局的信用监管综合系统能够:
- 数据库连接正常7个数据源
- 业务规则符合内蒙法规
- 配置文件适配内蒙环境
- 代码质量满足生产标准
- Mapper XML与数据库表结构保持一致
- SQL语句兼容目标数据库类型达梦/MySQL/Oracle/DB2等
- 数据持久层稳定可靠,确保数据查询和操作正常
---
## 二、检测阶段与优先级
## 二、检测方案总览
### 第一阶段基础环境检测P0 - 阻塞启动)
本迁移检测项目包含两个独立的检测方案:
#### 1.1 数据库连接检测
**检测项**7个数据源连接可用性
### 1. Mapper XML 与表结构一致性检测方案
**数据源列表**
| 数据源 | 配置类 | 用途 |
|--------|--------|------|
| aiccs | AiccsDataSource | 信用监管核心业务 |
| aiceps | AicepsDataSource | 企业信用评价 |
| aicris | AicrisDataSource | 信用修复 |
| crgs | CrgsDataSource | 信用风险监管 |
| aicbiz | AicbizDataSource | 商事主体DB2 |
| aicorg | AicorgDataSource | 组织架构 |
| youfool | YoufoolDataSource | 基础框架 |
**文档位置**[check/Mapper-XML与表结构一致性检测方案.md](./Mapper-XML与表结构一致性检测方案.md)
**检测方法**
```java
// 使用DruidDataSource的testConnection()方法
DruidDataSource dataSource = ...
try {
Connection conn = dataSource.getConnection();
System.out.println("连接成功: " + dataSource.getName());
} catch (SQLException e) {
System.out.println("连接失败: " + e.getMessage());
}
```
**检测目标**
- 确保 MyBatis Mapper XML 文件与数据库表结构保持一致
- 避免因字段不匹配导致的数据查询错误或运行时异常
**输出**:数据库连接测试报告(成功/失败/响应时间)
**核心检测项**
- 字段名映射Mapper字段是否在数据库表中存在
- 数据类型匹配Java类型与数据库列类型是否对应
- 主键/索引配置(主键配置、生成策略是否匹配数据库)
**适用场景**
- 数据库表结构变更后
- 新增或修改Mapper XML文件时
- 迁移到新的数据库环境前
---
#### 1.2 配置文件本地化检测
**检测项**
- `application.yml` 环境配置内蒙IP/端口/实例名)
- Forest外部接口地址
- SM4加密密钥`oauth2.sm4.key`
- 文件上传路径PDF/Word/Excel临时目录
### 2. 跨数据库SQL兼容性检测方案
**文档位置**[check/跨数据库SQL兼容性检测方案.md](./跨数据库SQL兼容性检测方案.md)
**检测目标**
- 检测系统中所有SQL语句在目标数据库上的兼容性
- 识别并修复不兼容的SQL语法
- 确保系统平滑迁移到新数据库环境
**核心检测项**
- SQL语法兼容性分页、函数、操作符等
- 数据类型兼容性MySQL特有类型 → 标准SQL类型
- 字符串和日期处理(字符串拼接、日期函数等)
**重点检测的MySQL特有语法**
- `LIMIT offset, count``LIMIT count OFFSET offset`
- `NOW()``SYSDATE`
- `AUTO_INCREMENT``IDENTITY`
- `` `table` `` → `"table"`
- `IF(condition, a, b)``CASE WHEN condition THEN a ELSE b END`
- `GROUP_CONCAT()``LISTAGG()`
**适用场景**
- 从MySQL迁移到达梦/Oracle等数据库
- 系统需要支持多种数据库类型
- 检测代码中的数据库特定语法
---
## 三、检测实施流程
### 阶段1准备阶段
1. **确认目标数据库类型**
```bash
# 查看当前数据库配置
cat application.yml | grep -A 5 "database:"
```
2. **备份代码**
```bash
git add .
git commit -m "备份:迁移检测前的代码"
```
3. **创建检测报告目录**
```bash
mkdir -p check/reports
mkdir -p check/scripts
```
---
### 阶段2执行检测
#### 步骤1Mapper XML 与表结构一致性检测
**检测方法**
```bash
# 搜索硬编码的广州配置
grep -r "172\.22\.80" src/
grep -r "广州\|广东\|GZ\|gz" src/
grep -r "4401" src/
# 1. 导出数据库表结构
python check/scripts/export_db_schema.py
# 2. 执行一致性检测
python check/scripts/mapper_schema_checker.py
# 3. 查看检测报告
cat check/reports/mapper_schema_report.json
cat check/reports/mapper_schema_report.md
```
**输出**待修改配置清单Excel
#### 步骤2跨数据库SQL兼容性检测
---
#### 1.3 行政区划代码检测
**检测项**:硬编码的广州区划代码
**目标代码**
- `4401` - 广州市
- `440100` - 广州市级
- `440103` - 广州市荔湾区等
**检测位置**
- `com.chinaweal.aiccs.schedule` 缓存刷新逻辑
- 企业查询过滤条件
- 统计报表区域筛选
**检测方法**Grep搜索`4401`,人工逐个分析业务场景
**输出**:区划代码分布报告(含业务影响评估)
---
### 第二阶段业务适配检测P1 - 核心功能)
#### 2.1 权限体系检测
**检测项**Shiro Realm是否对接内蒙`aicorg`库
**检测位置**
- `UserRealm.java` - 认证逻辑
- `RoleRealm.java` - 角色权限
- 数据源配置指向
**检测方法**
1. 检查`aicorg`数据源连接配置
2. 测试登录功能admin/123456
3. 验证权限注解`@RequiresPermissions`生效
**输出**:权限集成验证报告
---
#### 2.2 业务规则差异检测
**检测项**广州vs内蒙法规差异
**业务模块对比**
| 模块 | 广州规则 | 内蒙规则 | 检测位置 |
|------|---------|---------|---------|
| 经营异常 | 列入条件XX | 列入条件YY | `abnormal` |
| 严重违法 | 标准AA | 标准BB | `seriousillegal` |
| 信用修复 | 审批流程M | 审批流程N | `aicris/forgiveprudent` |
| 行政处罚 | 裁量权P | 裁量权Q | `punishment` |
**检测方法**
1. 收集内蒙相关法规文档
2. 对照代码中的业务判断逻辑
3. 标注需要调整的代码位置
**输出**业务规则差异对照表Excel
---
#### 2.3 数据字典缓存检测
**检测项**:应用启动缓存正确性
**缓存类型**
- 企业类型缓存
- 基础代码缓存
- 数据类型代码缓存
- 广州编码缓存 → **需替换为内蒙编码**
**检测位置**`ContextRefreshedEvent`监听器
**检测方法**
1. 启动应用,观察日志
2. 连接Redis查看缓存内容`redis-cli KEYS "*"`
3. 检查缓存数据是否为内蒙数据
**输出**:缓存数据正确性报告
---
### 第三阶段数据持久层检测P1 - 数据完整性)
#### 3.1 Mapper XML与表结构一致性
**检测项**
- 字段名映射
- 数据类型匹配
- 主键/索引配置
**检测方法**
**方案A自动化检测推荐**
```sql
-- 导出数据库表结构
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME IN ('表名列表')
ORDER BY TABLE_NAME, COLUMN_ID;
```
```python
# Python对比脚本
import xml.etree.ElementTree as ET
def parse_mapper_xml(xml_path):
"""解析Mapper XML获取字段列表"""
tree = ET.parse(xml_path)
root = tree.getroot()
fields = []
for result_map in root.findall('.//resultMap'):
for column in result_map.findall('result'):
fields.append(column.get('column'))
return fields
def compare_with_db(exported_db_schema, mapper_fields):
"""对比数据库schema和Mapper字段"""
missing = set(exported_db_schema) - set(mapper_fields)
extra = set(mapper_fields) - set(exported_db_schema)
return missing, extra
```
**方案B使用MyBatis-Plus**
```java
TableInfo tableInfo = TableInfoHelper.getTableInfo(Entity.class);
for (TableField field : tableInfo.getFields()) {
System.out.println(field.getColumn() + " - " + field.getProperty());
}
```
**输出**:差异清单(缺失字段/类型不匹配/多余字段)
---
#### 3.2 跨数据库SQL兼容性
**检测项**
| SQL类型 | MySQL | Oracle | 达梦 | DB2 | 检测方法 |
|---------|-------|--------|------|-----|---------|
| 分页 | LIMIT | ROWNUM | ROWNUM | FETCH FIRST | Grep搜索 |
| 序列 | AUTO_INCREMENT | SEQ.NEXTVAL | SEQ.NEXTVAL | SEQ.NEXTVAL | Grep搜索 |
| 日期 | NOW() | SYSDATE | SYSDATE | CURRENT TIMESTAMP | Grep搜索 |
| 字符串 | CONCAT | \|\| | \|\| | \|\| | Grep搜索 |
**检测方法**
```bash
# 搜索分页语句
grep -rn "LIMIT\|ROWNUM\|FETCH FIRST" src/
# 1. 快速扫描MySQL特有语法
bash check/scripts/scan_mysql_syntax.sh > scan_results.txt
# 搜索序列
grep -rn "\.NEXTVAL\|AUTO_INCREMENT" src/
# 2. 执行完整兼容性检测
python check/scripts/mysql_to_dm_checker.py
# 搜索日期函数
grep -rn "NOW()\|SYSDATE\|CURRENT_TIMESTAMP" src/
# 3. 查看检测报告
cat check/reports/compatibility_report.json
cat check/reports/compatibility_report.md
```
**输出**不兼容SQL语句清单含修复建议
---
### 阶段3问题修复
1. **按优先级修复问题**
- HIGH高危必须修复否则系统无法运行
- MEDIUM中危建议修复可能影响功能
- LOW低危可选修复优化性改进
2. **修复方式**
- **自动修复**:使用脚本自动修复简单问题(谨慎使用)
- **手动修复**:根据报告建议逐一修复复杂问题
3. **验证修复**
```bash
# 重新执行检测
python check/scripts/mapper_schema_checker.py
python check/scripts/mysql_to_dm_checker.py
# 对比修复前后的报告
diff check/reports/before_fix.json check/reports/after_fix.json
```
---
### 第四阶段代码质量与安全检测P2 - 优化完善)
### 阶段4测试验证
#### 4.1 依赖冲突检测
**工具**Maven依赖分析
1. **单元测试**
```bash
mvn test -Dtest=*MapperTest
```
**命令**
```bash
mvn dependency:tree > dependency-tree.txt
2. **集成测试**
```bash
mvn verify
```
3. **功能测试**
- 启动应用
- 测试核心业务功能
- 验证数据查询和操作
---
## 四、检测工具和脚本
### 1. Mapper XML 与表结构一致性检测工具
| 工具名称 | 文件路径 | 说明 |
|---------|---------|------|
| 数据库Schema导出工具 | `check/scripts/export_db_schema.py` | 导出数据库表结构为JSON |
| 一致性检测工具 | `check/scripts/mapper_schema_checker.py` | 检测Mapper与表结构一致性 |
| 检测报告 | `check/reports/mapper_schema_report.json` | JSON格式检测报告 |
| 检测报告 | `check/reports/mapper_schema_report.md` | Markdown格式检测报告 |
### 2. 跨数据库SQL兼容性检测工具
| 工具名称 | 文件路径 | 说明 |
|---------|---------|------|
| 快速扫描脚本 | `check/scripts/scan_mysql_syntax.sh` | Linux/Mac快速扫描脚本 |
| 快速扫描脚本 | `check/scripts/scan_mysql_syntax.ps1` | Windows快速扫描脚本 |
| 兼容性检测工具 | `check/scripts/mysql_to_dm_checker.py` | 完整的兼容性检测工具 |
| 自动修复脚本 | `check/scripts/fix_compatibility.sh` | 自动修复MySQL语法谨慎使用 |
| 检测报告 | `check/reports/compatibility_report.json` | JSON格式检测报告 |
| 检测报告 | `check/reports/compatibility_report.md` | Markdown格式检测报告 |
---
## 五、常见问题排查
### 问题1Mapper字段与数据库表不匹配
**症状**
```
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.sql.SQLException: 无效的列索引
```
**检测项**
- 版本冲突jar包
- 重复依赖(不同版本)
- 传递依赖风险
**排查步骤**
1. 检查Mapper XML中的字段名是否正确
2. 对比数据库表结构
3. 使用一致性检测工具扫描
4. 查看详细报告:`check/reports/mapper_schema_report.md`
**输出**:依赖冲突报告(需手动解决)
**参考文档**[Mapper-XML与表结构一致性检测方案.md](./Mapper-XML与表结构一致性检测方案.md)
---
#### 4.2 安全漏洞扫描
**工具**SonarQube / OWASP Dependency Check
### 问题2SQL语句在新数据库中报错
**检测项**
- Shiro版本漏洞CVE-2016-4437等
- JWT实现安全签名算法、密钥强度
- SQL注入风险MyBatis `#{}` vs `${}`
- XSS漏洞前端输入输出
**检测方法**
```bash
# 静态扫描
mvn sonar:sonar
# 依赖漏洞检查
mvn org.owasp:dependency-check-maven:check
**症状**
```
java.sql.SQLSyntaxErrorException: 语法分析错误
```
**重点关注**
- 所有使用`${}`拼SQL的地方
- 密码硬编码
- Druid监控暴露`/druid`是否需IP限制
**排查步骤**
1. 确认错误SQL语句
2. 检查是否使用了MySQL特有语法
3. 使用兼容性检测工具扫描
4. 查看兼容性对照表
**输出**:安全漏洞清单(按严重等级分类)
**参考文档**[跨数据库SQL兼容性检测方案.md](./跨数据库SQL兼容性检测方案.md)
---
#### 4.3 日志敏感信息检测
**检测项**:日志中输出敏感数据
### 问题3分页查询不工作
**敏感字段**
- 身份证号
- 企业名称
- 手机号
- 密码
**检测方法**
```bash
# 搜索日志输出
grep -rn "log\.\(info\|debug\|warn\).*\(name\|idCard\|phone\|password\)" src/
**症状**
```
LIMIT语法错误或分页结果不正确
```
**输出**:敏感信息脱敏建议(使用`***`替换)
**解决方案**
- MySQL: `LIMIT offset, count`
- 达梦8+: `LIMIT count OFFSET offset`
- 达梦7: 使用 `ROWNUM`
**参考文档**[跨数据库SQL兼容性检测方案.md](./跨数据库SQL兼容性检测方案.md)
---
### 第五阶段性能与部署检测P2 - 性能优化)
## 六、检测报告示例
#### 5.1 数据库连接池配置
**检测项**Druid连接池是否满足内蒙数据量
### Mapper XML 与表结构一致性检测报告
**关键配置**
- `maxActive` - 最大连接数
- `initialSize` - 初始连接数
- `maxWait` - 获取连接超时时间
**检测方法**
1. 压测使用JMeter模拟并发请求
2. 监控:访问`http://localhost:8080/druid`查看连接池状态
3. 分析:是否存在连接等待超时
**输出**:连接池调优建议
---
#### 5.2 定时任务负载检测
**检测项**`@Scheduled`任务执行时长
**定时任务位置**`com.chinaweal.aiccs.schedule`
**检测方法**
```java
@Scheduled(cron = "0 0 2 * * ?")
public void refreshCache() {
long start = System.currentTimeMillis();
try {
// 原有逻辑
} finally {
long duration = System.currentTimeMillis() - start;
log.info("任务执行时长: {}ms", duration);
```json
{
"summary": {
"total_issues": 15,
"by_severity": {
"HIGH": 8,
"MEDIUM": 5,
"LOW": 2
}
},
"issues": [
{
"type": "EXTRA_FIELDS",
"table": "ABNORMAL_LIST",
"file": "src/main/resources/mybatis/mapper/aiccs/abnormal/AbnormalListMapper.xml",
"severity": "HIGH",
"message": "Mapper中多余字段数据库中不存在: NEW_FIELD, DEPRECATED_FIELD"
}
]
}
```
**输出**:任务执行时间报告(是否需优化或调整执行时间窗口)
### 跨数据库SQL兼容性检测报告
---
#### 5.3 文档生成性能
**检测项**PDF/Word批量生成性能
**测试场景**批量生成100个行政处罚决定书
**检测方法**
1. 编写测试脚本
2. 统计总耗时
3. 分析瓶颈PDF生成 iText vs Word处理 docx4j
**输出**:性能瓶颈分析(是否需异步处理)
---
## 三、检测工具清单
| 工具 | 用途 | 使用场景 |
|------|------|---------|
| **Grep** | 代码搜索 | 硬编码、SQL语句、敏感信息 |
| **Maven** | 依赖分析 | `mvn dependency:tree` |
| **Druid监控** | 数据库性能 | http://localhost:8080/druid |
| **JMeter** | 接口压测 | 连接池、接口性能 |
| **SonarQube** | 代码质量 | 静态扫描、安全漏洞 |
| **Postman** | 接口测试 | API连通性、权限验证 |
| **Redis-cli** | 缓存检查 | `KEYS *` / `GET key` |
| **Python** | 自动化脚本 | Mapper对比、数据导出 |
---
## 四、输出物标准
每个检测项完成后需输出:
1. **检测报告**Markdown格式
- 检测目的
- 检测方法
- 检测结果
- 问题汇总
2. **问题清单**Excel
- 序号
- 问题分类
- 优先级P0/P1/P2
- 问题描述
- 涉及文件
- 负责人
- 状态(待修复/修复中/已完成)
3. **修复建议**(具体到文件/行号)
- 原代码
- 修改后代码
- 原因说明
4. **验证结果**(修复后回归测试)
- 测试方法
- 测试结果
- 截图/日志
---
## 五、时间安排建议
| 阶段 | 检测项数量 | 预计工作量 | 参与人员 |
|------|-----------|-----------|---------|
| 阶段一:基础环境 | 3项 | 2天 | 后端开发 |
| 阶段二:业务适配 | 3项 | 3天 | 后端开发 + 业务分析师 |
| 阶段三:数据持久层 | 2项 | 3天 | 后端开发 + DBA |
| 阶段四:质量与安全 | 3项 | 2天 | 后端开发 + 安全工程师 |
| 阶段五:性能与部署 | 3项 | 2天 | 后端开发 + 运维 |
| **合计** | **14项** | **12天** | - |
**并行执行建议**
- 阶段二和阶段三可并行(不同人员)
- 阶段四和阶段五可并行(不同人员)
- 最短周期:**6天**2人并行
---
## 六、风险控制
### 高风险项
1. **数据库连接失败**P0
- 风险:系统无法启动
- 应对:提前获取内蒙环境数据库连接信息
2. **业务规则差异**P1
- 风险:监管流程不符合内蒙法规
- 应对:邀请内蒙业务专家参与评审
3. **SQL兼容性问题**P1
- 风险:查询失败、数据错误
- 应对逐条测试关键业务SQL
### 回归测试建议
所有修复完成后,需进行:
1. **冒烟测试**:核心业务流程(登录、查询、审批)
2. **接口测试**Postman测试所有API
3. **性能测试**JMeter压测关键接口
4. **数据一致性**:对比数据库记录与缓存数据
---
## 七、检查清单模板
```
☑ 数据库连接检测
☑ aiccs数据源连接成功
☑ aiceps数据源连接成功
☑ aicris数据源连接成功
☑ crgs数据源连接成功
☑ aicbiz数据源连接成功
☑ aicorg数据源连接成功
☑ youfool数据源连接成功
☑ 配置文件本地化检测
☑ application.yml已更新内蒙IP
☑ Forest外部接口地址已确认
☑ SM4加密密钥已配置
☑ 文件上传路径已调整
☑ ...(其他检测项)
```json
{
"scan_time": "2025-01-05T14:30:00",
"summary": {
"total_issues": 45,
"by_severity": {
"HIGH": 23,
"MEDIUM": 15,
"LOW": 7
},
"by_type": {
"NOW": 18,
"LIMIT": 12,
"IF_FUNCTION": 8
}
},
"issues": [
{
"issue_type": "NOW",
"severity": "HIGH",
"file_path": "src/main/resources/mybatis/mapper/aiccs/abnormal/AbnormalListMapper.xml",
"line_number": 45,
"mysql_pattern": "NOW()",
"dm_pattern": "SYSDATE",
"description": "达梦不支持NOW()函数",
"suggestion": "将 NOW() 改为 SYSDATE"
}
]
}
```
---
## 八、附录
## 七、最佳实践建议
### A. 关键配置文件位置
- `src/main/resources/application.yml` - 主配置文件
- `src/main/resources/application-{profile}.yml` - 环境配置
- `src/main/resources/mybatis/config/mybatis-config.xml` - MyBatis配置
- `src/main/resources/forest/` - Forest接口配置
### 1. 定期执行检测
### B. 关键代码位置
- `com.chinaweal.aiccs.config` - 数据源配置
- `com.chinaweal.aiccs.shiro` - Shiro权限配置
- `com.chinaweal.aiccs.schedule` - 定时任务
- `com.chinaweal.youfool.framework.shiro.realm` - Realm实现
- **每次数据库表结构变更后**执行Mapper XML一致性检测
- **每次修改SQL语句后**:执行兼容性检测
- **迁移到新环境前**:执行完整检测
### C. 联系人
- 后端开发负责人:
- DBA
- 业务分析师:
- 运维负责人:
### 2. 集成到CI/CD流程
在项目的CI/CD流程中集成检测工具确保每次代码提交都经过检测
```yaml
# .gitlab-ci.yml 示例
test:
script:
- python check/scripts/mapper_schema_checker.py
- python check/scripts/mysql_to_dm_checker.py
- mvn test
```
### 3. 代码审查
- 将检测报告作为代码审查的参考
- 重点关注高危和中危问题
- 确保所有问题都已修复或确认可忽略
### 4. 文档维护
- 及时更新检测工具和脚本
- 维护兼容性对照表
- 记录常见问题和解决方案
---
**文档版本**v1.0
**最后更新**2026-01-05
**维护人**Claude Code
## 八、相关资源
### 项目文档
- [Mapper-XML与表结构一致性检测方案.md](./Mapper-XML与表结构一致性检测方案.md) - Mapper一致性检测详细方案
- [跨数据库SQL兼容性检测方案.md](./跨数据库SQL兼容性检测方案.md) - SQL兼容性检测详细方案
### 数据库参考文档
- **达梦数据库**: [https://www.dameng.com/](https://www.dameng.com/)
- **MySQL**: [https://dev.mysql.com/doc/](https://dev.mysql.com/doc/)
- **Oracle**: [https://docs.oracle.com/en/database/](https://docs.oracle.com/en/database/)
### MyBatis参考文档
- **MyBatis官方文档**: [https://mybatis.org/mybatis-3/](https://mybatis.org/mybatis-3/)
- **MyBatis-Plus文档**: [https://baomidou.com/](https://baomidou.com/)
---
## 九、检查清单
### 迁移前检查
- [ ] 确认目标数据库类型和版本
- [ ] 备份当前代码和数据
- [ ] 创建检测报告目录
- [ ] 导出数据库表结构
### 执行检测
- [ ] Mapper XML 与表结构一致性检测
- [ ] 跨数据库SQL兼容性检测
- [ ] 生成检测报告
- [ ] 分析检测报告
### 问题修复
- [ ] 修复高危问题
- [ ] 修复中危问题
- [ ] 修复低危问题(可选)
- [ ] 验证修复结果
### 测试验证
- [ ] 单元测试通过
- [ ] 集成测试通过
- [ ] 功能测试通过
- [ ] 性能测试通过
### 部署上线
- [ ] 灰度发布
- [ ] 监控系统运行状态
- [ ] 收集用户反馈
- [ ] 完成迁移
---
## 十、技术支持
如果在执行迁移检测过程中遇到问题,请:
1. 查阅相关文档和参考资料
2. 检查检测报告中的错误信息
3. 联系项目负责人或DBA
4. 提交Issue到项目仓库
---
**最后更新时间**: 2025-01-05
**文档版本**: v1.0
**维护人**: 开发团队

11787
db/init/AICCS/表.sql Normal file

File diff suppressed because it is too large Load Diff

12
db/init/AICCS/视图.sql Normal file
View File

@ -0,0 +1,12 @@
CREATE OR REPLACE VIEW BASE_VIEW(BASECODE,BASENAME,CHILDCODE,CHILDNAME) AS SELECT 'regEntityType' AS "BASECODE",'企业类型' AS "BASENAME","TRENTTYPE".ENTTYPEID AS "CHILDCODE","TRENTTYPE".ENTTYPENAME AS "CHILDNAME" FROM TRENTTYPE WHERE (length(rtrim("TRENTTYPE".ENTTYPEID)) = 4 OR "TRENTTYPE".ENTTYPEID IN ('12100', '12200', '12500', '13100', '14100', '15000', '15100', '18000', '24000', '26000', '26100', '26200', '20000', '27000') ) UNION ALL SELECT 'EntityType' AS "BASECODE",'企业类型' AS "BASENAME","TRENTTYPE".ENTTYPEID AS "CHILDCODE","TRENTTYPE".ENTTYPENAME AS "CHILDNAME" FROM TRENTTYPE UNION ALL SELECT 'EntityClsType' AS "BASECODE",'企业类型' AS "BASENAME","TRENTTYPE".ENTTYPEID AS "CHILDCODE","TRENTTYPE".ENTTYPENAME AS "CHILDNAME" FROM TRENTTYPE WHERE length(rtrim("TRENTTYPE".ENTTYPEID)) = 4 UNION ALL SELECT 'EntPriseType' AS "BASECODE",'企业子类型' AS "BASENAME","TRENTPRISETYPE".ENTTYPEID AS "CHILDCODE","TRENTPRISETYPE".DISPLAYVALUE AS "CHILDNAME" FROM TRENTPRISETYPE UNION ALL SELECT "TRBASECODE".CODEID AS "BASECODE",'TRBaseCode' AS "BASENAME","TRBASECODE".CODE AS "CHILDCODE","TRBASECODE".NAME AS "CHILDNAME" FROM TRBASECODE UNION ALL SELECT 'AicCode' AS "BASECODE",'工商机构代码' AS "BASENAME","TRAICCODE".AICID AS "CHILDCODE","TRAICCODE".AICNAME AS "CHILDNAME" FROM TRAICCODE UNION ALL SELECT 'IndustryKind' AS "BASECODE",'行业门类' AS "BASENAME","TRINDUSTRYINFO".FULLCODE AS "CHILDCODE","TRINDUSTRYINFO".CODENAME AS "CHILDNAME" FROM TRINDUSTRYINFO WHERE length("TRINDUSTRYINFO".FULLCODE) = 1 UNION ALL SELECT 'IndustryCo' AS "BASECODE",'行业代码' AS "BASENAME",substr("TRINDUSTRYINFO".FULLCODE, 2, 5) AS "CHILDCODE","TRINDUSTRYINFO".CODENAME AS "CHILDNAME" FROM TRINDUSTRYINFO WHERE length("TRINDUSTRYINFO".FULLCODE) > 1 UNION ALL SELECT 'SupervisionMeasure' AS "BASECODE",'监管措施' AS "BASENAME","TSSUPERVISIONMEASURE".SUPMEASURECODE AS "CHILDCODE","TSSUPERVISIONMEASURE".SUPMEASURENAME AS "CHILDNAME" FROM TSSUPERVISIONMEASURE UNION ALL SELECT 'TSBizSerIllegalReas' AS "BASECODE",'企业列入严重违法企业名单原因' AS "BASENAME","TSBIZSERILLEGALREAS".REACODE AS "CHILDCODE","TSBIZSERILLEGALREAS".REANAME AS "CHILDNAME" FROM TSBIZSERILLEGALREAS UNION ALL SELECT 'Coin' AS "BASECODE",'货币' AS "BASENAME","TRCOIN".COINID AS "CHILDCODE","TRCOIN".NAME AS "CHILDNAME" FROM TRCOIN;
CREATE OR REPLACE VIEW case_report_view AS SELECT b.BIZSEQ AS "BIZSEQ",( SELECT SUBSTR(t.CASENO, 1, 6) || '000' || '1' || TO_CHAR(t.handlerDate, 'YYYYMMDD') || LPAD(( SELECT COUNT(*) + 5001 FROM tscase AS t2 WHERE (SUBSTR(t2.CASENO, 1, 6) = SUBSTR(t.CASENO, 1, 6) AND TRUNC(t2.handlerDate) = TRUNC(t.handlerDate) AND t2.BIZSEQ <= t.BIZSEQ )), 4, '0') FROM SYS.SYSDUAL) AS "CASENO",'监督检查' AS "CASESOU",REPLACE(REPLACE(t.situation, '\n', ' '), '\r', ' ') AS "CASECON",t.registTime AS "CLUETIME",'市场准入案件' AS "CASEAREA",t.caseName AS "CASENAME",REPLACE(REPLACE(t.situation, '\n', ' '), '\r', ' ') AS "CASEREASON",r.PUNISHORGCN AS "CASEFIAUTHNAME",t.handlerDate AS "CASEFIDATE",r.PUNISHORGCN AS "CASEDEPNAME",'给予行政处罚' AS "PENRESULT",'行政处罚决定执行完毕' AS "CASEENDTYPE",r.REVOKEDATE AS "CASEENDDATE",'法人或其他组织' AS "PARTYTYPE",e.ENTNAME AS "UNITNAME",e.PRIPID AS "PRIPID",e.UNISCID AS "UNISCID",e.NAME AS "LEREP",e.DOM AS "DOM",e.phone AS "TEL",e.CERTYPE AS "CERTYPE",e.CERNO AS "CERNO",REPLACE(REPLACE(t.hearingToApprRea, '\n', ' '), '\r', ' ') AS "ILLEGFACT",r.REVOKEDATE AS "PENDECISSDATE",'公司成立后无正当理由超过6 个月未开业,或者开业后自行停业连续 6 个月以上的行为' AS "ILLEGACTTYPENAME",'根据《公司法》《个人独资企业法》规定,(公司、个人独资企业)成立后无正当理由超过六个月未开业的,或者开业后自行停业连续六个月以上的,可以由登记机关吊销营业执照。' AS "PENBASIS",'' AS "DISCRETIONFACT",'' AS "DISCRETIONAPP",REPLACE(REPLACE(t.advicePunishContent, '\n', ' '), '\r', ' ') AS "PENCONTENT",'吊销许可证件' AS "PENTYPENAME",'' AS "CASEVAL",'' AS "PENAM",'' AS "REFAMOORD",'' AS "FORFAM",'' AS "FORGOODS",r.PUNISHORGCN AS "PENAUTHNAME",b.PRE_PUN_DEC_WRITSNO AS "PENDECNO",'主动履行' AS "EXETYPE",'' AS "PUBLISH" FROM biz_rev_ent AS b,revokelist AS r,tscase AS t,e_baseinfo AS e WHERE (b.BIZSEQ = t.BIZSEQ AND t.caseNo = r.CASENO AND r.PRIPID = e.PRIPID AND b.PRIPID = r.PRIPID AND r.REVOKEDATE >= TO_DATE('2021-06-03', 'YYYY-MM-DD') ) ORDER BY "CASEFIDATE" ASC,"BIZSEQ" ASC;
CREATE OR REPLACE VIEW ENTLOCKVIEW(PRIPID,PUBLICFROM,ENTNAME) AS SELECT "ENTLOCK".PRIPID AS "PRIPID","ENTLOCK".PUNISHFROM AS "PUBLICFROM","ENTLOCK".ENTNAME AS "ENTNAME" FROM ENTLOCK;
CREATE OR REPLACE VIEW EX_GONGSHANG_21_GCLSHTZXYQY(SCZTBM,QYMC,UNISCID,ND,UPDATETIME) AS SELECT ( CASE WHEN "left"("SOV".ENTITYNO, 4) = '4401' THEN "SOV".ENTITYNO ELSE ( SELECT "E".PRIPID FROM E_BASEINFO AS E WHERE "E".UNISCID = "SOV".REGISTERNUM UNION SELECT "E".PRIPID FROM E_BASEINFO AS E WHERE "E".REGNO = "SOV".REGISTERNUM LIMIT( 1)) END ) AS "SCZTBM","SOV".ORGANIZENAME AS "QYMC",( CASE WHEN "left"("SOV".REGISTERNUM, 1) = '9' THEN "SOV".REGISTERNUM ELSE ( SELECT "E".UNISCID FROM E_BASEINFO AS E WHERE "E".REGNO = "SOV".REGISTERNUM LIMIT( 1)) END ) AS "UNISCID","APV".APPRAISEANNUAL AS "ND",( CASE WHEN NOT ("SOV".UPDATETIMESTAMP IS NULL ) THEN "SOV".UPDATETIMESTAMP ELSE "SOV".CREATEDATE END ) AS "UPDATETIME" FROM CREV.SYS_ORGANIZE_VIEW AS SOV LEFT JOIN CREV.ADMIN_PROJECT_VIEW AS APV ON "SOV".ORGANIZEID = "APV".ORGANIZEID WHERE ( NOT ("APV".APPRAISEANNUAL IS NULL ) AND "APV".STATE = '6' );
CREATE OR REPLACE VIEW TB_BATCH_GS_LIST AS SELECT "B".ENTNAME AS "SNAME","T".WRITSNO AS "SBOOKCODE","T".CREATETIME AS "SPUBLICTIME",( CASE "T".WRITSTYPE WHEN '32' THEN '1' ELSE '2' END ) AS "SGSTYPE","T".LAUPTIME AS "UPDATETIME",IF( ("B".ISREMOVE = '1' OR "B".ISHEARINGPUBLISH != '1' OR "B".ISDECISIONPUBLISH != '1' ), '1', '0') AS "DELFLAG" FROM TSWRIT AS T LEFT JOIN BIZ_REV_ENT AS B ON ("T".PRIPID = "B".PRIPID AND "T".BIZSEQ = "B".BIZSEQ ) WHERE ("T".WRITSTYPE IN ('32', '33') AND NOT ("B".BIZSEQ IS NULL ) );
CREATE OR REPLACE VIEW v_fraud_info AS SELECT fe.id AS "id",fe.bizSeq AS "bizSeq",fe.pripid AS "pripid",fe.entName AS "entName",fe.uniScId AS "uniScId",fe.regNo AS "regNo",fe.regTime AS "regTime",fe.regItem AS "regItem",fe.regOrg AS "regOrg",fe.regOrg_cn AS "regOrg_cn",fe.tel AS "tel",fe.noticeFrom AS "noticeFrom",fe.noticeTo AS "noticeTo",fe.name AS "name",fe.handleResult AS "handleResult",fe.handleRea AS "handleRea",fe.handleRea_cn AS "handleRea_cn",fe.judAuth AS "judAuth",fe.judAuth_cn AS "judAuth_cn",fe.judDate AS "judDate",fe.create_by AS "create_by",fe.create_time AS "create_time",fe.update_by AS "update_by",fe.update_time AS "update_time",bf.complaintReason AS "complaintReason",bf.complainerName AS "complainerName",bf.complainerCertNo AS "complainerCertNo",bf.complainerEntName AS "complainerEntName",bf.status AS "status",bf.linkType AS "linkType",bf.business_Type AS "businessType",t.WORKFLOWID AS "workflowId" FROM aiccs.t_fraud_ent AS fe,aiccs.t_biz_fraud AS bf,aiccs.tstasklist AS t WHERE (fe.bizSeq = bf.bizSeq AND bf.bizSeq = t.BIZSEQID );

1298
db/init/AICRI/表.sql Normal file

File diff suppressed because it is too large Load Diff

3885
db/init/AICRIS/表.sql Normal file

File diff suppressed because it is too large Load Diff

409
db/init/AICRIS/视图.sql Normal file
View File

@ -0,0 +1,409 @@
CREATE OR REPLACE VIEW "AICTASK" ("RANINSTASKID","RANINSPLANID","RANINSTASKNAME","RANINSTYPE","RANINSITEM","RANINSOBJSCOPE","EXTRACTAUTH","EXTRACTFROM","EXTRACTTO","RANINSOBJNUM","RANINSOBJPROP","SLDINSOBJNUM","INSPNUM","INSDATEFROM","INSDATETO","INSAUTH","REMARK","DSTATE","ADDTASKID","ADDDEPID","ADDDEPNAME","LEADINGDEPID","CREATETIME","UPDATETIME","TASKASSIGNDEPT","VERIFYSTATE","GROUPNUM","DIVISION","EXTRACTAUTHCODE","INSAUTHCODE","RANINSPLANID1","PLANTYPE1")
AS
SELECT t."RANINSTASKID",t."RANINSPLANID",t."RANINSTASKNAME",t."RANINSTYPE",t."RANINSITEM",t."RANINSOBJSCOPE",t."EXTRACTAUTH",t."EXTRACTFROM",t."EXTRACTTO",t."RANINSOBJNUM",t."RANINSOBJPROP",t."SLDINSOBJNUM",t."INSPNUM",t."INSDATEFROM",t."INSDATETO",t."INSAUTH",t."REMARK",t."DSTATE",t."ADDTASKID",t."ADDDEPID",t."ADDDEPNAME",t."LEADINGDEPID",t."CREATETIME",t."UPDATETIME",t."TASKASSIGNDEPT",t."VERIFYSTATE",t."GROUPNUM",t."DIVISION",t."EXTRACTAUTHCODE",t."INSAUTHCODE" , p1.RANINSPLANID AS RANINSPLANID1 , p1.PLANTYPE AS PLANTYPE1
FROM RANINSTASK t LEFT JOIN RANINSPLAN p1 ON t.RANINSPLANID = p1.RANINSPLANID
WHERE p1.PLANTYPE ='1'
AND ( p1.DEPNAME LIKE '%市场和质量%' or p1.DEPNAME LIKE '%机场分局%'
or p1.DEPNAME LIKE '%工商行政%' )
UNION
-- 跨部门任务
SELECT t."RANINSTASKID",t."RANINSPLANID",t."RANINSTASKNAME",t."RANINSTYPE",t."RANINSITEM",t."RANINSOBJSCOPE",t."EXTRACTAUTH",t."EXTRACTFROM",t."EXTRACTTO",t."RANINSOBJNUM",t."RANINSOBJPROP",t."SLDINSOBJNUM",t."INSPNUM",t."INSDATEFROM",t."INSDATETO",t."INSAUTH",t."REMARK",t."DSTATE",t."ADDTASKID",t."ADDDEPID",t."ADDDEPNAME",t."LEADINGDEPID",t."CREATETIME",t."UPDATETIME",t."TASKASSIGNDEPT",t."VERIFYSTATE",t."GROUPNUM",t."DIVISION",t."EXTRACTAUTHCODE",t."INSAUTHCODE" , p.RANINSPLANID AS RANINSPLANID , p.PLANTYPE AS PLANTYPE
FROM RANINSTASK t LEFT JOIN RANINSPLAN p ON t.RANINSPLANID = p.RANINSPLANID
WHERE p.PLANTYPE ='2'
AND t.RANINSTASKID IN (
SELECT i.RANINSTASKID FROM RANTASKISSUED i LEFT JOIN T_ORGUNITS o ON i.DEPID = o.ORGUNITID
WHERE i.RANINSTASKID IN (
SELECT RANINSTASKID FROM RANINSTASK WHERE RANINSPLANID IN (
SELECT RANINSPLANID FROM RANINSPLAN WHERE PLANTYPE ='2')
) AND ( o.ORGUNITNAME LIKE '%市场和质量%' or o.ORGUNITNAME LIKE '%机场分局%'
or o.ORGUNITNAME LIKE '%工商行政%' )
);
CREATE OR REPLACE VIEW "CHECKQUARANTINE" ("USERCARDID","TASKNAME","INSTYPE","PLANTYPE","ENTNAME","CHECKTIME","STATUS","ID","REPID","RANINSTASKID")
AS
select oi.userCardId, -- 检查人身份证
t.taskName, -- 任务名
t.insType, -- 抽查类型 1 定向 2不定向
t.planType, -- 计划类型 1 内部计划 2 联合计划
oi.entName, -- 企业名称
e.checkTime, --
e.status, -- 是否完成检查 1已完成 2 未完成(结果全部录入,才会已完成)
e.id, -- 抽查主体状态 主键
e.repId, -- 法人主键id企业主键字段无效法人主键就是企业主键
e.RanInsTaskID -- 抽查任务编号
from raninsObjInsp oi , taskInside t,RanInsEnterpriseDstate e;
CREATE OR REPLACE VIEW "GROUPINFO" ("GROUPID","RANINSTASKID","GROUPLEAD","LOCDISTRICT","DEPTYPE")
AS
select g.groupid,
g.RanInsTaskID as ranInsTaskId,
r.ID as groupLead,
r.LocDistrict as locDistrict ,
u.orgUnitType as depType
from RanInsGroup g,RanInsGroupInsp r,RanInsInspectors u
where g.groupid = r.groupid and r.isLead = '1' and r.ID = u.ID;
CREATE OR REPLACE VIEW "INSWORKQUERY" ("RANINSPLANID","ENTNUM","REMARK","DEPNAME","PLANTYPE","SUBTIME","CREATETIME","RANINSPLANNAME","RANINSTASKID","RANINSTASKNAME","RANINSTYPE","EXTRACTFROM","EXTRACTTO","INSDATEFROM","INSDATETO","DEPID","USERIMPORT","ISIMPORT","ISSUED","EXECUTESTATE")
AS
(
select
p.RANINSPLANID,p.ENTNUM,p.REMARK,p.DEPNAME,p.PLANTYPE,p.SUBTIME,p.CREATETIME,p.RANINSPLANNAME,
t.RANINSTASKID,t.RANINSTASKNAME,t.RANINSTYPE,t.EXTRACTFROM,t.EXTRACTTO,
t.INSDATEFROM,t.INSDATETO,
i.DEPID ,i.USERIMPORT,i.ISIMPORT,i.ISSUED,
case when i.TIId is null then 0 when i.isFinish = '1' then 1 else 0 END executeState
from RanInsPlan p left join RanInsTask t on p.RanInsPlanID = t.RanInsPlanID
left join RanTaskIssued i on i.RanInsTaskID = t.RanInsTaskID);
CREATE OR REPLACE VIEW "INSWORKQUERYTASK" ("RANINSTASKID","RANINSTASKNAME","RANINSTYPE","EXTRACTFROM","EXTRACTTO","DEPID","USERIMPORT","ISIMPORT","ISSUED","INSDATEFROM","INSDATETO","EXECUTESTATE")
AS
(
select t.RANINSTASKID,t.RANINSTASKNAME,t.RANINSTYPE,t.EXTRACTFROM,t.EXTRACTTO,
i.DEPID ,i.USERIMPORT,i.ISIMPORT,i.ISSUED, t.INSDATEFROM,t.INSDATETO,
case when i.TIId is null then 0 when i.isFinish = '1' then 1 else 0 END executeState
from RanInsTask t left join RanTaskIssued i on i.RanInsTaskID = t.RanInsTaskID);
CREATE OR REPLACE VIEW "KBM_USERTASK" ("RANINSTASKID","RANINSTASKNAME","RANINSPLANID","RANINSPLANNAME","EXTRACTFROM","EXTRACTTO","TASKASSIGNDEPT","TYPE","DEPID","PLANTYPE","LEADINGDEPID")
AS
(select t.RANINSTASKID,t.ranInsTaskName,p.RanInsPlanID,p.RanInsPlanName ,t.extractFrom,t.EXTRACTTO
,t.taskAssignDept,'1',t.LEADINGDEPID,p.planType,t.LEADINGDEPID
from RanInsTaskTemp t,raninsPlanTemp p
where t.ranInsPlanID = p.ranInsPlanID and t.VERIFYSTATE ='3' and t.cover='1'--
and not exists(select 1 from RANTASKISSUED i where t.RANINSTASKID = i.RANINSTASKID )
UNION
--parentID为空时
select rt.RANINSTASKID,rt.ranInsTaskName ,rp.RanInsPlanID,rp.RanInsPlanName
,rt.extractFrom,rt.EXTRACTTO,null,'2' ,i.DEPID,rp.planType,rt.LEADINGDEPID
from RANTASKISSUED i ,RANINSTASK rt ,RANINSPLAN rp
where i.RANINSTASKID = rt.RANINSTASKID and rt.ranInsPlanID = rp.ranInsPlanID
and i.ISSUED = '0'and i.dstate !='2' and i.isFinish = '0' and i.PARENTID IS NULL
UNION
--99
select rt.RANINSTASKID,rt.ranInsTaskName ,rp.RanInsPlanID,rp.RanInsPlanName
,rt.extractFrom,rt.EXTRACTTO,null,'99' ,i.DEPID,rp.planType,rt.LEADINGDEPID
from RANTASKISSUED i ,RANINSTASK rt ,RANINSPLAN rp
where i.RANINSTASKID = rt.RANINSTASKID and rt.ranInsPlanID = rp.ranInsPlanID
and i.dstate !='2' and i.isFinish = '0' and i.USERIMPORT='99'
UNION
--
select rt.RANINSTASKID,rt.ranInsTaskName ,rp.RanInsPlanID,rp.RanInsPlanName
,rt.extractFrom,rt.EXTRACTTO,null,'51' ,i.DEPID,rp.planType,rt.LEADINGDEPID
from RANTASKISSUED i ,RANINSTASK rt ,RANINSPLAN rp
where i.RANINSTASKID = rt.RANINSTASKID and rt.ranInsPlanID = rp.ranInsPlanID
and i.dstate !='2' and i.isFinish = '0' and i.USERIMPORT='51'
UNION
--
select rt.RANINSTASKID,rt.ranInsTaskName ,rp.RanInsPlanID,rp.RanInsPlanName
,rt.extractFrom,rt.EXTRACTTO,null,'52' ,i.DEPID,rp.planType,rt.LEADINGDEPID
from RANTASKISSUED i ,RANINSTASK rt ,RANINSPLAN rp
where i.RANINSTASKID = rt.RANINSTASKID and rt.ranInsPlanID = rp.ranInsPlanID
and i.dstate !='2' and i.isFinish = '0' and i.USERIMPORT='52'
UNION
--
select rt.RANINSTASKID,rt.ranInsTaskName ,rp.RanInsPlanID,rp.RanInsPlanName
,rt.extractFrom,rt.EXTRACTTO,null,'61' ,i.DEPID,rp.planType,rt.LEADINGDEPID
from RANTASKISSUED i ,RANINSTASK rt ,RANINSPLAN rp
where i.RANINSTASKID = rt.RANINSTASKID and rt.ranInsPlanID = rp.ranInsPlanID
and i.dstate !='2' and i.isFinish = '0' and i.USERIMPORT='61'
UNION
--
select rt.RANINSTASKID,rt.ranInsTaskName ,rp.RanInsPlanID,rp.RanInsPlanName
,rt.extractFrom,rt.EXTRACTTO,null,'62' ,i.DEPID,rp.planType,rt.LEADINGDEPID
from RANTASKISSUED i ,RANINSTASK rt ,RANINSPLAN rp
where i.RANINSTASKID = rt.RANINSTASKID and rt.ranInsPlanID = rp.ranInsPlanID
and i.dstate !='2' and i.isFinish = '0' and i.USERIMPORT='62'
UNION
--
select rt.RANINSTASKID,rt.ranInsTaskName ,rp.RanInsPlanID,rp.RanInsPlanName
,rt.extractFrom,rt.EXTRACTTO,null,'4' ,i.DEPID,rp.planType,rt.LEADINGDEPID
from RANTASKISSUED i ,RANINSTASK rt ,RANINSPLAN rp
where i.RANINSTASKID = rt.RANINSTASKID and rt.ranInsPlanID = rp.ranInsPlanID
and i.dstate !='2' and i.isFinish = '0' and i.FINALSTEP='1'
);
CREATE OR REPLACE VIEW "OAPPPERINFORMATION" ("APPPERINFORMATIONID","TASKID","ENTNO","REGNO","UNISCID","ENTNAME","ORGCODE","APPPERCARDID","APPPERNAME","APPPERCONTENT","PRINCIPAL","APPPERSTARTTIME","APPPERENDTIME","RELEASEAUTHORYKEY","RELEASEAUTHORYVALUE","ENTRYPEOPLE","ENTRYTIME","ACCESSORY","STATUS")
AS
select LICID appPerInformationID,
null taskID,
PRIPID entNo,
RegNO regNo,
UniSCID UniSCID,
EntName entName,
null orgCode,
LicNO appPerCardID,
LicName_CN appPerName,
LicItem appPerContent,
null principal,
ValFrom appPerStartTime,
ValTo appPerEndTime,
null releaseAuthoryKey,
LicAnth releaseAuthoryValue,
null entryPeople,
null entryTime, null accessory, Status status
from CPLICINFO_QT;
CREATE OR REPLACE VIEW "RANDOMRESULT" ("ENTNAME","GROUPNAME","NAME","MOBILE","RANINSID")
AS
SELECT
e.entname,
g.GROUPNAME,
ins.NAME,
ins.MOBTEL,
oi.RanInsTaskID
FROM
RANINSOBJINSP oi ,RANINSINSPECTORS ins
,RANINSOBJGROUP og,RANINSGROUP g, RANINSENTERPRISEDSTATE e
WHERE
oi.usercardid = ins.id and oi.repid = og.repid
and og.GROUPID = g.GROUPID
and oi.repid = e.repid
and oi.RanInsTaskID = e.RanInsTaskID
and og.RanInsTaskID = g.RanInsTaskID
and oi.RanInsTaskID = og.RanInsTaskID;
CREATE or replace
VIEW SJZX_RANINSInspectors AS
SELECT
ID,
NAME,
SEX,
MOBTEL,
LAWOFFICE,
LAWDEP,
LAWPOSITION,
LAWCERNO,
LAWISSAUTH,
DSTATE,
ORGUNITID,
ORGUNITTYPE,
CREATETIME,
UPDATETIME,
LOCDISTRICT,
REGIONID,
DEPARTMENTID,
CIVILSERVANT,
ISEEXPERT,
INSTYPE
FROM AICRIS.RANINSInspectors sfc
WHERE ORGUNITID IN
(SELECT ORGUNITID FROM AICORG.T_ORGUNITS WHERE UNITTYPE='1' AND DELETED='0'
START WITH ORGUNITID ='001' CONNECT BY PRIOR ORGUNITID=PARENTID);
CREATE or replace
VIEW SJZX_RANINSITEM AS
SELECT
RANINSITEM,
RANINSITEMNAME,
RANINSBASIS,
RANINSCONT,
USERID,
DEPID,
DEPNAME,
CREATETIME,
UPDATETIME,
DSTATE,
RANINSOBJTYPE,
INSCHECKTYPE,
DEPTYPE,
REGIONID,
ITEMOBJPROP,
ITEMCOUNT,
ITEMOBJ,
ITEMENTER,
ITEMMODE,
ITEMCATEGORY,
CHECKCATEGORY
FROM AICRIS.RANINSITEM WHERE depid IN
(SELECT ORGUNITID FROM AICORG.T_ORGUNITS WHERE UNITTYPE='1' AND DELETED='0'
START WITH ORGUNITID ='001' CONNECT BY PRIOR ORGUNITID=PARENTID);
CREATE or replace
VIEW SJZX_RANINSOBJINSP AS
WITH TaskCTE AS (
SELECT DISTINCT
t.RANINSTASKID
FROM
AICRIS.RANINSTASK t
INNER JOIN AICRIS.RANINSPLAN p ON (p.RANINSPLANID = t.RANINSPLANID AND p.DSTATE <> '2' AND p.PLANTYPE = '1')
INNER JOIN AICRIS.RanInsEnterpriseDstate r ON (r.raninstaskid = t.raninstaskid AND r.verifyState = '0')
WHERE
t.DSTATE <> '2'
AND t.createtime >= TO_DATE('2025-01-01')
AND t.adddepid IN (
SELECT o.ORGUNITID
FROM AICORG.T_ORGUNITS o
WHERE o.deleted = '0' AND o.unittype = '1'
START WITH o.orgnumber = '44010000'
CONNECT BY PRIOR o.ORGUNITID = o.PARENTID
)
)
SELECT
insp.ID,
insp.USERID,
insp.RANINSTASKID,
insp.ENTNO,
insp.ENTNAME,
insp.REPID,
insp.USERCARDID,
insp.REPTYPE,
insp.LOCDISTRICT,
insp.ORGNUMBER,
insp.CREATETIME,
insp.ASSIGNSTATE
FROM
AICRIS.RANINSOBJINSP insp
INNER JOIN TaskCTE task ON (insp.RANINSTASKID = task.RANINSTASKID)
WHERE
NOT EXISTS (
SELECT 1
FROM AICRIS.RANINSRESULT r
WHERE
r.pripid = insp.ENTNO
AND r.raninstaskid = insp.raninstaskid
);
CREATE OR REPLACE VIEW "TASKINSIDE" ("TASKID","TASKNAME","PLANID","PLANNAME","PLANTYPE","INSTYPE","SCOPEOBJ","PROP","INSPNUM","RANINSITEM","EXTRACTFROM","EXTRACTTO","SLDINSOBJNUM","REMARK","LEADINGDEPID","INSDATEFROM","INSDATETO")
AS
select
rt.ranInsTaskID taskId, -- 任务id
rt.ranInsTaskName taskName, --
rp.RanInsPlanID planID, -- 抽查计划编号
rp.RanInsPlanName planName, --
rp.planType planType, -- 计划类型 1 内部计划 2 联合计划
rt.ranInsType insType, -- 抽查类型 1 定向 2不定向
rt.ranInsObjScope scopeObj, --
rt.ranInsObjProp prop, -- 抽查对象比例
rt.inspNum inspNum, --
rt.ranInsItem ranInsItem, -- 抽查事项描述
rt.extractFrom extractFrom,--
rt.extractTo extractTo,--
rt.sldInsObjNum sldInsObjNum, -- 应查对象总数
rt.remark remark, -- 备注
rt.leadingDepId leadingDepId, --id
rt.insDateFrom insDateFrom, -- 检查日期自
rt.insDateTo insDateTo -- 检查日期至
-- rt.isMatching isMatching --是否完成任务匹配 1 是 0 否
from RanInsTask rt left join RanInsPlan rp on rt.RanInsPlanID = rp.RanInsPlanID where rp.dstate!='2' and rt.dstate!='2';
CREATE OR REPLACE VIEW "TASKINSIDETEMP" ("TASKID","TASKNAME","PLANID","PLANNAME","PLANTYPE","INSTYPE","SCOPEOBJ","PROP","INSPNUM","RANINSITEM","EXTRACTFROM","EXTRACTTO","SLDINSOBJNUM","REMARK","LEADINGDEPID")
AS
select
rt.ranInsTaskID taskId, -- 任务id
rt.ranInsTaskName taskName, --
rp.RanInsPlanID planID, -- 抽查计划编号
rp.RanInsPlanName planName, --
rp.planType planType, -- 计划类型 1 内部计划 2 联合计划
rt.ranInsType insType, -- 抽查类型 1 定向 2不定向
rt.ranInsObjScope scopeObj, --
rt.ranInsObjProp prop, -- 抽查对象比例
rt.inspNum inspNum, --
rt.ranInsItem ranInsItem, -- 抽查事项描述
rt.extractFrom extractFrom,--
rt.extractTo extractTo,--
rt.sldInsObjNum sldInsObjNum, -- 应查对象总数
rt.remark remark, -- 备注
rt.leadingDepId leadingDepId --id
-- rt.isMatching isMatching --是否完成任务匹配 1 是 0 否
from RanInsTaskTemp rt left join RanInsPlanTemp rp on rt.RanInsPlanID = rp.RanInsPlanID where rp.dstate!='2' and rt.dstate!='2';
CREATE OR REPLACE VIEW "TASKOBJVERIFIED" ("RANINSTASKID","RANINSPLANID","RANINSTASKNAME","RANINSTYPE","RANINSITEM","RANINSOBJSCOPE","EXTRACTAUTH","EXTRACTFROM","EXTRACTTO","RANINSOBJNUM","RANINSOBJPROP","SLDINSOBJNUM","INSPNUM","INSDATEFROM","INSDATETO","INSAUTH","REMARK","DSTATE","ADDTASKID","ADDDEPID","ADDDEPNAME","LEADINGDEPID","CREATETIME","UPDATETIME","TASKASSIGNDEPT","VERIFYSTATE","GROUPNUM","DEPARTMENTID")
AS
select a."RANINSTASKID",a."RANINSPLANID",a."RANINSTASKNAME",a."RANINSTYPE",a."RANINSITEM",a."RANINSOBJSCOPE",a."EXTRACTAUTH",a."EXTRACTFROM",a."EXTRACTTO",a."RANINSOBJNUM",a."RANINSOBJPROP",a."SLDINSOBJNUM",a."INSPNUM",a."INSDATEFROM",a."INSDATETO",a."INSAUTH",a."REMARK",a."DSTATE",a."ADDTASKID",a."ADDDEPID",a."ADDDEPNAME",a."LEADINGDEPID",a."CREATETIME",a."UPDATETIME",a."TASKASSIGNDEPT",a."VERIFYSTATE",a."GROUPNUM",p."DEPARTMENTID"
from RANINSTASK a,raninsplan p
where p.RANINSPLANID = a.RANINSPLANID and p.PLANTYPE ='1'
and exists(
select 1 from RANTASKISSUED d where a.raninstaskid = d.raninstaskid and d.dstate !='2' having count(d.raninstaskid)>1
)and not exists(
select 1 from RANTASKISSUED b , RANTASKISSUED c where b.tiid = c.parentid and a.raninstaskid = b.raninstaskid
and b.parentid is null
and c.VERIFYSTATE != '3')
---
UNION ALL
select t."RANINSTASKID",t."RANINSPLANID",t."RANINSTASKNAME",t."RANINSTYPE",t."RANINSITEM",t."RANINSOBJSCOPE",t."EXTRACTAUTH",t."EXTRACTFROM",t."EXTRACTTO",t."RANINSOBJNUM",t."RANINSOBJPROP",t."SLDINSOBJNUM",t."INSPNUM",t."INSDATEFROM",t."INSDATETO",t."INSAUTH",t."REMARK",t."DSTATE",t."ADDTASKID",t."ADDDEPID",t."ADDDEPNAME",t."LEADINGDEPID",t."CREATETIME",t."UPDATETIME",t."TASKASSIGNDEPT",t."VERIFYSTATE",t."GROUPNUM",p."DEPARTMENTID"
from RANINSTASK t , raninsplan p
WHERE p.RANINSPLANID = t.RANINSPLANID AND p.PLANTYPE ='2'
and exists(
select 1 from RANTASKISSUED i where i.raninstaskid = t.raninstaskid and FINALSTEP='1'
and i.VERIFYSTATE = '3'
);
CREATE OR REPLACE VIEW "TASKVERIFIED" ("RANINSTASKID","RANINSPLANID","RANINSTASKNAME","RANINSTYPE","RANINSITEM","RANINSOBJSCOPE","EXTRACTAUTH","EXTRACTFROM","EXTRACTTO","RANINSOBJNUM","RANINSOBJPROP","SLDINSOBJNUM","INSPNUM","INSDATEFROM","INSDATETO","INSAUTH","REMARK","DSTATE","ADDTASKID","ADDDEPID","ADDDEPNAME","LEADINGDEPID","CREATETIME","UPDATETIME","TASKASSIGNDEPT","VERIFYSTATE","GROUPNUM","DEPARTMENTID")
AS
select a."RANINSTASKID",a."RANINSPLANID",a."RANINSTASKNAME",a."RANINSTYPE",a."RANINSITEM",a."RANINSOBJSCOPE",a."EXTRACTAUTH",a."EXTRACTFROM",a."EXTRACTTO",a."RANINSOBJNUM",a."RANINSOBJPROP",a."SLDINSOBJNUM",a."INSPNUM",a."INSDATEFROM",a."INSDATETO",a."INSAUTH",a."REMARK",a."DSTATE",a."ADDTASKID",a."ADDDEPID",a."ADDDEPNAME",a."LEADINGDEPID",a."CREATETIME",a."UPDATETIME",a."TASKASSIGNDEPT",a."VERIFYSTATE",a."GROUPNUM",p."DEPARTMENTID"
from RANINSTASK a,raninsplan p
where p.RANINSPLANID = a.RANINSPLANID and p.PLANTYPE ='1'
and a.VERIFYSTATE = '3'
UNION ALL
select t."RANINSTASKID",t."RANINSPLANID",t."RANINSTASKNAME",t."RANINSTYPE",t."RANINSITEM",t."RANINSOBJSCOPE",t."EXTRACTAUTH",t."EXTRACTFROM",t."EXTRACTTO",t."RANINSOBJNUM",t."RANINSOBJPROP",t."SLDINSOBJNUM",t."INSPNUM",t."INSDATEFROM",t."INSDATETO",t."INSAUTH",t."REMARK",t."DSTATE",t."ADDTASKID",t."ADDDEPID",t."ADDDEPNAME",t."LEADINGDEPID",t."CREATETIME",t."UPDATETIME",t."TASKASSIGNDEPT",t."VERIFYSTATE",t."GROUPNUM",p."DEPARTMENTID"
from RANINSTASK t , raninsplan p
WHERE p.RANINSPLANID = t.RANINSPLANID AND p.PLANTYPE ='2'
and t.VERIFYSTATE ='3';
CREATE OR REPLACE VIEW "TB_DSM_SPOT_CHECK_RESULT" ("SAUTOID","SCHECKID","SENTID","SRESULTTYPECODE","SRESULTTYPENAME","SBOOKCODE","DTCORRECTIONDATE","SCORRECTIONFLAG","SFLAG")
AS
select RESULTID as SAUTOID,RANINSTASKID as SCHECKID ,REPID as SENTID ,RANINSCHECKRES as SRESULTTYPECODE,RANINSITEMNAME as SRESULTTYPENAME,null as SBOOKCODE,
null as DTCORRECTIONDATE,null as SCORRECTIONFLAG ,'0' as SFLAG
from RANINSRESULT t;
CREATE OR REPLACE VIEW "TEST_AICTASK" ("RANINSTASKID","RANINSPLANID","RANINSTASKNAME","RANINSTYPE","RANINSITEM","RANINSOBJSCOPE","EXTRACTAUTH","EXTRACTFROM","EXTRACTTO","RANINSOBJNUM","RANINSOBJPROP","SLDINSOBJNUM","INSPNUM","INSDATEFROM","INSDATETO","INSAUTH","REMARK","DSTATE","ADDTASKID","ADDDEPID","ADDDEPNAME","LEADINGDEPID","CREATETIME","UPDATETIME","TASKASSIGNDEPT","VERIFYSTATE","GROUPNUM","DIVISION","EXTRACTAUTHCODE","INSAUTHCODE","RANINSPLANID1","PLANTYPE1")
AS
SELECT t."RANINSTASKID",t."RANINSPLANID",t."RANINSTASKNAME",t."RANINSTYPE",t."RANINSITEM",t."RANINSOBJSCOPE",t."EXTRACTAUTH",t."EXTRACTFROM",t."EXTRACTTO",t."RANINSOBJNUM",t."RANINSOBJPROP",t."SLDINSOBJNUM",t."INSPNUM",t."INSDATEFROM",t."INSDATETO",t."INSAUTH",t."REMARK",t."DSTATE",t."ADDTASKID",t."ADDDEPID",t."ADDDEPNAME",t."LEADINGDEPID",t."CREATETIME",t."UPDATETIME",t."TASKASSIGNDEPT",t."VERIFYSTATE",t."GROUPNUM",t."DIVISION",t."EXTRACTAUTHCODE",t."INSAUTHCODE" , p1.RANINSPLANID AS RANINSPLANID1 , p1.PLANTYPE AS PLANTYPE1
FROM RANINSTASK t LEFT JOIN RANINSPLAN p1 ON t.RANINSPLANID = p1.RANINSPLANID
WHERE p1.PLANTYPE ='1' AND t.DSTATE!='2' AND p1.DSTATE!='2'
AND ( p1.DEPNAME LIKE '%市场和质量%' or p1.DEPNAME LIKE '%机场分局%'
or p1.DEPNAME LIKE '%工商行政%' )
UNION
-- 跨部门任务
SELECT t."RANINSTASKID",t."RANINSPLANID",t."RANINSTASKNAME",t."RANINSTYPE",t."RANINSITEM",t."RANINSOBJSCOPE",t."EXTRACTAUTH",t."EXTRACTFROM",t."EXTRACTTO",t."RANINSOBJNUM",t."RANINSOBJPROP",t."SLDINSOBJNUM",t."INSPNUM",t."INSDATEFROM",t."INSDATETO",t."INSAUTH",t."REMARK",t."DSTATE",t."ADDTASKID",t."ADDDEPID",t."ADDDEPNAME",t."LEADINGDEPID",t."CREATETIME",t."UPDATETIME",t."TASKASSIGNDEPT",t."VERIFYSTATE",t."GROUPNUM",t."DIVISION",t."EXTRACTAUTHCODE",t."INSAUTHCODE" , p.RANINSPLANID AS RANINSPLANID , p.PLANTYPE AS PLANTYPE
FROM RANINSTASK t LEFT JOIN RANINSPLAN p ON t.RANINSPLANID = p.RANINSPLANID
WHERE p.PLANTYPE ='2' AND t.DSTATE!='2' AND p.DSTATE!='2'
AND t.RANINSTASKID IN (
SELECT i.RANINSTASKID FROM RANTASKISSUED i LEFT JOIN T_ORGUNITS o ON i.DEPID = o.ORGUNITID
WHERE i.RANINSTASKID IN (
SELECT RANINSTASKID FROM RANINSTASK WHERE RANINSPLANID IN (
SELECT RANINSPLANID FROM RANINSPLAN WHERE PLANTYPE ='2')
) AND ( o.ORGUNITNAME LIKE '%市场和质量%' or o.ORGUNITNAME LIKE '%机场分局%'
or o.ORGUNITNAME LIKE '%工商行政%' )
);
CREATE OR REPLACE VIEW "TRENTPRISETYPE" ("ENTTYPEID","DISPLAYVALUE","PRINTVALUE","PENTTYPEID","ECOPROPERTY","CORPORATION","STANDARD","PARTYTYPE")
AS
SELECT
ENTTYPEID AS ENTTYPEID ,
DISPLAYVALUE ,
PRINTVALUE ,
PENTTYPEID AS PENTTYPEID ,
ECOPROPERTY AS ECOPROPERTY ,
CORPORATION ,
STANDARD,
' ' AS PARTYTYPE
FROM
EnterpriseTypes;
CREATE OR REPLACE VIEW "USERTASK" ("RANINSTASKID","RANINSTASKNAME","RANINSPLANID","RANINSPLANNAME","EXTRACTFROM","EXTRACTTO","TASKASSIGNDEPT",
"TYPE","DEPID","PLANTYPE","LEADINGDEPID","CREATETIME","ISZHCYCTYPE")
AS
(select t.RANINSTASKID,t.ranInsTaskName,p.RanInsPlanID,p.RanInsPlanName ,t.extractFrom,t.EXTRACTTO
,t.taskAssignDept,'1',null,p.planType ,t.LEADINGDEPID,t.CREATETIME,t.isZhcycType
from RanInsTaskTemp t,raninsPlanTemp p
where t.ranInsPlanID = p.ranInsPlanID and t.VERIFYSTATE ='3' and t.cover='1'--
and t.dstate!='2' and p.dstate!='2'
and not exists(select 1 from RANTASKISSUED i where t.RANINSTASKID = i.RANINSTASKID and i.dstate !='2')
UNION
-- id找
select rt.RANINSTASKID,rt.ranInsTaskName ,rp.RanInsPlanID,rp.RanInsPlanName
,rt.extractFrom,rt.EXTRACTTO,null,'2' ,i.DEPID,rp.planType ,rt.LEADINGDEPID,rt.CREATETIME,rt.isZhcycType
from RANTASKISSUED i ,RANINSTASK rt ,RANINSPLAN rp
where i.RANINSTASKID = rt.RANINSTASKID and rt.ranInsPlanID = rp.ranInsPlanID
and i.ISSUED = '0' and i.dstate !='2' and rt.dstate !='2' and rp.dstate !='2'
and i.isFinish = '0' and i.isImport in ('3')
---退
UNION
SELECT t.RANINSTASKID,t.ranInsTaskName,p.RanInsPlanID,p.RanInsPlanName ,t.extractFrom,t.EXTRACTTO
,t.taskAssignDept,'1',null,p.planType ,t.LEADINGDEPID,t.CREATETIME,t.isZhcycType
from RanInsTaskTemp t,raninsPlanTemp p
where t.ranInsPlanID = p.ranInsPlanID and t.dstate!='2' and p.dstate!='2'
AND exists(select 1 from RanInsTask t1 where t.raninstaskid = t1.raninstaskid and t1.dstate !='2' having count(t1.raninstaskid)>0)
AND t.VERIFYSTATE ='0'
);

10360
db/init/CRGS/表.sql Normal file

File diff suppressed because it is too large Load Diff

10360
db/init/CRGS/视图.sql Normal file

File diff suppressed because it is too large Load Diff

787
db/init/CXAICORG/表.sql Normal file
View File

@ -0,0 +1,787 @@
CREATE TABLE "CXAICORG"."AICCODE"
(
"AICID" VARCHAR(40) NOT NULL,
"ORGUNITNAME" VARCHAR(200),
"SHORTNAME" VARCHAR(20),
"AREA_CODE" VARCHAR(40),
NOT CLUSTER PRIMARY KEY("AICID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."GDSZTK_G1010_1V6"
(
"ID" INT NOT NULL,
"G101000" VARCHAR(100),
"G101001" VARCHAR(14),
"G101002" VARCHAR(1000),
"G101003" VARCHAR(510),
"G101004" VARCHAR(16),
"G101005" CLOB,
"G101006" VARCHAR(4),
"G101007" VARCHAR(510),
"G101008" DATE,
"G101009" DATE,
"G101010" INT,
"G101011" VARCHAR(1000),
"G101012" TIMESTAMP(0),
"G101013" VARCHAR(400),
"G101014" VARCHAR(40),
"G101015" VARCHAR(18),
"ADD_TIME" TIMESTAMP(0),
"CD_TIME" TIMESTAMP(0),
"CD_OPERATION" VARCHAR(2),
"CD_BATCH" VARCHAR(100),
"DMP_SHARE_CD_TIME_IDATAT" TIMESTAMP(0),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."ADD_TIME" IS '创建时间';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."CD_BATCH" IS '批次号';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."CD_OPERATION" IS '增量标识';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."CD_TIME" IS '变更时间';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."DMP_SHARE_CD_TIME_IDATAT" IS '运营方技术字段,非业务字段,请忽略并勿使用';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."G101000" IS '主键ID';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."G101001" IS '法律法规文件编码';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."G101002" IS '法律法规文件名称';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."G101003" IS '法律法规文件发文文号';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."G101004" IS '版本号';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."G101005" IS '题注,制定机构、审议通过机构、通过日期等';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."G101006" IS '效力级别';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."G101007" IS '发布机关';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."G101008" IS '颁布日期';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."G101009" IS '实施日期';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."G101010" IS '时效性';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."G101011" IS '数据来源,法律法规文本获取渠道';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."G101012" IS '入库时间,是指录入“两平台”法律法规库的时间';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."G101013" IS '数据编目挂接单位名称';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."G101014" IS '数据编目挂接单位统一社会信用代码';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."G101015" IS '数据编目挂接单位行政区划,符合GB/T 2260的要求镇街可以使用民政部的镇街行政区划代码';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1010_1V6"."ID" IS '标识ID,标识ID为了满足共享平台编码标准无实际业务意义';
CREATE TABLE "CXAICORG"."GDSZTK_G1020_UHN"
(
"ID" INT NOT NULL,
"G102000" VARCHAR(100),
"G101000" VARCHAR(100),
"G101001" VARCHAR(14),
"G102001" VARCHAR(50),
"G102002" CLOB,
"G102003" VARCHAR(400),
"G102004" VARCHAR(40),
"G102005" VARCHAR(18),
"ADD_TIME" TIMESTAMP(0),
"CD_TIME" TIMESTAMP(0),
"CD_OPERATION" VARCHAR(2),
"CD_BATCH" VARCHAR(100),
"DMP_SHARE_CD_TIME_IDATAT" TIMESTAMP(0),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1020_UHN"."ADD_TIME" IS '创建时间,业务表的数据首次创建的时间';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1020_UHN"."CD_BATCH" IS '批次号,由8位日期+7位阿拉伯数据序列号组成当天数据序号递增。如数据日期20200101数据序号0000001则批次号为202001010000001';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1020_UHN"."CD_OPERATION" IS '增量标识,I新增U修改D删除';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1020_UHN"."CD_TIME" IS '变更时间,业务表的数据发生修 改的时 间,如果是第一次新增,则与新增时间一致。';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1020_UHN"."DMP_SHARE_CD_TIME_IDATAT" IS '运营方技术字段,非业务字段,请忽略并勿使用';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1020_UHN"."G101000" IS '法律法规文件基本信息主键ID,关联法律法规基础信息表G101000字段';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1020_UHN"."G101001" IS '法律法规文件编码';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1020_UHN"."G102000" IS '主键ID';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1020_UHN"."G102001" IS '法律法规文件条款内容编码';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1020_UHN"."G102002" IS '法律法规文件条款内容';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1020_UHN"."G102003" IS '数据编目挂接单位名称';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1020_UHN"."G102004" IS '数据编目挂接单位统一社会信用代码';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1020_UHN"."G102005" IS '数据编目挂接单位行政区划,符合GB/T 2260的要求镇街可以使用民政部的镇街行政区划代码';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_G1020_UHN"."ID" IS '标识ID,标识ID为了满足共享平台编码标准无实际业务意义';
CREATE TABLE "CXAICORG"."GDSZTK_Z2010"
(
"ID" INT NOT NULL,
"Z201000" VARCHAR(100),
"Z301000" VARCHAR(100),
"Z201001" VARCHAR(400),
"Z201002" VARCHAR(36),
"Z201003" VARCHAR(100),
"Z201004" VARCHAR(200),
"Z201005" VARCHAR(12),
"Z201006" VARCHAR(100),
"Z201007" VARCHAR(100),
"Z201008" VARCHAR(200),
"Z201009" VARCHAR(400),
"Z201010" VARCHAR(4),
"Z201011" VARCHAR(4),
"Z201012" VARCHAR(1000),
"Z201013" VARCHAR(18),
"Z201014" DATE,
"Z201015" VARCHAR(4),
"Z201016" VARCHAR(4),
"Z201017" VARCHAR(400),
"Z201018" INT,
"Z201019" VARCHAR(400),
"Z201020" VARCHAR(40),
"Z201021" VARCHAR(18),
"ADD_TIME" TIMESTAMP(0),
"CD_TIME" TIMESTAMP(0),
"CD_OPERATION" VARCHAR(2),
"CD_BATCH" VARCHAR(100),
"OPT_AREA_CODE" VARCHAR(40),
"OPT_FIELD_CODE" VARCHAR(40),
"OPT_SUBJECT_ID" VARCHAR(72),
"OPT_SUBJECT_NAME" VARCHAR(100),
"OPT_DEPT_ID" VARCHAR(72),
"OPT_DEPT_NAME" VARCHAR(100),
"DMP_SHARE_CD_TIME_IDATAT" TIMESTAMP(0),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."ADD_TIME" IS '创建时间';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."CD_BATCH" IS '批次号';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."CD_OPERATION" IS '增量标识';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."CD_TIME" IS '变更时间';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."DMP_SHARE_CD_TIME_IDATAT" IS '运营方技术字段,非业务字段,请忽略并勿使用';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."ID" IS '标识ID';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."OPT_AREA_CODE" IS '数据所属单位区划';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."OPT_DEPT_ID" IS '数据所属单位部门ID';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."OPT_DEPT_NAME" IS '数据所属单位部门名称';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."OPT_FIELD_CODE" IS '数据所属单位领域';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."OPT_SUBJECT_ID" IS '数据所属单位主体ID';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."OPT_SUBJECT_NAME" IS '数据所属单位主体名称';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201000" IS '主键ID';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201001" IS '执法部门名称';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201002" IS '统一社会信用代码';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201003" IS '执法部门简称';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201004" IS '法定代表人名称';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201005" IS '邮政编码';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201006" IS '传真';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201007" IS '联系电话';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201008" IS '电子邮箱';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201009" IS '地址';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201010" IS '执法部门性质';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201011" IS '层级';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201012" IS '所属领域';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201013" IS '执法部门行政区划';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201014" IS '成立日期';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201015" IS '垂管情况';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201016" IS '垂管层级';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201017" IS '垂管部门';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201018" IS '是否公开';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201019" IS '数据编目挂接单位名称';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201020" IS '数据编目挂接单位统一社会信用代码';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z201021" IS '数据编目挂接单位行政区划';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2010"."Z301000" IS '监督部门ID';
CREATE TABLE "CXAICORG"."GDSZTK_Z2020"
(
"ID" INT NOT NULL,
"Z202000" VARCHAR(100),
"Z201000" VARCHAR(100),
"Z202001" VARCHAR(400),
"Z202002" VARCHAR(36),
"Z202003" VARCHAR(100),
"Z202004" VARCHAR(4),
"Z202005" VARCHAR(200),
"Z202006" VARCHAR(12),
"Z202007" VARCHAR(100),
"Z202008" VARCHAR(100),
"Z202009" VARCHAR(200),
"Z202010" VARCHAR(400),
"Z202011" VARCHAR(4),
"Z202012" VARCHAR(1000),
"Z202013" VARCHAR(18),
"Z202014" INT,
"Z202015" CLOB,
"Z202016" INT,
"Z202017" VARCHAR(400),
"Z202018" VARCHAR(40),
"Z202019" VARCHAR(18),
"ADD_TIME" TIMESTAMP(0),
"CD_TIME" TIMESTAMP(0),
"CD_OPERATION" VARCHAR(2),
"CD_BATCH" VARCHAR(100),
"OPT_AREA_CODE" VARCHAR(40),
"OPT_FIELD_CODE" VARCHAR(40),
"OPT_SUBJECT_ID" VARCHAR(72),
"OPT_SUBJECT_NAME" VARCHAR(100),
"OPT_DEPT_ID" VARCHAR(72),
"OPT_DEPT_NAME" VARCHAR(100),
"DMP_SHARE_CD_TIME_IDATAT" TIMESTAMP(0),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."ADD_TIME" IS '创建时间';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."CD_BATCH" IS '批次号';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."CD_OPERATION" IS '增量标识';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."CD_TIME" IS '变更时间';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."DMP_SHARE_CD_TIME_IDATAT" IS '运营方技术字段,非业务字段,请忽略并勿使用';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."ID" IS '标识ID';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."OPT_AREA_CODE" IS '数据所属单位区划';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."OPT_DEPT_ID" IS '数据所属单位部门ID';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."OPT_DEPT_NAME" IS '数据所属单位部门名称';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."OPT_FIELD_CODE" IS '数据所属单位领域';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."OPT_SUBJECT_ID" IS '数据所属单位主体ID';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."OPT_SUBJECT_NAME" IS '数据所属单位主体名称';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z201000" IS '执法部门基本信息主键ID';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z202000" IS '主键ID';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z202001" IS '执法主体名称';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z202002" IS '统一社会信用代码';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z202003" IS '执法主体简称';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z202004" IS '主体类别';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z202005" IS '法定代表人名称';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z202006" IS '邮政编码';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z202007" IS '传真';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z202008" IS '联系电话';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z202009" IS '电子邮箱';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z202010" IS '地址';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z202011" IS '层级';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z202012" IS '所属领域';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z202013" IS '执法主体行政区划';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z202014" IS '编制人数';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z202015" IS '设定依据';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z202016" IS '是否公开';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z202017" IS '数据编目挂接单位名称';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z202018" IS '数据编目挂接单位统一社会信用代码';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2020"."Z202019" IS '数据编目挂接单位行政区划';
CREATE TABLE "CXAICORG"."GDSZTK_Z2030"
(
"ID" INT NOT NULL,
"Z203000" VARCHAR(100),
"Z202000" VARCHAR(100),
"Z203001" VARCHAR(4),
"Z203002" DATE,
"Z203003" DATE,
"Z203004" VARCHAR(400),
"Z203005" VARCHAR(4),
"Z203006" VARCHAR(36),
"Z203007" VARCHAR(200),
"Z203008" VARCHAR(12),
"Z203009" VARCHAR(100),
"Z203010" VARCHAR(100),
"Z203011" VARCHAR(200),
"Z203012" VARCHAR(400),
"Z203013" INT,
"Z203014" VARCHAR(400),
"Z203015" VARCHAR(40),
"Z203016" VARCHAR(18),
"ADD_TIME" TIMESTAMP(0),
"CD_TIME" TIMESTAMP(0),
"CD_OPERATION" VARCHAR(2),
"CD_BATCH" VARCHAR(100),
"OPT_AREA_CODE" VARCHAR(40),
"OPT_FIELD_CODE" VARCHAR(40),
"OPT_SUBJECT_ID" VARCHAR(72),
"OPT_SUBJECT_NAME" VARCHAR(100),
"OPT_DEPT_ID" VARCHAR(72),
"OPT_DEPT_NAME" VARCHAR(100),
"DMP_SHARE_CD_TIME_IDATAT" TIMESTAMP(0),
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."ADD_TIME" IS '创建时间';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."CD_BATCH" IS '批次号';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."CD_OPERATION" IS '增量标识';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."CD_TIME" IS '变更时间';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."DMP_SHARE_CD_TIME_IDATAT" IS '运营方技术字段,非业务字段,请忽略并勿使用';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."ID" IS '标识ID';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."OPT_AREA_CODE" IS '数据所属单位区划';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."OPT_DEPT_ID" IS '数据所属单位部门ID';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."OPT_DEPT_NAME" IS '数据所属单位部门名称';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."OPT_FIELD_CODE" IS '数据所属单位领域';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."OPT_SUBJECT_ID" IS '数据所属单位主体ID';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."OPT_SUBJECT_NAME" IS '数据所属单位主体名称';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."Z202000" IS '执法主体基本信息主键ID';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."Z203000" IS '主键ID';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."Z203001" IS '委托方式';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."Z203002" IS '受托起始日期';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."Z203003" IS '受托截止日期';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."Z203004" IS '受委托组织名称';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."Z203005" IS '受委托组织性质';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."Z203006" IS '统一社会信用代码';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."Z203007" IS '法定代表人';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."Z203008" IS '邮政编码';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."Z203009" IS '传真';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."Z203010" IS '联系电话';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."Z203011" IS '电子邮箱';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."Z203012" IS '地址';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."Z203013" IS '编制数';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."Z203014" IS '数据编目挂接单位名称';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."Z203015" IS '数据编目挂接单位统一社会信用代码';
COMMENT ON COLUMN "CXAICORG"."GDSZTK_Z2030"."Z203016" IS '数据编目挂接单位行政区划';
CREATE TABLE "CXAICORG"."GZ_ORG_NEW"
(
"SREGORGCODE" VARCHAR(30) NOT NULL,
"SREGORGNAME" VARCHAR(100),
"SPARENTCODE" VARCHAR(30),
"BEND" VARCHAR(1),
"SLEVEL" VARCHAR(1),
"SCOUNTRYCODE" VARCHAR(20),
"SCOUNTRYEXTCODE" VARCHAR(20),
"NINDEX" DECIMAL(5,0),
"BSTOP" VARCHAR(1) NOT NULL,
"SHORTNAME" VARCHAR(20),
"ORGUNITID" VARCHAR(72)) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "CXAICORG"."GZ_ORG_NEW"."ORGUNITID" IS '本地组织架构单位ID';
CREATE TABLE "CXAICORG"."oauth_access_token"
(
"token_id" VARCHAR(64) NOT NULL,
"access_token" VARCHAR(500),
"refresh_token" VARCHAR(500),
"client_id" VARCHAR(64),
"user_id" VARCHAR(64),
"user_name" VARCHAR(100),
"scope" VARCHAR(255),
"grant_type" VARCHAR(50),
"expires_in" DATETIME(6),
"refresh_expires_in" DATETIME(6),
"is_active" VARCHAR(1) DEFAULT '1',
"create_time" DATETIME(6),
"update_time" DATETIME(6),
NOT CLUSTER PRIMARY KEY("token_id")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "CXAICORG"."oauth_access_token" IS 'OAuth访问令牌表';
COMMENT ON COLUMN "CXAICORG"."oauth_access_token"."access_token" IS '访问令牌';
COMMENT ON COLUMN "CXAICORG"."oauth_access_token"."client_id" IS '客户端ID';
COMMENT ON COLUMN "CXAICORG"."oauth_access_token"."create_time" IS '创建时间';
COMMENT ON COLUMN "CXAICORG"."oauth_access_token"."expires_in" IS '令牌过期时间';
COMMENT ON COLUMN "CXAICORG"."oauth_access_token"."grant_type" IS '授权类型';
COMMENT ON COLUMN "CXAICORG"."oauth_access_token"."is_active" IS '是否有效0否1是';
COMMENT ON COLUMN "CXAICORG"."oauth_access_token"."refresh_expires_in" IS '刷新令牌过期时间';
COMMENT ON COLUMN "CXAICORG"."oauth_access_token"."refresh_token" IS '刷新令牌';
COMMENT ON COLUMN "CXAICORG"."oauth_access_token"."scope" IS '授权范围';
COMMENT ON COLUMN "CXAICORG"."oauth_access_token"."token_id" IS '访问令牌ID';
COMMENT ON COLUMN "CXAICORG"."oauth_access_token"."update_time" IS '更新时间';
COMMENT ON COLUMN "CXAICORG"."oauth_access_token"."user_id" IS '用户ID';
COMMENT ON COLUMN "CXAICORG"."oauth_access_token"."user_name" IS '用户名';
CREATE OR REPLACE INDEX "CXAICORG"."idx_oauth_access_token_refresh_token" ON "CXAICORG"."oauth_access_token"("refresh_token" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE OR REPLACE INDEX "CXAICORG"."idx_oauth_access_token_user_id" ON "CXAICORG"."oauth_access_token"("user_id" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE OR REPLACE INDEX "CXAICORG"."idx_oauth_access_token_client_id" ON "CXAICORG"."oauth_access_token"("client_id" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE OR REPLACE INDEX "CXAICORG"."idx_oauth_access_token_expires_in" ON "CXAICORG"."oauth_access_token"("expires_in" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE OR REPLACE INDEX "CXAICORG"."idx_oauth_access_token_is_active" ON "CXAICORG"."oauth_access_token"("is_active" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE OR REPLACE INDEX "CXAICORG"."idx_oauth_access_token_access_token" ON "CXAICORG"."oauth_access_token"("access_token" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."oauth_authorization_code"
(
"code_id" VARCHAR(64) NOT NULL,
"authorization_code" VARCHAR(255),
"client_id" VARCHAR(64),
"user_id" VARCHAR(64),
"user_name" VARCHAR(100),
"scope" VARCHAR(255),
"redirect_uri" VARCHAR(500),
"state" VARCHAR(100),
"grant_type" VARCHAR(50),
"expires_at" DATETIME(6),
"is_used" VARCHAR(1) DEFAULT '0',
"is_active" VARCHAR(1) DEFAULT '1',
"create_time" DATETIME(6),
"update_time" DATETIME(6),
NOT CLUSTER PRIMARY KEY("code_id")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "CXAICORG"."oauth_authorization_code" IS 'OAuth授权码表';
COMMENT ON COLUMN "CXAICORG"."oauth_authorization_code"."authorization_code" IS '授权码';
COMMENT ON COLUMN "CXAICORG"."oauth_authorization_code"."client_id" IS '客户端ID';
COMMENT ON COLUMN "CXAICORG"."oauth_authorization_code"."code_id" IS '授权码ID';
COMMENT ON COLUMN "CXAICORG"."oauth_authorization_code"."create_time" IS '创建时间';
COMMENT ON COLUMN "CXAICORG"."oauth_authorization_code"."expires_at" IS '过期时间';
COMMENT ON COLUMN "CXAICORG"."oauth_authorization_code"."grant_type" IS '授权类型';
COMMENT ON COLUMN "CXAICORG"."oauth_authorization_code"."is_active" IS '是否有效0否1是';
COMMENT ON COLUMN "CXAICORG"."oauth_authorization_code"."is_used" IS '是否已使用0否1是';
COMMENT ON COLUMN "CXAICORG"."oauth_authorization_code"."redirect_uri" IS '重定向URI';
COMMENT ON COLUMN "CXAICORG"."oauth_authorization_code"."scope" IS '授权范围';
COMMENT ON COLUMN "CXAICORG"."oauth_authorization_code"."state" IS '状态参数';
COMMENT ON COLUMN "CXAICORG"."oauth_authorization_code"."update_time" IS '更新时间';
COMMENT ON COLUMN "CXAICORG"."oauth_authorization_code"."user_id" IS '用户ID';
COMMENT ON COLUMN "CXAICORG"."oauth_authorization_code"."user_name" IS '用户名';
CREATE OR REPLACE INDEX "CXAICORG"."idx_oauth_auth_code_expires_at" ON "CXAICORG"."oauth_authorization_code"("expires_at" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE OR REPLACE INDEX "CXAICORG"."idx_oauth_auth_code_is_active" ON "CXAICORG"."oauth_authorization_code"("is_active" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE OR REPLACE INDEX "CXAICORG"."idx_oauth_auth_code_is_used" ON "CXAICORG"."oauth_authorization_code"("is_used" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE OR REPLACE INDEX "CXAICORG"."idx_oauth_auth_code_client_id" ON "CXAICORG"."oauth_authorization_code"("client_id" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE OR REPLACE INDEX "CXAICORG"."idx_oauth_auth_code_user_id" ON "CXAICORG"."oauth_authorization_code"("user_id" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE OR REPLACE INDEX "CXAICORG"."idx_oauth_auth_code_auth_code" ON "CXAICORG"."oauth_authorization_code"("authorization_code" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."oauth_client"
(
"client_id" VARCHAR(64) NOT NULL,
"client_secret" VARCHAR(255),
"client_name" VARCHAR(100),
"is_active" VARCHAR(1) DEFAULT '1',
"create_by" VARCHAR(64),
"create_time" DATETIME(6),
"update_by" VARCHAR(64),
"update_time" DATETIME(6),
NOT CLUSTER PRIMARY KEY("client_id")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "CXAICORG"."oauth_client" IS 'OAuth客户端表';
COMMENT ON COLUMN "CXAICORG"."oauth_client"."client_id" IS '客户端id';
COMMENT ON COLUMN "CXAICORG"."oauth_client"."client_name" IS '客户端名称';
COMMENT ON COLUMN "CXAICORG"."oauth_client"."client_secret" IS '客户端秘钥';
COMMENT ON COLUMN "CXAICORG"."oauth_client"."create_time" IS '创建时间';
COMMENT ON COLUMN "CXAICORG"."oauth_client"."is_active" IS '是否激活有效0否1是';
COMMENT ON COLUMN "CXAICORG"."oauth_client"."update_by" IS '更新人';
COMMENT ON COLUMN "CXAICORG"."oauth_client"."update_time" IS '更新时间';
CREATE OR REPLACE INDEX "CXAICORG"."idx_oauth_client_is_active" ON "CXAICORG"."oauth_client"("is_active" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE OR REPLACE INDEX "CXAICORG"."idx_oauth_client_create_time" ON "CXAICORG"."oauth_client"("create_time" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."ORG_AREAS"
(
"ORG_NUMBER" VARCHAR(100) NOT NULL,
"ORG_UNITNAME" VARCHAR(150),
"PARENT_ID" VARCHAR(100),
"ORG_LEVEL" VARCHAR(100),
"SSSSXQ" VARCHAR(100),
"SSXZJD" VARCHAR(100),
"SSSQCJ_DM" VARCHAR(2000),
"SSXZJD_CN" VARCHAR(200),
"SSSSXQ_CN" VARCHAR(200),
CONSTRAINT "ORG_AREAS_PK" CLUSTER PRIMARY KEY("ORG_NUMBER")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "CXAICORG"."ORG_AREAS" IS '属地机构所与镇街、社区关联表';
COMMENT ON COLUMN "CXAICORG"."ORG_AREAS"."ORG_NUMBER" IS '机构所的代码主键';
CREATE TABLE "CXAICORG"."SYS_MENU"
(
"SYSMENUID" VARCHAR(36) NOT NULL,
"SYSMENUTYPEID" VARCHAR(20),
"MENUTYPEID" VARCHAR(20),
"SYSMENUNAME" VARCHAR(200),
"SYSMENUFILED" VARCHAR(200),
"RESOURCEURL" VARCHAR(400),
"PARENTID" VARCHAR(36),
"REMARK" VARCHAR(1000),
"ORGLEVEL" INT,
"RESOURCETYPE" VARCHAR(1),
"SYSINDEX" INT,
NOT CLUSTER PRIMARY KEY("SYSMENUID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."SYS_MENUTYPE"
(
"MENUTYPEID" VARCHAR(36) NOT NULL,
"MENUTYPENAME" VARCHAR(200) NOT NULL,
"MENUSTATUS" INT NOT NULL,
NOT CLUSTER PRIMARY KEY("MENUTYPEID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_BASECODE"
(
"BASECODEID" VARCHAR(36) NOT NULL,
"CODEID" VARCHAR(20),
"CODE" VARCHAR(200),
"NAME" VARCHAR(1000),
"COMM" VARCHAR(510),
"ISGB" VARCHAR(1),
NOT CLUSTER PRIMARY KEY("BASECODEID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_BASESTATUS"
(
"BASESTATUSID" VARCHAR(20) NOT NULL,
"BASEENAME" VARCHAR(40) NOT NULL,
"BASENAME" VARCHAR(100),
"STATUSNUMBER" INT,
"PARENTNAME" VARCHAR(40),
NOT CLUSTER PRIMARY KEY("BASESTATUSID", "BASEENAME")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_LOGLIST"
(
"LOGID" VARCHAR(36) NOT NULL,
"OPERATIONID" VARCHAR(36),
"OPERATIONTYPE" VARCHAR(1),
"OPERATIONINFO" VARCHAR(1000),
"PROCESSTYPE" VARCHAR(1),
"PROCESSID" VARCHAR(36),
"OPERATIONTIME" TIMESTAMP(0)) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_MANAGERMENU"
(
"MANAGERMENUID" VARCHAR(36) NOT NULL,
"MANAGERID" VARCHAR(20),
"SYSMENUID" VARCHAR(36),
NOT CLUSTER PRIMARY KEY("MANAGERMENUID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_OPERATION_LOG"
(
"LOG_ID" VARCHAR(72) NOT NULL,
"POSITION_CODE" VARCHAR(20) NOT NULL,
"POSITION_NAME" VARCHAR(200) NOT NULL,
"OPERATE_TYPE" VARCHAR(1) DEFAULT '0' NOT NULL,
"PARAMS_JSON" TEXT NOT NULL,
"CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() NOT NULL,
"OPERATOR" VARCHAR(72) NOT NULL,
"OPERATOR_IP" VARCHAR(30),
"INCOME_LETTER_ID" VARCHAR(72),
NOT CLUSTER PRIMARY KEY("LOG_ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "CXAICORG"."T_OPERATION_LOG" IS '操作日志表';
COMMENT ON COLUMN "CXAICORG"."T_OPERATION_LOG"."CREATE_TIME" IS '搜索时间';
COMMENT ON COLUMN "CXAICORG"."T_OPERATION_LOG"."INCOME_LETTER_ID" IS '来函id';
COMMENT ON COLUMN "CXAICORG"."T_OPERATION_LOG"."LOG_ID" IS '日志id';
COMMENT ON COLUMN "CXAICORG"."T_OPERATION_LOG"."OPERATE_TYPE" IS '操作类型0查询1插入/修改2删除';
COMMENT ON COLUMN "CXAICORG"."T_OPERATION_LOG"."OPERATOR" IS '操作人id';
COMMENT ON COLUMN "CXAICORG"."T_OPERATION_LOG"."OPERATOR_IP" IS '操作人ip';
COMMENT ON COLUMN "CXAICORG"."T_OPERATION_LOG"."PARAMS_JSON" IS '操作参数json';
COMMENT ON COLUMN "CXAICORG"."T_OPERATION_LOG"."POSITION_CODE" IS '操作位置编码';
COMMENT ON COLUMN "CXAICORG"."T_OPERATION_LOG"."POSITION_NAME" IS '操作位置名称';
CREATE OR REPLACE INDEX "CXAICORG"."T_OPERATION_LOG_INCOME_LETTER_ID_IDX" ON "CXAICORG"."T_OPERATION_LOG"("INCOME_LETTER_ID" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE OR REPLACE INDEX "CXAICORG"."T_OPERATION_LOG_OPERATOR_ID_IDX" ON "CXAICORG"."T_OPERATION_LOG"("OPERATOR" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE OR REPLACE INDEX "CXAICORG"."T_OPERATION_LOG_POSITION_CODE_IDX" ON "CXAICORG"."T_OPERATION_LOG"("POSITION_CODE" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE OR REPLACE INDEX "CXAICORG"."T_OPERATION_LOG_OPERATE_TYPE_IDX" ON "CXAICORG"."T_OPERATION_LOG"("OPERATE_TYPE" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_ORGGROUP"
(
"ORGGROUPID" VARCHAR(36) NOT NULL,
"ORGGROUPNAME" VARCHAR(200),
"ORGNUMBER" VARCHAR(40),
"ORGGROUPTYPEID" VARCHAR(36),
"ORGUNITID" VARCHAR(36),
"REMARK" VARCHAR(1000),
NOT CLUSTER PRIMARY KEY("ORGGROUPID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_ORGGROUPTYPE"
(
"ORGGROUPTYPEID" VARCHAR(36) NOT NULL,
"ORGGROUPNAME" VARCHAR(200),
NOT CLUSTER PRIMARY KEY("ORGGROUPTYPEID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_ORGGROUPUSER"
(
"ORGGROUPUSERID" VARCHAR(36) NOT NULL,
"USERID" VARCHAR(36),
"ORGGROUPID" VARCHAR(36),
NOT CLUSTER PRIMARY KEY("ORGGROUPUSERID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_ORGJOBS"
(
"ORGJOBSID" VARCHAR(36) NOT NULL,
"JOBNAME" VARCHAR(200) NOT NULL,
"REMARK" VARCHAR(1000) NOT NULL,
NOT CLUSTER PRIMARY KEY("ORGJOBSID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_ORGNODESAPP"
(
"ORGUNITID" VARCHAR(36) NOT NULL,
"PHONENUMBER" VARCHAR(160),
"FAXNUMBER" VARCHAR(160),
"COUNTRY" VARCHAR(100),
"REGION" VARCHAR(100),
"PROVINCE" VARCHAR(100),
"CITY" VARCHAR(100),
"ADDRESS" VARCHAR(510),
"SHORTNAME" VARCHAR(40),
"SHORTOA" VARCHAR(40),
"ORGUNITNO" VARCHAR(100),
"POSTCODE" VARCHAR(6),
"REMARK" VARCHAR(1000),
"ORGUNITTYPE" VARCHAR(400),
"LOCDISTRICT" VARCHAR(40),
NOT CLUSTER PRIMARY KEY("ORGUNITID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_ORGUNITPOS"
(
"ORGUNITPOSID" VARCHAR(36) NOT NULL,
"ORGUNITNAME" VARCHAR(200),
"ORGDEPTID" VARCHAR(36),
"ORGUNITID" VARCHAR(36),
"ORGUNITPOSNO" VARCHAR(40),
NOT CLUSTER PRIMARY KEY("ORGUNITPOSID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_ORGUNITS"
(
"ORGUNITID" VARCHAR(36) NOT NULL,
"ORGUNITNAME" VARCHAR(200),
"DELETED" VARCHAR(1),
"ORGNUMBER" VARCHAR(40),
"PARENTID" VARCHAR(36),
"UNITTYPE" VARCHAR(1),
"ORGLEVEL" INT,
NOT CLUSTER PRIMARY KEY("ORGUNITID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_PARENTORGAPP"
(
"ORGAPPID" VARCHAR(36) NOT NULL,
"ORGUNITID" VARCHAR(36) NOT NULL,
"PARENTORGAPPID" VARCHAR(36) NOT NULL,
"ORGNUMBER" VARCHAR(40),
"ORGUNITNAME" VARCHAR(200),
NOT CLUSTER PRIMARY KEY("ORGAPPID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_PMACCOUNTUSERS"
(
"USERID" VARCHAR(36) NOT NULL,
"ACCOUNTID" VARCHAR(36),
"ACCREDITTARGET" INT,
NOT CLUSTER PRIMARY KEY("USERID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_POSMENU"
(
"POSMENUID" VARCHAR(36) NOT NULL,
"ORGUNITPOSID" VARCHAR(36),
"SYSMENUID" VARCHAR(36),
NOT CLUSTER PRIMARY KEY("POSMENUID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_POSUSERRELATE"
(
"POSUSERRELATEID" VARCHAR(36) NOT NULL,
"ORGUNITPOSID" VARCHAR(36),
"USERID" VARCHAR(36),
"POSTYPE" VARCHAR(1),
NOT CLUSTER PRIMARY KEY("POSUSERRELATEID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_ROLE"
(
"ROLEID" VARCHAR(36) NOT NULL,
"ROLENAME" VARCHAR(200),
"PARENTID" VARCHAR(36),
"REMARK" VARCHAR(1000),
NOT CLUSTER PRIMARY KEY("ROLEID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_ROLEMENU"
(
"ROLEMENUID" VARCHAR(36) NOT NULL,
"ROLEID" VARCHAR(36),
"SYSMENUID" VARCHAR(36),
NOT CLUSTER PRIMARY KEY("ROLEMENUID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_USERMANAGER"
(
"USERMANAGERID" VARCHAR(36) NOT NULL,
"MANAGERID" VARCHAR(20),
"USERID" VARCHAR(36),
NOT CLUSTER PRIMARY KEY("USERMANAGERID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_USERMENU"
(
"USERMENUID" VARCHAR(36) NOT NULL,
"USERID" VARCHAR(36),
"SYSMENUID" VARCHAR(36),
"MENUSTATUS" VARCHAR(20),
"ALLOTSTATUS" VARCHAR(1),
NOT CLUSTER PRIMARY KEY("USERMENUID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE OR REPLACE INDEX "CXAICORG"."T_USERMENU_SYSMENUID_IDX" ON "CXAICORG"."T_USERMENU"("SYSMENUID" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE OR REPLACE INDEX "CXAICORG"."T_USERMENU_IDX" ON "CXAICORG"."T_USERMENU"("USERID" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_USERPORTAL"
(
"ID" VARCHAR(96) NOT NULL,
"ORGID" VARCHAR(96),
"USERNAME" VARCHAR(765),
"REALNAME" VARCHAR(765),
"AVATAR" VARCHAR(765),
"BIRTHDAY" TIMESTAMP(0),
"GENDER" VARCHAR(765),
"EMAIL" VARCHAR(765),
"IDCARD" VARCHAR(765),
"PHONE" VARCHAR(765),
"STATUS" VARCHAR(765),
"DELFLAG" VARCHAR(765),
"CREATEBY" VARCHAR(765),
"CREATETIME" TIMESTAMP(0),
"UPDATEBY" VARCHAR(765),
"UPDATETIME" TIMESTAMP(0),
"LOCALUSERID" VARCHAR(765),
CONSTRAINT "T_USERPORTAL_PK" NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "CXAICORG"."T_USERPORTAL"."AVATAR" IS '头像';
COMMENT ON COLUMN "CXAICORG"."T_USERPORTAL"."BIRTHDAY" IS '生日';
COMMENT ON COLUMN "CXAICORG"."T_USERPORTAL"."CREATEBY" IS '创建人';
COMMENT ON COLUMN "CXAICORG"."T_USERPORTAL"."CREATETIME" IS '创建时间';
COMMENT ON COLUMN "CXAICORG"."T_USERPORTAL"."DELFLAG" IS '删除状态0正常1已删除';
COMMENT ON COLUMN "CXAICORG"."T_USERPORTAL"."EMAIL" IS '电子邮件';
COMMENT ON COLUMN "CXAICORG"."T_USERPORTAL"."GENDER" IS '性别1男 2';
COMMENT ON COLUMN "CXAICORG"."T_USERPORTAL"."IDCARD" IS '身份证号码';
COMMENT ON COLUMN "CXAICORG"."T_USERPORTAL"."LOCALUSERID" IS '对应信用监管本地组织架构userId';
COMMENT ON COLUMN "CXAICORG"."T_USERPORTAL"."ORGID" IS '组织机构ID';
COMMENT ON COLUMN "CXAICORG"."T_USERPORTAL"."PHONE" IS '电话';
COMMENT ON COLUMN "CXAICORG"."T_USERPORTAL"."REALNAME" IS '真实姓名';
COMMENT ON COLUMN "CXAICORG"."T_USERPORTAL"."STATUS" IS '状态(1启用 0停用 )';
COMMENT ON COLUMN "CXAICORG"."T_USERPORTAL"."UPDATEBY" IS '修改人';
COMMENT ON COLUMN "CXAICORG"."T_USERPORTAL"."UPDATETIME" IS '修改时间';
COMMENT ON COLUMN "CXAICORG"."T_USERPORTAL"."USERNAME" IS '用户账号';
CREATE TABLE "CXAICORG"."T_USERROLE"
(
"USERROLEID" VARCHAR(36) NOT NULL,
"ROLEID" VARCHAR(36),
"USERID" VARCHAR(36),
NOT CLUSTER PRIMARY KEY("USERROLEID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_USERS"
(
"USERID" VARCHAR(36) NOT NULL,
"USERNAME" VARCHAR(200),
"PASSWORD" VARCHAR(200),
"REALNAME" VARCHAR(200),
"LOCKED" VARCHAR(1),
"DELETED" VARCHAR(1),
"ORGDEPTID" VARCHAR(36),
"ORGUNITID" VARCHAR(36),
"ORGJOBID" VARCHAR(20),
"USERPROP" INT,
"USERSTATUS" VARCHAR(1),
"GRADENUM" INT,
"CUSTOMINDEX" INT,
"LIMITTNUM" INT DEFAULT 0,
"LASTERRORTIME" TIMESTAMP(0),
NOT CLUSTER PRIMARY KEY("USERID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE OR REPLACE INDEX "CXAICORG"."T_USERS_ORGDEPTID_IDX" ON "CXAICORG"."T_USERS"("ORGDEPTID" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE OR REPLACE INDEX "CXAICORG"."T_USERS_ORGUNITID_IDX" ON "CXAICORG"."T_USERS"("ORGUNITID" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_USERSAPP"
(
"USERID" VARCHAR(36) NOT NULL,
"GENDER" VARCHAR(1),
"PHONENUMBER" VARCHAR(160),
"MOBILE" VARCHAR(160),
"EMAIL" VARCHAR(200),
"ADDRESS" VARCHAR(160),
"WORKNO" VARCHAR(40),
"WORKTYPE" VARCHAR(1),
"BIRTHDAY" DATE,
"HIREDATE" DATE,
"LEAVEDATE" DATE,
"IDENTITYNO" VARCHAR(72),
"REMARK" VARCHAR(1000),
NOT CLUSTER PRIMARY KEY("USERID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE TABLE "CXAICORG"."T_USERSUPERROLE"
(
"SUPERROLEID" VARCHAR(36) NOT NULL,
"USERID" VARCHAR(36) NOT NULL,
"ROLEID" VARCHAR(36) NOT NULL,
NOT CLUSTER PRIMARY KEY("SUPERROLEID")) STORAGE(ON "MAIN", CLUSTERBTR) ;